upstream #1
55
.github/workflows/pages.yml
vendored
Normal file
55
.github/workflows/pages.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# Inspired from https://github.com/actions/starter-workflows/blob/main/pages/nextjs.yml
|
||||||
|
name: GitHub Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: main
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: 'pages'
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: yarn
|
||||||
|
- id: configurepages
|
||||||
|
uses: actions/configure-pages@v5
|
||||||
|
- name: Restore cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .next/cache
|
||||||
|
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-
|
||||||
|
- run: yarn
|
||||||
|
- run: yarn build
|
||||||
|
env:
|
||||||
|
EXPORT: 1
|
||||||
|
UNOPTIMIZED: 1
|
||||||
|
BASE_PATH: ${{ steps.configurepages.outputs.base_path }}
|
||||||
|
- uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: ./out
|
||||||
|
|
||||||
|
# Deployment job
|
||||||
|
deploy:
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build
|
||||||
|
steps:
|
||||||
|
- id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
40
README.md
40
README.md
@ -269,33 +269,49 @@ canonicalUrl: https://tailwind-nextjs-starter-blog.vercel.app/blog/introducing-t
|
|||||||
|
|
||||||
## Deploy
|
## Deploy
|
||||||
|
|
||||||
**Vercel**
|
### GitHub Pages
|
||||||
|
|
||||||
|
A [`pages.yml`](.github/workflows/pages.yml) workflow is already provided. Simply select "GitHub Actions" in: `Settings > Pages > Build and deployment > Source`.
|
||||||
|
|
||||||
|
### Vercel
|
||||||
|
|
||||||
The easiest way to deploy the template is to deploy on [Vercel](https://vercel.com). Check out the [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
The easiest way to deploy the template is to deploy on [Vercel](https://vercel.com). Check out the [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
||||||
|
|
||||||
**Netlify**
|
### Netlify
|
||||||
|
|
||||||
[Netlify](https://www.netlify.com/)’s Next.js runtime configures enables key Next.js functionality on your website without the need for additional configurations. Netlify generates serverless functions that will handle Next.js functionalities such as server-side rendered (SSR) pages, incremental static regeneration (ISR), `next/images`, etc.
|
[Netlify](https://www.netlify.com/)’s Next.js runtime configures enables key Next.js functionality on your website without the need for additional configurations. Netlify generates serverless functions that will handle Next.js functionalities such as server-side rendered (SSR) pages, incremental static regeneration (ISR), `next/images`, etc.
|
||||||
|
|
||||||
See [Next.js on Netlify](https://docs.netlify.com/integrations/frameworks/next-js/overview/#next-js-runtime) for suggested configuration values and more details.
|
See [Next.js on Netlify](https://docs.netlify.com/integrations/frameworks/next-js/overview/#next-js-runtime) for suggested configuration values and more details.
|
||||||
|
|
||||||
**Static hosting services / GitHub Pages / S3 / Firebase etc.**
|
### Static hosting services (GitHub Pages / S3 / Firebase etc.)
|
||||||
|
|
||||||
1. Add `output: 'export'` in `next.config.js`. See [static exports documentation](https://nextjs.org/docs/app/building-your-application/deploying/static-exports#configuration) for more information.
|
Run:
|
||||||
2. Comment out `headers()` from `next.config.js`.
|
|
||||||
3. Add `unoptimized: true` to the `images` key in `next.config.js`:
|
|
||||||
|
|
||||||
Alternatively, to continue using `next/image`, you can use an alternative image optimization provider such as Imgix, Cloudinary or Akamai. See [image optimization documentation](https://nextjs.org/docs/app/building-your-application/deploying/static-exports#image-optimization) for more details.
|
```sh
|
||||||
|
$ EXPORT=1 UNOPTIMIZED=1 yarn build
|
||||||
|
```
|
||||||
|
|
||||||
4. Remove `api` folder and components which call the server-side function such as the Newsletter component. Not technically required and the site will build successfully, but the APIs cannot be used as they are server-side functions.
|
Then, deploy the generated `out` folder or run `npx serve out` it locally.
|
||||||
5. Run `yarn build`. The generated static content is in the `out` folder.
|
|
||||||
6. Deploy the `out` folder to your hosting service of choice or run `npx serve out` to view the website locally.
|
|
||||||
|
|
||||||
**Note**: Deploying on Github pages require addition modifications to the base path. Please refer to the FAQ for more information.
|
> [!IMPORTANT]
|
||||||
|
> If deploying with a URL base path, like https://example.org/myblog you need an extra `BASE_PATH` shell-var to the build command:
|
||||||
|
>
|
||||||
|
> ```sh
|
||||||
|
> $ EXPORT=1 UNOPTIMIZED=1 BASE_PATH=/myblog yarn build
|
||||||
|
> ```
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> Alternatively to `UNOPTIMIZED=1`, to continue using `next/image`, you can use an alternative image optimization provider such as Imgix, Cloudinary or Akamai. See [image optimization documentation](https://nextjs.org/docs/app/building-your-application/deploying/static-exports#image-optimization) for more details.
|
||||||
|
|
||||||
|
Optionnally:
|
||||||
|
|
||||||
|
1. Comment out `headers()` from `next.config.js`.
|
||||||
|
2. Remove `api` folder and components which call the server-side function such as the Newsletter component. Not technically required and the site will build successfully, but the APIs cannot be used as they are server-side functions.
|
||||||
|
|
||||||
## Frequently Asked Questions
|
## Frequently Asked Questions
|
||||||
|
|
||||||
- [How can I add a custom MDX component?](/faq/custom-mdx-component.md)
|
- [How can I add a custom MDX component?](/faq/custom-mdx-component.md)
|
||||||
- [How can I customize the `kbar` search?](/faq/customize-kbar-search.md)
|
- [How can I customize the `kbar` search?](/faq/customize-kbar-search.md)
|
||||||
- [How do I deploy on Github pages?](/faq/github-pages-deployment.md)
|
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
import NextImage, { ImageProps } from 'next/image'
|
import NextImage, { ImageProps } from 'next/image'
|
||||||
|
|
||||||
const Image = ({ ...rest }: ImageProps) => <NextImage {...rest} />
|
const basePath = process.env.BASE_PATH
|
||||||
|
|
||||||
|
const Image = ({ src, ...rest }: ImageProps) => (
|
||||||
|
<NextImage src={`${basePath || ''}${src}`} {...rest} />
|
||||||
|
)
|
||||||
|
|
||||||
export default Image
|
export default Image
|
||||||
|
@ -1,108 +0,0 @@
|
|||||||
# How do I deploy on Github pages?
|
|
||||||
|
|
||||||
[Demo](https://timlrx.github.io/tailwind-nextjs-starter-blog/) & [Source](https://github.com/timlrx/tailwind-nextjs-starter-blog/tree/test-gh-pages-static)
|
|
||||||
|
|
||||||
1. Follow the section on creating a static build in the main README and test it locally to ensure that it works.
|
|
||||||
2. Specify the base path in `next.config.js` to match your repository name e.g. `basePath: "/tailwind-nextjs-starter-blog"`.
|
|
||||||
3. Modify `component/Image.tsx` to use the correct base path for the image source:
|
|
||||||
|
|
||||||
```tsx
|
|
||||||
import NextImage, { ImageProps } from 'next/image'
|
|
||||||
|
|
||||||
const Image = ({ src, ...rest }: ImageProps) => (
|
|
||||||
<NextImage src={`/tailwind-nextjs-starter-blog${src}`} {...rest} />
|
|
||||||
)
|
|
||||||
|
|
||||||
export default Image
|
|
||||||
```
|
|
||||||
|
|
||||||
4. To automate deployment, here's a Github action that you could use
|
|
||||||
|
|
||||||
```yml
|
|
||||||
# Sample workflow for building and deploying a Next.js site to GitHub Pages
|
|
||||||
#
|
|
||||||
# To get started with Next.js see: https://nextjs.org/docs/getting-started
|
|
||||||
#
|
|
||||||
name: Deploy Next.js site to Pages
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Runs on pushes targeting the default branch
|
|
||||||
push:
|
|
||||||
branches: ['test-gh-pages-static']
|
|
||||||
|
|
||||||
# Allows you to run this workflow manually from the Actions tab
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pages: write
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
|
||||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
|
||||||
concurrency:
|
|
||||||
group: 'pages'
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Build job
|
|
||||||
build:
|
|
||||||
name: Build Nextjs Blog
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Detect package manager
|
|
||||||
id: detect-package-manager
|
|
||||||
run: |
|
|
||||||
if [ -f "${{ github.workspace }}/yarn.lock" ]; then
|
|
||||||
echo "manager=yarn" >> $GITHUB_OUTPUT
|
|
||||||
echo "command=install" >> $GITHUB_OUTPUT
|
|
||||||
echo "runner=yarn" >> $GITHUB_OUTPUT
|
|
||||||
exit 0
|
|
||||||
elif [ -f "${{ github.workspace }}/package.json" ]; then
|
|
||||||
echo "manager=npm" >> $GITHUB_OUTPUT
|
|
||||||
echo "command=ci" >> $GITHUB_OUTPUT
|
|
||||||
echo "runner=npx --no-install" >> $GITHUB_OUTPUT
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "Unable to determine package manager"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: '18'
|
|
||||||
cache: ${{ steps.detect-package-manager.outputs.manager }}
|
|
||||||
- name: Restore cache
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
.next/cache
|
|
||||||
# Generate a new cache whenever packages or source files change.
|
|
||||||
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
|
|
||||||
# If source files changed but packages didn't, rebuild from a prior cache.
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-
|
|
||||||
- name: Install dependencies
|
|
||||||
run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
|
|
||||||
- name: Build project assets
|
|
||||||
run: ${{ steps.detect-package-manager.outputs.manager }} build
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-pages-artifact@v2
|
|
||||||
with:
|
|
||||||
path: ./out
|
|
||||||
|
|
||||||
# Deployment job
|
|
||||||
deploy:
|
|
||||||
environment:
|
|
||||||
name: github-pages
|
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- name: Deploy to GitHub Pages
|
|
||||||
id: deployment
|
|
||||||
uses: actions/deploy-pages@v2
|
|
||||||
```
|
|
@ -54,12 +54,18 @@ const securityHeaders = [
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const output = process.env.EXPORT ? 'export' : undefined
|
||||||
|
const basePath = process.env.BASE_PATH || undefined
|
||||||
|
const unoptimized = process.env.UNOPTIMIZED ? true : undefined
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {import('next/dist/next-server/server/config').NextConfig}
|
* @type {import('next/dist/next-server/server/config').NextConfig}
|
||||||
**/
|
**/
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
const plugins = [withContentlayer, withBundleAnalyzer]
|
const plugins = [withContentlayer, withBundleAnalyzer]
|
||||||
return plugins.reduce((acc, next) => next(acc), {
|
return plugins.reduce((acc, next) => next(acc), {
|
||||||
|
output,
|
||||||
|
basePath,
|
||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
|
pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
|
||||||
eslint: {
|
eslint: {
|
||||||
@ -72,6 +78,7 @@ module.exports = () => {
|
|||||||
hostname: 'picsum.photos',
|
hostname: 'picsum.photos',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
unoptimized,
|
||||||
},
|
},
|
||||||
async headers() {
|
async headers() {
|
||||||
return [
|
return [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user