Skip to content

使用pkg将Node.js文件打包成exe文件 #210

Open
@TieMuZhen

Description

@TieMuZhen

需求

当你开发了一个NodeJS程序,想要分发给其他人运行的时候,你会发现,你往往需要对方也来安装一个NodeJS环境。理想的方式是,我们可以把我们的程序打包成一个可执行文件,这样,就可以直接在对方的电脑上运行你的程序了;同时,我们将代码打成二进制形式,可以在一定程度上保护源代码以及API等处理的逻辑。

那么,能不能解决这样的需求呢?可以的。有很多程序包可以做到这件事情:pkgnexenode-packerenclosencc,当然,对于使用web开发的程序,你还可以使用electron来开发,除了打包本身,还提供了GUI能力。

如果只是命令行的跨平台,不妨试试pkg,它可以在某一个平台下将你的NodeJS程序打包进一个可执行程序,并且可以在单一平台,打出主流的WindowsMacLinux下的运行程序。

使用场景

  • 立即为其他平台制作可执行文件(交叉编译)
  • 制作某种自解压存档或安装程序
  • 无需安装Node.js和npm来运行打包的应用程序
  • 无需下载无数个文件npm install来部署您的应用程序。将其部署为单个文件
  • 将您的资产放在可执行文件中,使其更具可移植性
  • 针对新的Node.js版本测试您的应用程序而不安装它

使用

在使用之前,请安装好所有相关依赖。如果我们想打包index.js文件,则执行pkg index.js。默认地,pkg会选择下载最新的NodeJS源码,并编译三个主流的平台,以笔者这里的情况是:node12-linux-x64, node12-macos-x64, node12-win-x64
image
每一次打包,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')));

打包Koa

具体操作流程和遇到问题解决方案请参考此文

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions