Heroku应用部署后异常:空白页及Unexpected token <错误求助
这个问题我在帮别人排查部署问题时碰到过好多次,Uncaught SyntaxError: Unexpected token < 是前端加载资源时的典型报错——本质是你的JS文件(比如这里的main.ac26b187.js)实际返回的不是预期的JS代码,而是HTML内容(通常是404页面或者首页的HTML),浏览器一碰到HTML开头的<自然就解析失败了。结合Heroku部署的场景,大概率是静态资源路径或服务器配置出了问题,下面给你一步步的排查和解决方法:
1. 检查SPA框架的静态资源路径配置
如果你用的是React、Vue这类单页应用框架,首先要确认基础路径配置是否正确:
- React项目:在
package.json里添加"homepage": "."(或者如果是自定义域名,就填写对应路径)。这个配置会告诉build工具生成的静态资源使用相对路径,避免在Heroku上因为绝对路径找不到资源。 - Vue项目:在
vue.config.js里设置:
确保生产环境下静态资源用相对路径加载。module.exports = { publicPath: process.env.NODE_ENV === 'production' ? './' : '/' }
2. 确认Heroku的Build命令正确
检查你的package.json里的scripts字段,确保有正确的build命令:
- React:
"build": "react-scripts build" - Vue:
"build": "vue-cli-service build"
Heroku会自动检测并执行npm run build(只要你用的是官方脚手架生成的项目),但要确认build之后生成的build(React)或dist(Vue)文件夹是正确生成的,Heroku能识别这个文件夹作为静态资源目录。
3. 查看完整的Heroku运行日志
你提供的日志只有部署记录,没有关键的请求日志。打开终端执行:
heroku logs --tail
然后刷新你的应用页面,观察日志里关于main.ac26b187.js的请求记录:
- 如果返回404状态码:说明资源路径配置错误,找不到这个JS文件;
- 如果返回200状态码但内容是HTML:说明服务器把所有请求都重定向到了
index.html(SPA路由的常见配置),但静态资源请求应该直接返回对应文件,这时候是服务器路由顺序错了。
4. 修正自定义服务器的路由配置
如果你用Express这类自定义服务器托管SPA,一定要确保静态资源托管的代码放在SPA fallback路由之前:
const express = require('express'); const path = require('path'); const app = express(); // 先托管静态资源,优先级高于SPA路由 app.use(express.static(path.join(__dirname, 'build'))); // 再处理SPA的路由 fallback,所有非API请求返回index.html app.get('/*', function (req, res) { res.sendFile(path.join(__dirname, 'build', 'index.html')); }); const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server running on port ${port}`); });
如果把fallback路由放在前面,所有请求(包括JS/CSS)都会返回index.html,就会触发你遇到的语法错误。
5. 本地验证Build后的效果
先在本地执行npm run build,然后用serve工具启动静态服务器测试:
# 安装serve(如果没装过) npm install -g serve # 启动服务器,指定build/dist文件夹 serve -s build # React项目 # 或者 serve -s dist # Vue项目
如果本地访问也出现同样的空白页和报错,那问题出在代码配置上,和Heroku无关,先在本地解决再重新部署。
按照上面的步骤排查,应该能解决这个问题。如果还是卡壳,可以把完整的Heroku运行日志、你的package.json和框架配置文件贴出来,我再帮你细化分析。
内容的提问来源于stack exchange,提问作者Sahand




