Bun 发布原生 JavaScript 打包工具
Bun 最近推出了其快速原生 JavaScript 打包工具,为 Bun 生态系统带来了增强的打包能力。该打包工具目前处于测试阶段,提供了一套全面的功能和工具,旨在简化和加速前端应用程序的构建过程。此外,Bun 还引入了JavaScript 宏,允许在打包时执行 JavaScript 函数,并将结果直接内联到打包文件中。
Bun 的定位
Bun 是一个旨在替代 Node.js 的 JavaScript 和 TypeScript 应用一体化工具包。它包括一个快速的 JavaScript 运行时——Bun 运行时,提供了更快的启动时间和更低的内存占用。该工具包以一个名为“bun”的单一可执行文件形式发布,并提供了多种功能,如测试运行器、脚本运行器和包管理器。
原生打包工具的功能
Bun 的原生打包工具试图简化复杂的 JavaScript 和 TypeScript 打包挑战,例如运行 TypeScript 文件、为生产环境构建和打包代码、处理依赖关系以及启用诸如 sourcemap 等功能。这些任务通常耗费时间,影响开发速度和效率。
关键特性
- 快速插件执行:通过轻量级的 Bun 进程,实现更快的打包速度。
- 预编译文件生成:生成针对 Bun 运行时优化的预编译文件,减少冗余的编译步骤,提升执行性能。
- 统一的插件 API:允许插件扩展打包工具和 Bun 运行时的能力,增强灵活性和代码复用性。
- 无缝集成运行时:支持直接传递 BuildArtifact 对象,这些对象可以用于 HTTP API 如
new Response()。 - 独立可执行文件生成:支持生成包含 Bun 运行时的自包含可执行文件。
性能表现
Bun 打包工具在性能上表现出色。与 esbuild、Parcel 2、Rollup + Terser 和 Webpack 等流行打包工具相比,Bun 的速度优势显著,速度提升范围从 1.75 倍到 220 倍不等,具体取决于测试场景。
开发者体验
开发者可以使用 Bun.build() 函数或 Bun build CLI 命令轻松构建前端应用。API 支持关键选项,如入口点、输出目录、目标(浏览器、Bun 或 node)、格式(esm)、代码压缩、sourcemap 配置等。此外,打包工具还支持 tree-shaking 以移除无用代码。通过稳定的插件系统和加载器配置,开发者可以根据特定需求定制打包过程。
Bun 宏
Bun 宏允许 JavaScript 函数在打包时执行,开发者可以通过特殊的导入属性语法将函数作为宏导入,并将其结果直接内联到打包文件中。宏在打包过程的编译阶段同步运行,并通过多个 JavaScript 工作线程并行化,确保高效执行。宏可以用于在打包时发起 fetch 请求或增强开发者灵活性。
安全考虑
- 显式导入:宏必须通过
{ type: 'macro' }属性显式导入,以确保其执行是故意的,并减少潜在的安全风险。 - 禁用宏:使用
--no-macros标志可以完全禁用宏的执行,增加安全性。 - 限制调用:宏不能从
node_modules目录中调用,以防止恶意包的潜在风险。尝试从node_modules调用宏会触发特定错误信息。
宏的局限性
- 结果可序列化:宏的结果必须是可序列化的,以便无缝内联到抽象语法树(AST)中。JSON 兼容的数据结构完全支持,但函数和大多数类的实例不可序列化。
- 静态输入:宏只能接受在打包时静态已知的输入值,动态值或依赖运行时条件的值不允许作为宏输入。
开发者社区的反馈
Bun 宏在开发者社区中引发了不同的意见。一些开发者对其简化开发流程的能力表示赞赏,而另一些开发者则认为宏应该支持更复杂的代码转换功能。Bun 的 CEO Jarred Sumner 表示,他们将重新审视宏的设计,以进一步改进其功能。
总结
Bun 的原生打包工具和宏功能为 JavaScript 和 TypeScript 开发者提供了强大的工具,显著提升了打包效率和开发灵活性。尽管宏功能在社区中引发了不同的意见,但其潜力不可忽视,未来的改进将进一步增强其适用性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。