什么是 Bun?一个挑战 Node.js 的一体化运行时

更新于 2026-01-21

Joel Olawanle 2024-01-10

JavaScript 是全球最流行、应用最广泛的编程语言之一。它驱动着 Web 应用、移动应用、桌面软件,甚至嵌入式设备。尽管 JavaScript 被广泛采用,但它也并非没有挑战。和其他技术一样,JavaScript 在性能、兼容性、安全性和复杂性方面都面临诸多问题。

为了解决这些问题,多年来已经开发出多种 JavaScript 运行时。其中,Node.js 和 Deno 尤为突出,它们各自提出了解决 JavaScript 局限性的方案。然而,尽管它们解决了许多问题,同时也引入了新的问题,例如需要不必要的包依赖以及较慢的运行时性能。

如今,出现了 Bun —— 一种 JavaScript 运行时,虽然它已存在一段时间,但团队直到 2023 年 9 月才发布了稳定版本。Bun 被设计为 Node.js 的直接且更高效的替代品。

本文将深入探讨 Bun、其独特功能,以及如何将其集成到你的 JavaScript 项目中。

什么是 Bun?

Bun 是一种主要使用 Zig 编程语言编写的 JavaScript 运行时。它的目标是解决 Node.js 的局限性,同时提供更精简、高效的开发体验。

然而,Bun 并非只是近年来涌现的又一个普通 JavaScript 运行时:它是一个一体化工具包,旨在彻底改变开发者使用 JavaScript 和 TypeScript 的方式。Bun 基于 JavaScriptCore(即 Apple Safari 浏览器所使用的引擎)进行扩展,从而实现快速启动和更优的内存使用效率。

与 Node.js 不同,Bun 不依赖 npm,也不需要外部依赖即可运行。相反,它内置了一个标准库,提供了涵盖各种协议和模块的功能,包括环境变量、HTTP、WebSocket、文件系统等。

Bun 还提供开箱即用的 TypeScript 支持。由于 Bun 内部会对每个 JavaScript 或 TypeScript 源文件进行转译,因此你可以直接编译并运行 TypeScript 文件,而无需额外配置或转译步骤。

Bun 自带一个强大的命令行界面(CLI)工具,让你可以通过以下简单命令来运行、格式化、检查、测试和打包代码:

  • bun run — 使用 Bun 运行 JavaScript 或 TypeScript 文件。
  • bun test — 使用 Bun 内置的测试框架运行单元测试。
  • bun fmt — 使用 Bun 内置的代码格式化工具格式化代码。
  • bun lint — 使用 Bun 内置的代码检查工具对代码进行 lint。
  • bun bundle — 使用 Bun 内置的代码打包工具打包代码。

Bun 的另一个显著特性是热重载(hot reloading)功能,它可以在保留应用程序状态的同时实时刷新代码更改。这比 Node.js 有了显著改进 —— 在 Node.js 中,类似功能需要依赖如 nodemon 这样的外部包,或者使用实验性的 --watch 标志。相比之下,Bun 通过 --hot 标志简化了这一流程。

除了技术优势外,Bun 还拥有一个不断壮大的用户社区,积极为其开发和改进贡献力量。这个活跃的社区确保 Bun 能够持续更新并快速响应需求,同时为学习和故障排查提供了丰富的资源。

Bun 的核心特性

除了热重载、原生 TypeScript 支持和更快的启动时间之外,Bun 还具备多个核心特性,使其在 JavaScript 运行时中脱颖而出,包括其打包器(bundler)、测试运行器(test runner)和包管理器(package manager)。下面我们将详细讨论这些特性。

打包器(Bundler)

打包器的作用是将 JavaScript 代码及其依赖项整合成单个文件,以优化其在浏览器或 Node.js 应用中的加载效率。Node.js 本身缺乏原生打包器,开发者通常需要依赖第三方打包工具,如 Rollup、Webpack 和 Parcel 来处理 JavaScript 代码。

相比之下,Bun 提供了一个内置打包器,几乎无需配置,并支持多种模块格式。它还包含内置优化,可实现更快的打包速度。与其他打包器相比,Bun 的打包器性能显著领先:比 esbuild 快 1.75 倍,比 Parcel 快 150 倍,比 Rollup + Terser 快 180 倍,比 Webpack 快 220 倍。

你可以通过以下命令打包项目:

bun bundle <source> --out-dir <directory>

该命令会在你指定的输出目录中生成输出文件:

使用 Bun 打包项目的代码和终端截图

测试运行器(Test Runner)

测试是软件开发不可或缺的一部分,用于确保代码功能正常并在上线前发现潜在问题。Bun 也将测试运行器集成到了其工具集中。

传统上,Node.js 开发者使用 Jest 等外部测试框架,这些框架虽然功能强大且灵活,但会为项目引入额外的依赖和配置负担。

