Open
Description
需求
当你开发了一个NodeJS程序,想要分发给其他人运行的时候,你会发现,你往往需要对方也来安装一个NodeJS环境。理想的方式是,我们可以把我们的程序打包成一个可执行文件,这样,就可以直接在对方的电脑上运行你的程序了;同时,我们将代码打成二进制形式,可以在一定程度上保护源代码以及API等处理的逻辑。
那么,能不能解决这样的需求呢?可以的。有很多程序包可以做到这件事情:pkg
、nexe
、node-packer
、enclose
、ncc
,当然,对于使用web开发的程序,你还可以使用electron
来开发,除了打包本身,还提供了GUI能力。
如果只是命令行的跨平台,不妨试试pkg
,它可以在某一个平台下将你的NodeJS程序打包进一个可执行程序,并且可以在单一平台,打出主流的Windows
、Mac
、Linux
下的运行程序。
使用场景
- 立即为其他平台制作可执行文件(交叉编译)
- 制作某种自解压存档或安装程序
- 无需安装Node.js和npm来运行打包的应用程序
- 无需下载无数个文件npm install来部署您的应用程序。将其部署为单个文件
- 将您的资产放在可执行文件中,使其更具可移植性
- 针对新的Node.js版本测试您的应用程序而不安装它
使用
在使用之前,请安装好所有相关依赖。如果我们想打包index.js
文件,则执行pkg index.js
。默认地,pkg
会选择下载最新的NodeJS
源码,并编译三个主流的平台,以笔者这里的情况是:node12-linux-x64
, node12-macos-x64
, node12-win-x64
。
每一次打包,pkg
会尝试从本地缓存优先寻找NodeJS
的缓存包,如果本地没有找到,就会去远程获取。
404 Not Found问题
点击.exe
,发现有些接口返回404 Not Found
例如下例,将exe
放到其他文件下,尝试打开页面,发现报Can't get /
app.use('/', express.static('dist'));
复制代码因为pkg
没有把这些文件给打包进去,他只会打包使用require
或者 通过绝对路径__filename
和__dirname
的文件
所以需要修改为
app.use('/', express.static(path.join(__dirname, 'dist')));