MERN stack项目部署到Heroku后返回空白页,日志无报错如何解决?
问题原因
- 最核心的原因是路径大小写不匹配:Heroku 运行在大小写敏感的 Linux 系统上,你代码中对前端目录的引用大小写不一致:
- 静态资源加载中间件写的是
app.use(express.static('client/build')),使用小写开头的client - 发送 HTML 文件的路径写的是
path.resolve(__dirname, './Client', 'build', 'index.html'),使用大写开头的Client
结合你package.json中heroku-postbuild脚本是进入Client目录执行构建,说明你的前端文件夹实际名为大写的Client,所以静态资源中间件找不到小写client目录下的 JS、CSS 等资源,导致 HTML 可以正常返回,但没有资源渲染页面,最终出现空白。
- 静态资源加载中间件写的是
- 次要可能原因:你将静态资源中间件放在了生产环境判断之外,且未使用绝对路径匹配,生产环境下资源加载优先级错误,也会导致静态资源加载失败。
解决方法
- 统一所有前端目录的路径写法,和实际文件夹名保持一致,建议将静态资源中间件也移入生产环境判断内,使用绝对路径保证兼容性,修改后的服务端代码段如下:
if (process.env.NODE_ENV === 'production') { console.log("inside production00"); const path = require('path'); // 统一使用大写Client的绝对路径加载静态资源 app.use(express.static(path.resolve(__dirname, 'Client', 'build'))); app.get('*', (req, res) => { console.log("inside send file", __dirname); res.sendFile(path.resolve(__dirname, 'Client', 'build', 'index.html')) }); }
- 检查前端项目(Client目录下)的
package.json配置,删除错误的homepage字段,或者将其修改为你的Heroku应用域名,避免打包后的静态资源引用路径错误。 - 本地先执行
npm run heroku-postbuild验证构建流程正常,确认Client目录下会生成包含静态资源的build文件夹后再重新部署到Heroku。 - 部署后如果仍然空白,可以打开浏览器控制台查看报错,如果存在JS/CSS资源404的报错,再进一步核对路径配置即可。
内容的提问来源于stack exchange,提问作者NEWGIN SAM
相关产品推荐
相关产品推荐