Bun 的测试运行器采用与 Jest 兼容的语法,但运行速度提升高达 100 倍。

另一方面,Bun 集成了自己的测试运行器,该运行器兼容 Jest 语法,强调速度与兼容性。这种集成方法具有多项优势:

  • 速度:由于测试运行器内置于运行时中,执行测试时无需加载外部测试框架,从而减少开销。结果是测试执行速度更快,尤其适用于大型代码库或持续集成环境。
  • 兼容性:内置测试运行器能与 Bun 的其他功能无缝协作。它利用 Bun 的快速启动时间和高效内存使用,确保测试环境尽可能贴近生产环境。
  • 简洁性:使用内置测试运行器后,你无需再担心运行时与测试框架之间的配置和兼容性维护问题。你可以像编写应用代码一样编写测试,使用相同的语言特性和 API。

Bun 的测试运行器完全兼容各种测试框架。运行测试只需执行 bun test 命令即可。

此外,由于 Bun 原生支持 TypeScript 和 JSX,因此无需额外配置或插件。你可以专注于编写高质量的测试,而不是搭建测试环境。

包管理器(Package Manager)

Bun 的包管理器与 Node.js 兼容,但比 npm、Yarn 和 pnpm 快得多。它提升了安装速度,减少了磁盘占用,并最小化内存占用。

Bun 团队对 Bun、pnpm、npm 和 Yarn 的基准测试

Bun 采用符号链接(symlinks)机制,将每个项目的包链接到一个中央位置,从而避免在后续项目中重复下载模块。虽然符号链接在包管理器中并非全新概念,但 Bun 的实现速度远超其他工具。

开始使用 Bun

要在你的计算机上开始使用 Bun,首先需要安装它。有多种安装方法,包括使用 cURL 命令、npm 或 Homebrew。但需要注意的是,Bun 在 macOS 或 Linux 系统上表现最佳。

要通过 cURL 命令安装 Bun,请在终端中执行以下命令:

curl -fsSL https://bun.sh/install | bash

安装成功后,运行 bun --version 来验证安装是否成功。这将确认 Bun 已准备就绪,可供使用。

现在,你可以开始探索 Bun 的各项功能了。你可以使用 Bun 通过 bun run 命令运行你的 Node.js 项目。此外,若要运行名为 index.ts 的 TypeScript 文件,只需执行 bun run index.ts —— Bun 会自动转译你的 TypeScript 文件,无需额外安装包。

Bun 的用途不仅限于此。它还能与 React 和 Next.js 等 JavaScript 框架无缝集成。若想深入了解 Bun 的更多功能,请查阅官方文档

如何使用 Bun 运行 Node.js 项目

迁移或使用 Bun 运行你的 Node.js 项目非常简单,只需几个 Bun CLI 命令即可完成。请按照以下步骤操作:

首先,安装 Bun。安装完成后,导航至包含你的 Node.js 项目文件(包括 package.json 文件)的目录。在项目工作目录中,运行以下命令:

bun install

上述命令会让 Bun 读取你 Node.js 项目目录中的 package.json 文件,检查是否存在 lock.json 文件(如果有的话),并使用其内置包管理器安装列出的依赖项。

Visual Studio Code 显示使用 Bun 安装依赖项

安装完依赖项后,你就可以使用 Bun 执行项目了。使用 bun run 命令,后跟你项目的入口文件:

bun run <entry-file>

例如,如果你项目的入口文件是 index.js,则输入 bun run index.js

Bun 会执行指定文件中的 JavaScript 或 TypeScript 代码。如果你的项目在 package.json 文件中定义了 start 脚本,也可以使用 bun start 来运行项目。

在 Visual Studio Code 中执行 Bun 项目

迁移到新的运行时环境可能会带来一些挑战。不过,Bun 对 Node.js 模块的强大支持、对全局变量的识别,以及对 Node.js 模块解析算法的遵循,大大简化了从 Node.js 到 Bun 的迁移过程。

假设你正在开发一个使用 dotenv 包管理环境变量的 Node.js 项目。在这种情况下,你可以安全地从项目中移除 dotenv 包及其初始化代码。因为 Bun 内置了自动读取 .env 文件的能力,使得 dotenv 包变得不再必要。

需要注意的是,Bun 仍在持续开发中,因此在迁移过程中务必谨慎行事。

总结

作为一种 JavaScript 运行时,Bun 因以下几个原因而显得尤为重要。它以性能和简洁为核心进行设计,旨在简化开发流程并提升整体效率。其模块化架构允许你只为特定项目选择所需组件,从而减少不必要的开销。

与 Node.js 相比,Bun 具有更轻量的占用空间和更快的启动时间。这一优势对于需要快速响应和高效资源利用的应用至关重要。Bun 的简洁性和模块化方法共同带来了更直观、更可定制的开发体验。