日志日期 · 周三
Node.js 26.11.0:SEA 可从内嵌 ZIP 提供资源
2026-10-07(UTC),Node.js 26.11.0 带来 SEA 的 vfsArchive 选项,资源以原样 ZIP 嵌入可执行文件。
当天发生了什么
2026-10-07 14:43(UTC),Node.js 在 GitHub 发布 26.11.0(Current)。其提交列表中包括“sea: add vfsArchive to serve the assets from a ZIP archive”(#65810),以及为带代码缓存的 import() 补充测试与文档。按该 PR 的描述:vfsArchive 是单可执行应用(SEA)配置中的新选项,指向一个预先打好的 ZIP,必须与 "useVfs": true 一起使用,且不能与 "assets" 同时使用;--build-sea 构建时会把归档原样嵌入,仅检查 PK 签名;运行时通过虚拟文件系统挂载该 ZIP。sea.getAsset() 不提供其中的单个文件,读取需走 fs 接口。PR 的基准表中,128MB 资源档位下的二进制从 284.7MB 降到 193.9MB;PR 页面未提及加密。
对防护模型意味着什么
这项功能的目标是体积与启动性能,不是保护。按 PR 描述,归档被原样嵌入,且只做了 PK 签名的合理性检查;ZIP 是公开标准格式,因此应当诚实地认为:内嵌的归档对任何拿到二进制的人都是可读的。把应用打成单个可执行文件,改变的是分发形态,不改变“客户端包里的内容可被获取”这一事实。代码缓存也是性能手段,不应被宣传为加密。对独立开发者来说,常见误区是把 SEA 当作“把源码藏起来”的方式,并在其中放入 API 密钥、授权算法或付费功能的完整实现。正确的边界是:可执行文件里的一切都按公开内容对待,真正的秘密与核心规则留在服务端。
在自己的构建上做的检查
构建完成后,对自己的可执行文件做一次内容盘点:列出 ZIP 中的每个文件,确认没有 .env、私钥、内部配置、测试数据或未打算发布的源码映射。把密钥改为运行时从服务端获取的短期凭证,核心规则改由服务端判定。若同时对 JavaScript 做混淆,确认混淆在打包进 ZIP 之前完成,并在打包后的可执行文件上重跑功能测试,尤其是依赖 __dirname 相对路径与 sea.getAsset() 的代码。在 Windows 与 macOS 上,确认注入资源后再进行代码签名与公证,并验证签名结果。升级 Node.js 前阅读发布说明与相关 PR。
行动清单
- 列出 SEA 内嵌 ZIP 的全部文件,确认无密钥与多余源码映射
- 把密钥与核心规则移到服务端,客户端改用短期凭证
- 注入资源后再签名、公证并重跑功能测试
原始资料
- GitHub: nodejs/node release v26.11.0 · 资料日期 2026-10-07 · 核对于 2026-10-12
- GitHub: nodejs/node PR #65810 sea: add vfsArchive to serve the assets from a ZIP archive · 资料日期 2026-09-19 · 核对于 2026-10-12