前言
说到前端的打包工具,我第一个想到的就是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
最终效果
以下是整个配置文件:
{
"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%左右的空间,棒棒的!