当前位置: 首页 > news >正文

使用 gh-pages 将 next.js15 静态项目部署到 github pages

以下我使用 next.js15 写的 Todo List 为例,假设我们本地已经存在一个 next.js15 的 Todo List 项目。

说明:解决了项目部署到 github pages 后访问不到 css、js、字体以及访问不到 public 目录下的图片问题。

第一步

安装 gh-pages:

npm i gh-pages

第二步

public 目录下新建一个 .nojekyll 的空文件。 这个空文件的作用是让 github 不要忽略以下划线开头的文件或文件夹,因为项目打包后会生成一个 _next 文件夹,如果没有 .nojekyll 文件,github 会忽略掉打包生成的 _next 文件夹,会导致部署后访问不到 CSS、字体等资源。

第三步

next.config.ts 文件中添加以下配置。 因为我们要生成的是静态项目,所以要启用静态导出,这样在执行打包命令后,才能够得到一个 out 目录来进行部署到 github pages;因为我们的项目都是部署在自己 github 的一个子域下,所以 basePath 要设置为 github 项目名,由于我的 package.json 中 name 属性值与 github 上定义的项目名一致,所以这里我是直接从 package.json 中获取的。这里还通过 env 导出了一个环境变量,只是给页面中的 <Image /> 组件用的,因为官方提供的 <Image /> 组件在开发环境下可以直接通过相对路径访问到 public/ 目录下的图片,但是部署上去之后路径就不对了,所以这里提供一个环境变量,让 <Image /> 标签可以进行拼接使用。

import type { NextConfig } from 'next'import { name } from './package.json'// 基础路径
const NEXT_PUBLIC_BASE_PATH = process.env.NODE_ENV === 'production' ? `/${name}` : ''const nextConfig: NextConfig = {output: 'export', // 启用静态导出basePath: NEXT_PUBLIC_BASE_PATH,env: {NEXT_PUBLIC_BASE_PATH}
}export default nextConfig

第四步

进入 package.json 文件,在 "scripts" 中添加以下部署的脚本命令。 这里的 --dotfile 作用是让 ph-pages 部署时把我们刚刚创建的以点开头的文件 .nojekyll 也一并提交部署上去,不然它就会自动忽略掉这个问题,我们刚刚已经说了这个文件是有用的,要是不提交上去会导致部署事变。

  "scripts": {"deploy": "next build && gh-pages -d out --dotfiles"},

第五步

进入src/app/page.tsx,给 <Image /> 添加process.env.NEXT_PUBLIC_BASE_PATH基础路径。 这个步骤的作用是让图片资源在部署之后也可以正常访问到,否则就会出现开发环境能够访问,部署后访问不到图片的问题。

'use client'
import Image from 'next/image'
export default function Home() {return (<Image className='mr-1' src={`${process.env.NEXT_PUBLIC_BASE_PATH}/todo.svg`} alt='todo' width={25} height={25} />)
}

第六步

github 上创建一个react19-nextjs-todo-list仓库,并通过以下命令将提交代码到 github 上。 其中 xxx 是你自己的 github 账号名称。

git remote add origin https://github.com/xxx/react19-nextjs-todo-list.git
git branch -M main
git push -u origin main

第七步

执行部署命令,等待2分钟左右部署完成。

npm run deploy

在 github 的 Settings -> pages 中可以看到部署后的网站地址。
在这里插入图片描述
点击链接访问网站。
在这里插入图片描述

http://www.dtcms.com/a/293969.html

相关文章:

  • 重磅发布:Oracle ADG 一键自动化搭建脚本
  • OceanBase数据库
  • 如何在macOS上修改iPhone的定位
  • Qt 自定义控件开发方法与实践
  • cx_Freeze python 打包详解
  • Qt 数据QByteArray与QString处理与转换全指南
  • QT的moveToThread 用法
  • Java按模板导出Excel
  • LoRA 低秩矩阵实现参数高效的权重更新
  • 2025 ACT 汽车功能安全相关PPT分享
  • 《计算机网络》实验报告七 HTTP协议分析与测量
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题汇总版,持续更新学习,加油!!!
  • 场效应管和模电的关于、学习
  • 【盘古100Pro+开发板实验例程】FPGA | Modelsim 的使用和 do 文件编写
  • SpringBoot 使用Rabbitmq
  • rust嵌入式开发零基础入门教程(一)
  • FSHNet:高效目标检测新突破
  • rust嵌入式开发零基础入门教程(五)
  • Python应用指南:构建和获取全球地铁线路数据及可视化
  • HarmonyOS学习记录5
  • 【形态学变换】——图像预处理(OpenCV)
  • (nice!!!)(LeetCode 每日一题) 1717. 删除子字符串的最大得分 (贪心)
  • 昨天去看了电科金仓的发布会,有点东西!
  • AI营销核心技术解析:运作机制与行业应用实例
  • 【软件系统架构】系列七:嵌入式系统性能深入解析
  • 华为云中,列表中的镜像无法删除可能由多种原因导致
  • 华为云开发者空间 × DeepSeek-R1 智能融合测评:云端开发与AI客服的协同进化
  • WPF的一些基础知识学习记录
  • 设计模式 八:原型模式 (Prototype Pattern)
  • Spring Boot全局异常处理:一网打尽Controller层异常,@RestControllerAdvice解析