如何解决运行pkg .时出现的“Error: Cannot find module 'puppeteer'”问题
解决Puppeteer脚本打包成独立EXE的问题
问题分析
直接运行pkg .生成的EXE依赖外部node_modules,是因为Puppeteer包含Chromium二进制文件这类非JS资源,pkg默认不会自动打包;而全量指定node_modules/**/*.*会导致打包资源过大,进程卡死。
解决方案
1. 精准配置pkg的assets路径
不要全量打包node_modules,只指定Puppeteer相关的必要资源,修改package.json的pkg配置:
"pkg": { "assets": [ "node_modules/puppeteer/.local-chromium/**/*", "node_modules/puppeteer-extra/**/*", "node_modules/puppeteer-extra-plugin-stealth/**/*" ], "targets": ["node18-win-x64"] // 替换为你使用的Node版本+平台,减少打包耗时 }
配置完成后重新运行pkg .即可,这样只打包必需的依赖,避免进程卡死。
2. 代码中适配Chromium路径(可选)
为了确保打包后能正确找到Chromium二进制文件,可在代码中手动指定路径:
const fs = require("fs"); const puppeteer = require("puppeteer-extra"); const path = require("path"); const StealthPlugin = require("puppeteer-extra-plugin-stealth"); puppeteer.use(StealthPlugin()); // 适配pkg打包后的Chromium路径 const getChromiumPath = () => { // 替换为你本地node_modules中Chromium的版本文件夹名(比如win64-1181205) const chromiumVersionDir = "win64-xxxxxx"; return path.join( __dirname, "node_modules", "puppeteer", ".local-chromium", chromiumVersionDir, "chrome-win", "chrome.exe" ); }; // 后续启动浏览器时指定路径 (async () => { const browser = await puppeteer.launch({ executablePath: getChromiumPath(), // 其他配置项 }); // 你的业务代码 })();
3. 换用nexe工具(如果pkg仍有问题)
nexe对Puppeteer这类带二进制资源的库支持更友好,步骤如下:
- 全局安装nexe:
npm install nexe -g
- 打包脚本:
nexe index.js --build --assets "node_modules/puppeteer/.local-chromium/**/*,node_modules/puppeteer-extra/**/*,node_modules/puppeteer-extra-plugin-stealth/**/*"
注意事项
- 打包前清理缓存:删除
node_modules、package-lock.json后重新执行npm install,避免旧依赖干扰 - 确认Puppeteer版本为稳定版,避免兼容性问题
- 指定
targets可以大幅缩短pkg的打包时间,避免它尝试构建多平台版本
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

