背景
在部分应用场景下,需要将nodejs项目打包为单个文件。市面上用过的方案,有pkg以及vercel/ncc. 前者可打包多个平台的二进制文件, 后者将整体项目打包为一个index.js, 然后在不同平台上直接node index.js运行。但是,在打包midway项目时,遇到了一些问题。
- pkg打包后, 运行直接提示解释器不可用。
- ncc打包后提示模块缺少。
nodev20: 实验性单一可执行应用程序(SEA)
实验性单一可执行应用程序(SEA)是Node.js v20中引入的一项新功能,它允许将你的应用程序与Node.js二进制文件捆绑在一起,使最终用户能够将其作为单一可执行文件分发和运行,这意味着部署到服务器时,无需预先安装node和npm,而是直接运行二进制打包产物就行。
这是社区长期以来的要求,团队在过去一年中一直在完善这一方法。
在Node.js v20中,构建单个可执行应用需要注入Node.js从JSON配置中准备的blob,而不是注入原始JS文件。
blob是一个包含二进制数据的文件,在本例中是由Node.js准备的,它被注入到二进制中。作出这一改变是为了能够将多个共存的资源嵌入到SEA中,这就开辟了新的用例。
下面是一个sea-config.json文件的例子:
{
"main": "myscript.js",
"output": "sea-prep.blob"
}
当用命令 node --experimental-sea-config sea-config.json 执行时,blob会被写入sea-prep.blob文件,然后可以被注入二进制文件。
SEA功能允许开发者发布Node.js应用程序,而不要求用户安装Node.js。该功能是由Darshan Sen创建的,他在OpenJS World上获得了JavaScriptLandia奖的一部分,获得了新来者的杰出贡献奖。
windows上尝试打包, in powershell。
- 编写sea-config.js
- node --experimental-sea-config sea-config.json
- cp (Get-Command node).Source hello.exe
- npx postject hello.exe NODE_SEA_BLOB sea-prep.blob `
–sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 - 执行 .\hello.exe, 输出了1.
结论
使用nodev20打包单个文件为exe, 输出hello world这种demo项目是可以的, 感觉跟pkg原理差不多。 大点的项目,midwayjs, express无法打包成功。