pkg是一个可以将nodejs程序打包成exe文件的工具,免去我们的nodejs程序在客户电脑上跑时需要客户下载node环境。不仅可以打包成exe在window上跑,还可以打包成linux/mac下的可执行程序,具体支持的平台如下:
操作流程
先建一个js文件
// src/index.js
const express = require('express')
const dayjs = require('dayjs')
const app = express()
app.get('/hello', (req, res) => {
res.send(dayjs().format('YYYY/MM/DD'))
res.end
})
const port = 9090
app.listen(port)
安装pkg
cnpm i -g pkg
打包
pkg ./src/index.js -t win -o app
可能碰到的问题
如上图,可能出现下载很慢的情况,也可能因为下载太慢而超时,报如下错
$ pkg -t win server.js
> pkg@5.8.0
> Fetching base Node.js binaries to PKG_CACHE_PATH
fetched-v16.16.0-win-x64 [ ] 0%> Not found in remote cache:
{"tag":"v3.4","name":"node-v16.16.0-win-x64"}
> Building base binary from source:
built-v16.14.2-win-x64
> Fetching Node.js source archive from nodejs.org...
> Error! AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
可以手动下载相应的文件,放到缓存目录里。
-
从github上下载到相应的文件,比如我的报错中提示需要下载这个文件
{"tag":"v3.4","name":"node-v16.16.0-win-x64"}
,就可以在这里找到。 -
下载下来后放到
.pkg-cache
这个文件夹下对应的tag目录下(还是看报错信息中的{"tag":"v3.4","name":"node-v16.16.0-win-x64"}
,得知我的tag是v3.4
),我的目录路径是C:\Users\Administrator\.pkg-cache\v3.4
-
下载下来的文件原名是
node-v16.16.0-win-x64
,需要改成fetched-v16.16.0-win-x64
,因为看报错信息中,打包脚本就是要下载成这个名字。 -
还有一个注意项,我之前设置了
PKG_CACHE_PATH
环境变量,设置到其他目录,这时脚本就会往那个目录下载。第三步中的文件就要放到PKG_CACHE_PATH
所指向的目录下的v3.4
了。 -
再执行打包命令就成功了,成功的日志很少。如下: