Pulumi 宣布,Bun 现在已经成为 Pulumi 完全支持的运行时环境,不再像之前那样只是作为包管理器的角色。随着 Pulumi 3.227.0 的发布,开发人员可以在 Pulumi.yaml 文件中设置 runtime: bun,然后由 Bun 执行整个基础设施程序,而不需要安装 Node.js。
在 2022 年首次发布时,Bun 的核心理念很简单:基于 JavaScriptCore 而非 V8 打造一个更快的 JavaScript 运行时。此后,该项目的规模和目标都做了大幅的扩展。Bun 由 Jarred Sumner 开发,于 2021 年 5 月首次预览,并于 2023 年 9 月发布了 1.0 版本。该运行时的独特之处在于将包管理器、打包工具和测试运行器整合到了一个二进制文件中,所有组件均采用 Zig 编程语言构建,以 Apple 的 WebKit 引擎 JavaScriptCore 为基础。这与 Node.js 和 Deno 所使用的 V8 引擎完全不同。
该项目在被 Anthropic 收购后获得了重要的机构支持。此前,Anthropic 已经将该产品用于部署 Claude Code。Anthropic 表示,Bun “将继续开源并遵循 MIT 许可”,并且他们会继续推进开发,供广大 JavaScript 和 TypeScript 开发者使用。性能指标一直是其核心卖点:与 Node.js 相比,Bun 的启动速度快 4 倍(5–15 毫秒 vs 60–120 毫秒),包的安装速度快 6–35 倍。
自 Bun 1.0 发布以来,该集成一直是 Pulumi GitHub 问题跟踪系统中需求最高的功能之一。有三个特性使 Bun 对 Pulumi 用户特别具有吸引力。首先是 TypeScript 的原生执行:Bun 可直接运行 TypeScript 文件,无需 ts-node 或单独的编译步骤,而这些步骤过去曾给 Pulumi TypeScript 工作流带来诸多不便。其次是更快的依赖项安装速度,这加速了 CI/CD 管道中基础设施程序的初始化过程。第三,Bun 致力于实现 100% 兼容 Node.js ,因此 Pulumi 现有的 npm 包应该能开箱即用。
当配置了runtime: bun 时,Pulumi 会使用 Bun 来运行程序及管理包,不再需要单独配置包管理器选项。新项目模板可以通过 pulumi new bun 获取。
其中有一项值得注意的人机工程学改进涉及到了异步代码。在 CommonJS 格式的 Pulumi 程序中,如果要等待数据源加载,就需要在声明所需资源之前将程序封装在一个异步入口函数中。而得益于 Bun 对 ESM 的全面支持,顶层 await 可以在模块层面直接使用,不需要任何封装,这大大简化了程序结构。
如果团队有基于 Node.js 的 Pulumi 项目,可以通过更新 Pulumi.yaml 中的 runtime 字段进行迁移,同时调整 tsconfig.json ,使用 Bun 推荐的编译器选项(包括 module: "Preserve" 和 moduleResolution: "bundler"),并在 package.json 中添加 "type": "module" 来启用 ESM。
该版本存在两项值得注意的限制。Pulumi 的回调函数(有时被称为“魔法 lambda”)在 Bun 运行时下不被支持,因为它们依赖于函数序列化,而该功能又依赖于 Node.js v8 和 inspector 模块(在 Bun 中尚未完全提供)。出于同样的原因,动态提供程序也不支持。依赖上述任一功能的团队应继续使用 runtime: nodejs,但仍然可以通过在 Node.js 运行时配置中设置 packagemanager: bun来使用 Bun 提供的更快的包管理功能。
Bun 运行时支持需要 Bun 1.3 或更高版本以及 Pulumi 3.227.0 或更高版本。
声明:本文为 InfoQ 翻译,未经许可禁止转载。





