问题检查 & 解决方式
Next.js
静态导出 SSG
部署到GitHub Page
后,访问出现JavaScript
,CSS
无法正常加载。
在开发者工具network
面板中,对应的文件404
;
在浏览器中打开对应报错文件的地址,会出现Next.js
默认的404
页面;
.nojekyll 文件
首先检查:
GitHub Pages
部署的仓库根目录是否缺失.nojekyll
文件。
如果缺失,大部分是该问题导致,缺失该文件会导致_next
以下划线_
开头的目录被忽略,导致出错。
.nojekyll
是一个空文件,放在静态站点的根目录中,用来告诉 GitHub Pages
:
不要使用默认的 Jekyll 处理机制,尤其是不要忽略以下划线
_
开头的目录(例如Next.js
的_next/
静态资源目录)。
❌ https://username.github.io/repo-name/_next/static/xxx.js → 404
✅ 添加 .nojekyll 后可正常访问
basePath 和 assetPrefix 配置
其次检查:
检查:index.html
中引用的JavaScript
、CSS
路径,是否包含仓库名称子目录;
GitHub Pages
支持三种类型:项目页、用户页、组织页。 项目页通常托管在https://username.github.io/repo-name/
,因此资源路径需要包含仓库名称作为子目录。 例如:username.github.io/your-repository-name
,需要构建工具以及框架进行配置调整,否则,会导致资源路径不对,缺少子路径引起404。
对于 GitHub Pages
这类子路径部署,Next.js
的静态资源(如 JS
、CSS
)路径也必须修改,推荐如下:
Loading...
🔧 解释:
basePath
: 修改页面路由前缀(如/about
→/tailwindcss-typography-demo/about
)。assetPrefix
: 修改静态资源路径前缀,确保_next/
的加载路径正确。
✅ basePath
/ assetPrefix
配置效果对比表
场景 | 没有设置 basePath / assetPrefix | 正确设置后 |
---|---|---|
页面访问路径 | /about (默认) | /your-repo-name/about (带仓库名前缀) |
静态资源路径(JS/CSS) | _next/static/... ,将 404 | /your-repo-name/_next/static/... ,可正常加载 |
首页路径 | https://username.github.io/ 会显示 404 或空白 | https://username.github.io/your-repo-name/ 正常显示首页 |
点击跳转链接 | <a href="/page"> 指向错误路径 | <Link href="/page"> 会自动加上 basePath |
推荐配置 | 🚫 会出现路径缺失、资源无法加载的问题 | ✅ 推荐用于 GitHub Pages 的子路径部署 |
重新编译部署后。
最后:
检查所有的超链接,如果使用的是<a>
,替换成Next.js
的Link
组件,否则可能无法正确处理路径前缀,导致 404
。
import Link from "next/link"
原生 HTML
的 <a>
标签不会自动处理 basePath
,容易引发路径错误,建议统一使用 Next.js
提供的 Link
组件。
经过上述的检查,应该可以解决大部分出现的问题,如果仍存在错误,需要检查静态资源文件是否上传到仓库中。
推荐部署流程(gh-pages 自动化)
若之前是手动将out
目录部署到GitHub Pages
,建议采用自动化工具进行部署。
能自动将构建好的out
目录发布到gh-pages
分支。
该方式自动化程度高,也是社区里最常用的部署方式。
它会帮你把 out
目录的内容发布到一个专门用于 GitHub Pages
的 gh-pages
分支上,而不影响你的主分支。
- 安装
gh-pages
Loading...
- 修改
package.json
,在scripts
部分增加一个新的部署deploy
脚本。
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint",
"deploy": "next build && gh-pages -d out --nojekyll"
},
next build
:首先执行构建,确保out
目录是最新的;gh-pages -d out --nojekyll
:将out
目录中的内容部署到gh-pages
分支,同时确保生成.nojekyll
空文件,避免影响_next
等静态资源目录;
- 运行部署命令
pnpm run deploy
该命令会自动创建一个 gh-pages
分支(如果不存在的话),将 out
目录中的文件推送到这个分支,然后发布到 GitHub Pages
。
使用该自动化工具后,无需手动进入 GitHub
仓库的 Settings → Pages
页面配置,即可完成部署。
其他:为什么选择 GitHub Pages?
有些朋友可能会疑惑:“Next.js 本就是 Vercel 出品,难道不该部署在 Vercel 吗?”
确实,Vercel 是部署 Next.js 的首选平台,两者深度集成,支持 SSR、ISR、动态 API 路由等高级特性,部署体验极佳。但这也意味着它依赖 Vercel 提供的运行时资源,如 Node.js 环境。
然而在以下场景中,GitHub Pages 仍然是一个值得考虑的选择:
- 🔹 仅使用
Next.js
的静态导出(output: "export"
)功能,不依赖SSR
等运行时特性; - 🔹 构建的是教程
Demo
、项目文档、个人博客等纯前端内容; - 🔹 希望使用
GitHub
提供的免费静态托管资源,而不是占用Vercel
的Hobby
配额; - 🔹 项目已托管在
GitHub
,部署到Pages
流程更简单、可控; - 🔹 对流量、性能要求不高,更重视部署可维护性和公开透明性。
总之,GitHub Pages
是部署静态站点的轻量替代方案,尤其适合资源有限或纯前端展示类项目。
常见问题 FAQ
❓ .nojekyll
文件怎么生成?
.nojekyll
是一个空文件,用于防止 GitHub Pages
忽略 _next/
目录。可以手动创建,也可以通过部署命令自动生成:
方式一:命令行创建
touch out/.nojekyll
方式二:使用 gh-pages
工具自动添加
gh-pages -d out --nojekyll