从Node.js v22.3.0开始,Node.js原生支持创建单个可执行应用程序(Single Executable Applications,简称SEA)。这一特性使得开发者能够方便地将Node.js应用分发到没有安装Node.js的系统上。以下是该特性的工作原理和创建流程概要:
工作原理:
Node.js允许将一个由Node.js准备的“blob”(数据块)注入到Node二进制文件中,这个“blob”可以包含被打包的脚本。
应用启动时,会检查是否有所注入的内容。如果找到了这个“blob”,它就会执行其中的脚本;如果没有,则Node.js按常规方式运行。
当前限制:
目前,此特性仅支持使用CommonJS模块系统运行单个嵌入式脚本。
创建流程:
- 创建JavaScript文件:例如,创建一个简单的hello.js脚本用于打印消息。
- 配置文件:创建一个配置文件(如sea-config.json),指定主脚本文件名及输出的准备“blob”文件名。
- 生成“blob”:使用Node.js的实验性标志--experimental-sea-config和配置文件生成“blob”。
- 复制Node二进制文件:创建Node可执行文件的一个副本,并根据需要命名。
- 移除签名(仅macOS和Windows):为了注入资源,需要移除复制的二进制文件的签名。
- 注入“blob”:最后,使用如postject这样的工具将“blob”注入到复制的二进制文件中。
高级特性:
- 启动快照(Startup Snapshots):通过配置useSnapshot字段,可以在构建过程中运行主脚本来初始化堆,然后捕获状态快照并包含在最终的应用程序中。这能加速应用的启动时间,因为当用户运行最终的可执行文件时,Node.js将直接从快照中恢复状态而不是重新执行初始化脚本。
- 代码缓存(Code Cache):设置useCodeCache为true可以在构建准备“blob”时编译主脚本并生成V8代码缓存,这会在最终应用启动时加快主脚本的编译速度。
注意事项:
使用代码缓存时,import()语法将不被支持。
在注入的主脚本中,require()功能受限,仅能加载内置模块,不能加载文件系统中的模块。建议将应用打包成单独的JavaScript文件以避免此限制。
总之,Node.js v22.3.0及以上版本引入的单个可执行应用程序特性,为开发者提供了一种将Node.js应用及其依赖打包为独立、可分发的二进制文件的新方法,从而简化了部署流程并提高了应用的便携性。
原文地址:https://nodejs.org/api/single-executable-applications.html