使用pkg打包node项目全过程

1,373 阅读2分钟

前言

说到前端的打包工具,我第一个想到的就是webpack,在自己开发的vue/react项目中,webpack已经是一种标配。但对于node项目中,也有自己的打包工具pkg。

通常在本地启动node项目的时候,我们都会直接用以下的指令启动入口文件

node index.js

但这样的方式并不适合在服务器使用,一是源码文件不能随意泄露,二是项目要尽量占据更少空间。因此建议大家使用一种更为安全简单的方式,把node项目打包成一个exe程序放到服务器上并启动。

安装pkg

全局安装pkg

npm install -g pkg 

配置入口

pkg的入口配置跟webpack类似,通过package.json规定的属性去找到入口文件。在根目录的package.json中,配置一个‘bin’的属性指向入口文件'index.js'

// package.json
{
    "bin": "index.js"
}

pkg 打包命令

我把打包命令写在package.json的属性中,通过npm run pkg的方式启动。

"scripts": {
    "pkg": "pkg . -t node16-win-x64 --out-path=dist/"
  },

其中各个参数的配置解读如下:

1 pkg: 寻找package.json中的bin属性,作为入口文件 2 -t: 指定打包的系统版本以及node版本,这里指定的是node16-win-x64。需要留意的是,在win跟linux系统中打包的node版本也是不同的,需要根据实际情况区分 3 --out-path=dist/ :把生成的exe文件输出到dist文件夹里

打包遇到的问题

执行打包命令 npm run pkg 后 ,出现报错,是因为环境中缺少二进制文件但下载失败,原来是我代码中要求下载的版本不对,于是我把指定版本去掉,就能正常下载并打包了。

pkg -t win ./ --out-path=dist

image.png

最终效果

以下是整个配置文件:

{
  "name": "react-ts-node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "node index.js",
    "node": "nodemon --exec babel-node index",
    "pkg": "pkg -t win ./ --out-path=dist"
  },
  "bin": "index.js",
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/node": "^16.11.26",
    "bcrypt": "^5.0.1",
    "body-parser": "^1.20.1",
    "express": "^4.18.1",
    "express-jwt": "^7.7.5",
    "jsonwebtoken": "^8.5.1",
    "mysql": "^2.18.1",
    "nodemon": "^2.0.16"
  }
}

在dist文件夹下会出现一个exe应用,说明你已经成功了!双击应用就启动了。 exe的文件大小是41MB,比源文件52MB节约了20%左右的空间,棒棒的!

image.png image.png