如何在Heroku上安装包含Electron的Nightmare.js?
我之前也折腾过在Heroku上部署带Electron的Nightmare.js,踩了不少坑,给你整理几个关键步骤,应该能解决你的问题:
1. 先配置Heroku的Electron专属Buildpack
Heroku默认的Node.js环境缺少Electron运行需要的系统依赖,所以得先添加专门的Buildpack:
- 命令行操作:
heroku buildpacks:add https://github.com/jontewks/puppeteer-heroku-buildpack.git - 或者在Heroku后台操作:打开你的应用→Settings→Buildpacks,手动添加这个Buildpack,注意要把它放在Node.js Buildpack的前面(如果已经配置了Node的Buildpack的话)
2. 调整package.json的依赖与启动配置
- 选一个和Electron兼容的Nightmare版本,推荐
^3.0.2(这个版本的适配性比较稳定),在package.json里写:"dependencies": { "nightmare": "^3.0.2", "electron": "^11.5.0" // 也可以指定和Nightmare匹配的Electron版本,避免自动安装不兼容的版本 } - 添加
postinstall脚本,强制Electron安装Heroku兼容的Linux版本:"scripts": { "postinstall": "electron install --platform=linux --arch=x64", "start": "node your-app.js" // 替换成你的应用启动脚本 } - 启动Nightmare时必须开启无头模式,并加上Heroku需要的配置:
const Nightmare = require('nightmare'); const nightmare = Nightmare({ show: false, // 无头模式,Heroku没有图形界面 electronPath: require('electron'), switches: { 'no-sandbox': true, // 关键!Heroku环境必须关闭沙箱才能运行Electron 'disable-gpu': true, // 避免GPU相关的报错 'ignore-certificate-errors': true // 可选,如果你爬的网站有证书问题 } });
3. 设置必要的环境变量
在Heroku后台的Settings→Config Vars里添加两个环境变量:
ELECTRON_CACHE:/tmp/electron-cache(让Electron把缓存存在临时目录,绕过Heroku的存储限制)ELECTRON_BUILDER_CACHE:/tmp/electron-builder-cache
4. 清理Heroku缓存(如果之前部署过)
有时候Heroku会缓存旧的node_modules,导致Electron没有正确安装,这时候可以手动清空缓存:
- 命令行运行:
heroku repo:purge_cache -a 你的应用名称 - 然后重新部署:
git commit --allow-empty -m "清空依赖缓存" && git push heroku main
常见问题排查
如果还是不行,先看Heroku的日志找问题:heroku logs --tail -a 你的应用名称,常见的坑包括:
- Node.js版本太高:建议用Node 14或16版本,太新的Node可能和Nightmare不兼容
- 权限问题:确保Electron的二进制文件有执行权限,Buildpack一般会处理,但如果还是报错,可以在postinstall里加
chmod +x node_modules/electron/dist/electron
内容的提问来源于stack exchange,提问作者Exsa_N
相关产品推荐
相关产品推荐

