
react router v6 项目构建部署后出现 `400` 加载 chunk 文件失败,根本原因是 webpack 打包时生成的静态资源路径(如 `/scenarioplanning/static/js/...`)被错误地相对于当前路由路径解析,而非应用根路径;需通过配置 `homepage` 字段和正确设置 `basename` 共同解决。
该问题并非代理配置(如 "proxy")所能解决——"proxy" 仅在开发阶段(npm start)生效,用于转发 API 请求,对生产构建(npm run build)后的静态资源路径完全无效。你截图中报错的 http://localhost:5000/scenarioplanning/static/js/251.400bc25d.chunk.js 明确表明:浏览器正尝试从子路径 /scenarioplanning/ 下加载 JS 资源,但实际资源位于 /static/ 目录(即站点根目录下),这是典型的 public URL 配置缺失导致。
✅ 正确解决方案:三步修复
1. 设置 homepage 字段(关键!)
在 package.json 的 顶层 添加:
{
"homepage": "."
}- "." 表示所有静态资源(JS/CSS/图片等)均以相对路径引入(如 ./static/js/main.x.js),确保无论应用部署在 /、/app/ 还是 /scenarioplanning/ 下,资源都能从当前 HTML 页面所在目录向上查找。
- 若部署到子路径(如 Nginx 配置为 location /myapp/),则设为 "myapp"(注意无开头斜杠);若部署到域名根目录,可设为 "/" 或省略(默认行为),但显式写 "." 更安全通用。
2. 修正 BrowserRouter 的 basename(按需调整)
你当前代码中
✅ 生产环境应移除 basename(除非你明确将整个 React 应用挂载在非根路径,如 /myapp/):
// ✅ 正确:生产环境默认使用根路径,无需 basename} /> } /> } />
⚠️ 注意:exact 属性在 v6 中已废弃,path="scenarioplanning" 本身即精确匹配,无需 exact。
3. 确保 PUBLIC_URL 在资源引用中生效
你在 Suspense 的 fallback 中使用了:
@@##@@
这是正确的模式——PUBLIC_URL 会自动注入 homepage 值(如 "." 或 "/myapp")。构建后,该路径将生成为 ./images/logo.png 或 /myapp/images/logo.png,与 homepage 严格一致。
? 验证步骤
- 修改 package.json,添加 "homepage": ".";
- 删除 BrowserRouter 的 basename 属性;
- 移除所有 exact 属性;
- 清理并重建:
npm run build npx serve -s build
- 访问 http://localhost:5000/scenarioplanning —— 此时 HTML 页面将从 /scenarioplanning 加载,但其中引用的 JS/CSS 路径为 ./static/js/xxx.js,浏览器自动解析为 http://localhost:5000/static/js/xxx.js,完美匹配真实资源位置。
? 补充说明
- serve -s build 默认将 build/ 目录作为 Web 根目录,因此所有静态文件必须可通过 /static/... 访问;
- 若使用 Nginx/Apache,请确保配置了正确的 root 和 try_files(如 Nginx 推荐配置:try_files $uri $uri/ /index.html;),避免路由跳转时返回 404;
- 永远不要依赖 "proxy" 解决生产资源路径问题——它只作用于开发服务器的请求代理。
遵循以上配置,即可彻底解决 React Router V6 构建后静态资源 404 的核心痛点,确保 SPA 在任意部署路径下稳定运行。










