如何解决puppeteer代码使用pkg打包后exe运行立即闪退的问题?
解决步骤
第一步:准备匹配版本的Chromium
puppeteer每个版本对应特定的Chromium版本,你可以先在开发环境运行npm list puppeteer查看当前使用的puppeteer版本,下载对应版本的绿色版Chromium,解压后放在无中文、无空格的目录下,后续直接和打包后的exe放在同一级目录即可,不要把Chromium打包进exe,会导致体积过大且路径识别异常。第二步:修改代码配置
需动态获取exe运行路径拼接Chromium地址,同时添加Windows环境必需的启动参数,完整修改后的代码示例如下:
const puppeteer = require("puppeteer"); const path = require("path"); async function scraper(url) { // 动态获取当前exe所在目录,拼接Chromium路径,示例中Chromium解压后的文件夹名为chrome-win,可根据实际情况修改 const chromePath = path.join(path.dirname(process.execPath), "chrome-win", "chrome.exe"); const browser = await puppeteer.launch({ executablePath: chromePath, // Windows环境必须加这两个参数避免闪退 args: ["--no-sandbox", "--disable-setuid-sandbox"], // 开发阶段可以设为false直观查看浏览器运行情况,打包后可改回true使用无头模式 headless: "new" }); const page = await browser.newPage(); await page.goto(url); const title = await page.title(); await browser.close(); return title; } // 加catch捕获异常,避免未处理错误直接导致进程闪退 scraper("http://example.com").then(console.log).catch(console.error);
- 第三步:配置pkg打包规则
在项目的package.json中添加pkg配置,排除puppeteer内置的Chromium路径,避免打包时错误绑定路径:
{ "name": "puppeteer-demo", "dependencies": { "puppeteer": "^你的实际版本号" }, "pkg": { "targets": ["node18-win-x64"], "assets": [], // 排除puppeteer内置二进制文件,使用外置的Chromium "external": ["puppeteer-core"] } }
- 第四步:执行打包&部署
- 运行打包命令:
pkg . -o 你的程序名.exe - 把之前解压的Chromium文件夹和打包好的exe放在同一个目录下
- 排查问题时不要直接双击运行exe,先打开cmd,在cmd中执行
.\你的程序名.exe,可以看到具体报错信息定位问题
常见闪退排查点:
- Chromium路径是否正确,路径中是否存在中文、空格
- Chromium版本和你使用的puppeteer版本是否匹配
- 是否添加了
--no-sandbox等必要启动参数- 代码是否添加了catch捕获异常,避免未处理的异常直接导致进程退出
内容的提问来源于stack exchange,提问作者vlonezero
相关产品推荐
相关产品推荐

