问题原因:
Next.js 静态导出(next export
)生成的纯 SPA 应用在 Vercel 上刷新时,Vercel 的 Serverless 架构会尝试寻找对应的物理文件路径,若不存在则返回 404。
解决方案:
正确配置 vercel.json
在项目根目录创建文件:
{
"routes": [
{ "handle": "filesystem" },
{ "src": "/(.*)", "dest": "/index.html" }
]
}
"handle": "filesystem"
优先匹配真实存在的静态资源(CSS/JS/图片等)- 通配路由
/(.*)
将所有页面请求重定向到 index.html 检查 Next.js 配置
确保 next.config.js
已开启静态导出:
module.exports = {
output: 'export', // 关键配置
trailingSlash: true, // 可选:解决路径末尾斜杠问题
}
- 部署设置验证
在 Vercel 控制台检查: - 构建命令应为
next build && next export
- 输出目录应为
out
(默认生成目录) 添加自定义 404 页面(可选)
创建 pages/404.js
:
import { useRouter } from 'next/router'
export default function Custom404() {
const router = useRouter()
// 可根据需求添加自动重定向逻辑
return <h1>404 - {router.asPath} 不存在</h1>
}
常见问题排查:
- 确保没有使用
getServerSideProps
等 SSR 特性(与静态导出冲突) - 动态路由需要预先生成路径(通过
generateStaticParams
) - 部署后清除 Vercel 部署缓存重新构建
- 访问路径需保持与 Next.js 路由规则一致(区分大小写)
理论上 Vercel 上部署 SPA 已经非常成熟了,不应该有问题,你可以试着改一下预设方案。或者贴一下项目源码,否则不好判断。