Nodejs v19.x 支持打包可执行单文件

发布 : 2023-03-16 分类 : 资讯

特性介绍:

有的语言原生工具链就支持打包单独可执行文件,如:go build dart complite exe

有的有社区解决方案,如:PyInstaller nodejs社区的:ncc/pkg

如今,nodejs 在 v19.x 引入实验性单独可执行文件,提供了官方打包工具链。

使用

基础环境:安装 Nodejs v19.x 及以上,只有最新版本支持

1
2
3
4
5
6
7
8
9
10
11
#  1.创建 js 文件
echo 'console.log(`Hello, ${process.argv[2]}!`);' > hello.js
# 2. 复制当前版本的 node 二进制文件到当前目录,并重命名为想要的二进制名称
cp $(which node) hello
# 3. 进行打包
npx postject hello NODE_JS_CODE hello.js \
--sentinel-fuse NODE_JS_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
--macho-segment-name NODE_JS # 最后一行只有 macos 需要
# 4. 运行可执行文件
./hello world
Hello, world!

以上是官方示例,通过第三步可以看出,实际上是 postject 在起作用, 可以自行安装使用

应用

目前只能打包一个 js 文件, 与 pkg 是打包一整个文件夹不同,是否就不能应用了呢?顺势可以想到把整个项目打包为单独的 js 文件不就解决了这个问题了吗?这便是 ncc(Compile a Node.js project into a single file. Supports TypeScript, binary addons, dynamic requires.), 尝试一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir singleapp
# 初始化项目
npm init
# 安装依赖
npm i -S express
# ...创建多文件文件夹及相互依赖

# 使用 ncc 打包单文件, dist/index.js
ncc build app.js -o dist
# 复制当前版本的 node 二进制文件到当前目录,并重命名为想要的二进制名称
cp $(which node) singleapp
# 3. 进行打包
npx postject singleapp NODE_JS_CODE dist/index.js \
--sentinel-fuse NODE_JS_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
--macho-segment-name NODE_JS # 最后一行只有 macos 需要
# 4. 运行可执行文件
./singleapp
server is running at 127.0.0.1:3000

由于打包了 nodevm 所以生成的二进制文件会比较大,单文件打包结果是 83Mb,但是 node 二进制原包是 90MB,应该是有压缩,可以使用 upx 进行二进制加壳压缩。

结言

Nodejs 多年呼吁的打包功能官方终于开始启动了,还有一些瑕疵,而且实验性功能改动到后边会比较大,可以多多跟进,目前的官方讨论区在

以前社区百花齐放提供了很多的打包方案,pkg, jsexe, ncc, bytecode 等等,其实 webpack 这些也是可以支持后端项目打包的,也可以打包合并为单独 js 文件,复用 js 打包生态,源码混淆,sourcemap 支持等等

本文作者 : 萧逸雨
原文链接 : http://qiubo.ink/2023/03/16/Nodejs-v19-x-支持打包可执行单文件/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!