使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择
使用 pkg
打包 Puppeteer 应用
pkg
是一个非常强大的工具,它允许你将 Node.js 项目打包成独立的可执行文件,这意味着你可以在没有安装 Node.js 环境的设备上运行该应用。这对于希望分发不暴露源代码的应用程序、创建跨平台的快速演示版本或简化部署流程的开发者来说,是一个非常有用的工具。
使用了2天用pkg打包,在运行main.exe总提示 Passed function cannot be serialized 错误。后面终止成功运行了。
安装 pkg
首先,你需要全局安装 pkg
。在你的命令行界面中运行以下命令:
npm install -g pkg
打包你的 Node.js 项目
使用 pkg
打包你的项目非常简单。首先,确保你有一个入口文件,例如 index.js
。然后,在项目目录下运行 pkg
命令:
pkg index.js --target=node16 --platform=all --output=myapp
这里的参数解释如下:
index.js
是你的入口文件路径。--target=node16
指定目标 Node.js 版本,可以是具体的版本号或latest
。--platform=all
打包所有支持的平台(或指定具体平台如linux
,win
,macos
)。--output=myapp
输出文件名前缀,生成的文件将是myapp_*.exe
或相应格式。
package.json的内容
{
"name": "puppeteer-extra",
"version": "1.0.0",
"main": "dist/bundle.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "rollup --config rollup.config.mjs"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"browsers": "^1.0.2",
"js-yaml": "^4.1.0",
"puppeteer": "^23.6.0",
"puppeteer-extra-plugin-recaptcha": "^3.6.8",
"puppeteer-extra-plugin-stealth": "^2.11.2",
"yarn": "^1.22.22"
},
"bin": {
"your-app": "src/main.js"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^28.0.1",
"@rollup/plugin-node-resolve": "^15.3.0",
"electron": "^33.0.2",
"electron-builder": "^25.1.8",
"electron-packager": "^17.1.2",
"puppeteer-core": "^23.6.0",
"puppeteer-extra": "^3.3.6",
"rollup": "^4.24.2",
"webpack": "^5.95.0",
"webpack-cli": "^5.1.4"
},
"build": {
"appId": "com.example.yourapp",
"productName": "YourApp",
"win": {
"target": "nsis"
}
},
"pkg": {
"scripts": [
"node_modules/puppeteer-extra-plugin-stealth/**/*"
]
}
}
注意事项
- 当打包私有依赖或非标准路径的资源时,可能需要在
package.json
的pkg
配置中明确指定脚本和资产路径。 - 对于生产环境,考虑安全性需求,尤其是 macOS 上的代码签名要求。
- 跨平台打包可能需要额外的设置,比如在 Linux 上配置 QEMU 用于模拟其他架构。
使用 pkg
打包 Puppeteer
由于 Puppeteer 是一个庞大的 Node.js 库,并且包含二进制文件,它并不适合被打包到浏览器环境中。但是,如果你确实需要在浏览器环境中使用某些 Puppeteer 功能,你可以使用 puppeteer-core
,它是 Puppeteer 的一个轻量级版本,不包含自动下载的浏览器。
在使用 pkg
打包包含 puppeteer-core
的项目时,你可能会遇到路径问题或序列化问题。为了解决这些问题,你可以在 pkg
命令中添加 --public
参数,这将帮助你正确地序列化传递的函数:
pkg index.js -t=win --public
–public很重要,不加上会出现下面的错误
Passed function cannot be serialized!
如果在运行pkg时提示有下载fetched-v18.5.0-win-x64,网上的教程下载fetched-v18.5.0-win-x64都不对我花了2天时间都没有成功。后面来硬的,找人用科学上网下载成功了。
此外,确保你的 Puppeteer 配置正确,特别是 executablePath
参数,这将指向你的 Chrome 可执行文件路径。如果你在不同平台上打包,确保为每个平台指定正确的浏览器路径。
通过上述步骤,你可以成功地使用 pkg
打包你的 Node.js 项目,包括使用 Puppeteer 或 puppeteer-core
的应用。这将使你的应用在不同环境中更加易于部署和运行。