pkg 文档链接
介绍
运行Node.js开发的后端服务,通常是以源码方式进行启动。这样有源码暴露风险。pkg包可以将Node.js 应用编译成二进制应用程序,不仅可以对源码进行了一层封装,还能让Node.js服务在无安装Node.js环境下进行运行。
安装
- 全局安装
npm install -g pkg
- 在项目中安装
npm install -D pkg
将基础的js文件打包成应用程序
- 新建文件
index.js
- 在
index.js文件中输入以下内容
- 开启终端运行
pkg index.js,等待打包完成
第一次打包会比较慢,这关乎网络与电脑配置。打包过程会下载所需要的资源,并在电脑中新建
.pkg-cache文件夹。
- 打包完成会生三个系统的应用程序文件
- 运行打包好的
.exe文件,测试是否可以运行。
打包Express
- 创建
express项目
package.json文件配置pkg打包命令
{
"bin": "./app.js",
"scripts":{
"pkg":"pkg .", // 同时打包 mac、linux、win三个平台的包,而且node版本是根据当前系统环境安装的node版本
"pkg:linux": "pkg . -t node16-linux-x64", // 只会打包linux的包, node版本是16最新稳定的版本
"pkg:win": "pkg . -t node16-win-x64", // 只会打包win平台的包, node版本是16最新稳定的版本
}
}
打包时没有自定入口文件,会自动找
package.json中的bin属性。-t是指定打包出什么环境的包。可以用逗号(,)设置多个平台。
- 运行
npm run pkg, 打包三个平台的包
在package.json配置pkg
{
"pkg":{
"scripts":["./**/*.js"], // 设置对根目录下所有的js文件进行编译打包
"assets":["./assets"], // 设置对非js文件进行打包,不会进行编译,原封不动的打进应用程序
"targets":["node16-linux-x64"], // 设置目标平台
"outputPath": "dist", // 打包后的文件输出目录, 注意:当在打包命令设置了 -o , 此设置将会无效
}
}
运行pkg .就会根据pkg配置进行打包。
pkg配置详解与注意事项
经过上面的体验,可以简单的打包,有一些配置可以优化打包。可以再官网中看到配置。
- 打包前对文件进行压缩,可选
Brotli或GZip
{
"pkg": "pkg . --compress Brotli"
}
- 打包时给nodeJs 设置配置,
--options, 有多个配置用逗号隔开
{
"pkg": "pkg . --options max-old-space-size=512"
}
注意事项
如果在项目中有使用__dirname或者是__filename,可能会在打包的时候出现问题,或者在运行应用程序的过程中出现问题。官方推荐使用process.cwd()或者是path.dirname(process.execPath)
部署
查看linux服务器架构
- 查看当前linux 服务器是属于 那种架构
# 在linux 服务器运行
arch
# 显示 x86_64 ,要设置pkg的 targets为node16-linux-x64
使用 pm2 启动服务
- 将打包好的
x64架构的二进制应用文件上传到linux服务器 - 使用pm2 运行二进制文件
pm2 start <二进制文件名>
在Nestjs 使用pkg配置
{
"scripts":{
"prebuild": "rimraf dist output",
"build": "nest build && yarn run pkg:linux",
"build:win": "nest build && yarn run pkg:win",
"pkg:linux": "pkg . --compress Brotli -t node16-linux-x64 --options max_old_space_size=512",
"pkg:win": "pkg . --compress Brotli - node16-win-x64 --options max_old_space_size=512",
},
"pkg": {
"scripts": [
"dist/**/*.js"
],
"assets": [
"dist/libs/**",
"node_modules/swagger-ui-dist/*"
],
"outputPath": "output"
}
}