Next.js项目部署到GitHub Pages问题整理

2023-12-02 11:10:40 浏览数 (1)

最近准备写一个小工具,域名和技术栈都看好了。用 Next.js 写,因为它基于 React,并且对 SEO 也有一定的可扩展性,下面是 Next.js 的一些特性:

  • 零配置:无需任何配置,即可自动编译并打包,从一开始就为生产环境而优化。
  • 混合模式:在一个项目中同时支持构建时预渲染页面(SSG)和请求时渲染页面(SSR)。
  • 增量静态生成:在构建之后以增量的方式添加并更新静态预渲染的页面。
  • 支持 TypeScript:自动配置并编译 TypeScript。
  • 快速刷新:快速、可靠的实时编辑体验,已在 Facebook 级别的应用上规模上得到验证。
  • 基于文件系统的路由:每个 pages 目录下的组件都是一条路由。
  • API 路由:创建 API 端点(可选)以提供后端功能。
  • 内置支持 CSS:使用 CSS 模块创建组件级的样式。内置对 Sass 的支持。
  • 代码拆分和打包:采用由 Google Chrome 小组创建的、并经过优化的打包和拆分算法。

项目的安装过程就不写了,可以在 Next.js 官方文档 查看相关教程。

Github Pages 的设置流程参考:Astro网站部署到GitHub Pages踩坑记录,都是一样的。

GitHub 还是很人性化的,将项目 push 上去,打开 GitHub Pages 页面,Source 选择 GitHub Actions ,就会自动检测到是 Next.js 项目,提示配置部署文件。

我试了一下,会自动在项目根目录创建 .github/workflows/nextjs.yml 文件,提交后就会自动开始部署。

默认的配置文件有些复杂,而且会构建失败,我再此基础上根据自己的需求做了简化修改。

期间遇到了两个问题:

  1. 我本地使用的是 pnpm build,构建的时候会报错找不到 pnpm 依赖,可以使用 npm 命令打包。
  2. Next.js 项目不能像 Astro 那样构建完了就部署,部署完了直接访问会报 404 错误。需要配置 output'export'

Next.js 配置 output

在配置文件 next.config.js 中添加配置代码,添加完是这样的:

代码语言:javascript复制
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export' // 这里是添加的配置代码
}

module.exports = nextConfig

部署配置

先简单介绍几个命令:

设置 Node 版本为 18:

代码语言:javascript复制
- name: Set Up Node.js
  uses: actions/setup-node@v3
  with:
    node-version: 18

安装依赖和编译项目:

代码语言:javascript复制
# 安装依赖
- name: Install dependencies
  run: npm i
# 编译
- name: Build with Next.js
  run: npm run build

最重要的一点,上传 build 的文件。(上面配置完后,编译完会在根目录生成一个 out 文件夹):

代码语言:javascript复制
- name: Upload artifact
  uses: actions/upload-pages-artifact@v2
  with:
    path: ./out

这样把文件打包在 out 目录,部署的时候拉取这里的文件,就不会出现 404 了。看看效果:https://finai.fun

下面是完整的配置文件,重要的地方我都有注释,可以作为参考:

代码语言:javascript复制
# 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: ["main"]

  # 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 设置 GitHub UB_TOKEN 的权限以允许部署到 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:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      # 设置 Node 和指定版本
      - name: Set Up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Setup Pages
        uses: actions/configure-pages@v3
        with:
          # Automatically inject basePath in your Next.js configuration file and disable 在 Next.js 配置文件中自动注入 basePath 并禁用
          # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). 服务器端镜像优化
          #
          # You may remove this line if you want to manage the configuration yourself. 如果您想自己管理配置,可以删除此行。
          static_site_generator: next
      - 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') }}-${{ 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') }}-
      # 安装依赖
      - name: Install dependencies
        run: npm i
      # 编译
      - name: Build with Next.js
        run: npm run build
      # 上传工作 Build 完的静态文件会存放在 out 文件夹,在 next.config.js 中配置 output: 'export'
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v2
        with:
          path: ./out

  # Deployment job 部署工作
  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v2

以上是我在 GitHub Pages 部署 Next.js 项目时遇到的问题和解决方法,如果对你有帮助,欢迎评论、转发。

未经允许不得转载:Web前端开发资源网 » Next.js项目部署到GitHub Pages问题整理

推荐阅读:

Vue.js学习笔记——条件、循环、双向绑定

用css实现文本溢出 超出部分隐藏显示省略号

Z-Blog后台无法安装、更新应用的解决方法

解决margin击穿的几种方法

Bootstrap 模态框(Modal)插件的基本应用

0 人点赞