pkg 将node应用打包成二进制文件

2,598 阅读3分钟

pkg 文档链接

介绍

运行Node.js开发的后端服务,通常是以源码方式进行启动。这样有源码暴露风险。pkg包可以将Node.js 应用编译成二进制应用程序,不仅可以对源码进行了一层封装,还能让Node.js服务在无安装Node.js环境下进行运行。

安装

  • 全局安装
npm install -g pkg
  • 在项目中安装
npm install -D pkg

将基础的js文件打包成应用程序

  • 新建文件index.js

image.png

  • index.js文件中输入以下内容

image.png

  • 开启终端运行pkg index.js,等待打包完成

image.png

第一次打包会比较慢,这关乎网络与电脑配置。打包过程会下载所需要的资源,并在电脑中新建.pkg-cache文件夹。

  • 打包完成会生三个系统的应用程序文件

image.png

  • 运行打包好的.exe文件,测试是否可以运行。

打包Express

  • 创建express项目

image.png

  • 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配置详解与注意事项

经过上面的体验,可以简单的打包,有一些配置可以优化打包。可以再官网中看到配置。

  • 打包前对文件进行压缩,可选BrotliGZip
{
	"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"
  }
}