Bun

什么是 Bun?

Bun 是一个适用于 JavaScript 和 TypeScript 应用程序的一体化工具包。它以名为 bun 的单个可执行文件形式发布。

其核心是 Bun 运行时,这是一个快速 JavaScript 运行时,旨在作为 Node.js 的直接替代品。它使用 Zig 编写,并由底层的 JavaScriptCore 提供支持,从而显著减少启动时间和内存使用量。

bun run index.tsx  # TS and JSX supported out of the box

bun 命令行工具还实现了测试运行器、脚本运行器和 Node.js 兼容的包管理器,所有这些都比现有工具快得多,并且可以在现有的 Node.js 项目中使用,几乎不需要更改。

bun run start                 # run the `start` script
bun install <pkg>             # install a package
bun build ./index.tsx         # bundle a project for browsers
bun test                      # run tests
bunx cowsay 'Hello, world!'   # execute a package

从下面的快速链接之一开始,或继续阅读以了解有关 Bun 的更多信息。

什么是运行时?

JavaScript(或更正式的名称是 ECMAScript)只是编程语言的规范。任何人都可以编写 JavaScript 引擎,该引擎接受有效的 JavaScript 程序并执行它。当今使用的两个最流行的引擎是 V8(由 Google 开发) 和 JavaScriptCore(由 Apple 开发)。两者都是开源的。

但是大多数 JavaScript 程序并非在真空中运行。它们需要一种访问外部世界以执行有用任务的方式。这就是运行时的用武之地。它们实现了额外的 API,然后这些 API 可供它们执行的 JavaScript 程序使用。

浏览器

值得注意的是,浏览器附带 JavaScript 运行时,这些运行时实现了一组 Web 特定的 API,这些 API 通过全局 window 对象公开。浏览器执行的任何 JavaScript 代码都可以使用这些 API 在当前网页的上下文中实现交互式或动态行为。

Node.js

同样,Node.js 是一个 JavaScript 运行时,可以在非浏览器环境(如服务器)中使用。Node.js 执行的 JavaScript 程序可以访问一组 Node.js 特定的 全局变量,例如 Bufferprocess__dirname,以及用于执行操作系统级别任务的内置模块,例如读取/写入文件 (node:fs) 和网络 (node:net, node:http)。Node.js 还实现了基于 CommonJS 的模块系统和解析算法,该算法早于 JavaScript 的原生模块系统。

Bun 被设计为 Node.js 的更快、更精简、更现代的替代品。

设计目标

Bun 从头开始设计,充分考虑了当今的 JavaScript 生态系统。

  • 速度。Bun 进程启动速度目前比 Node.js 快 4 倍(亲自尝试一下!)
  • TypeScript 和 JSX 支持。您可以直接执行 .jsx.ts.tsx 文件;Bun 的转译器在执行之前将它们转换为纯 JavaScript。
  • ESM 和 CommonJS 兼容性。世界正在转向 ES 模块 (ESM),但 npm 上数百万的包仍然需要 CommonJS。Bun 推荐使用 ES 模块,但也支持 CommonJS。
  • Web 标准 API。Bun 实现了标准的 Web API,例如 fetchWebSocketReadableStream。Bun 由 JavaScriptCore 引擎提供支持,该引擎由 Apple 为 Safari 开发,因此某些 API(例如 HeadersURL)直接使用 Safari 的实现
  • Node.js 兼容性。除了支持 Node 风格的模块解析之外,Bun 还旨在完全兼容内置的 Node.js 全局变量 (process, Buffer) 和模块 (path, fs, http 等)。这是一项正在进行的工作,尚未完成。 有关当前状态,请参阅兼容性页面

Bun 不仅仅是一个运行时。其长期目标是成为一个有凝聚力的基础设施工具包,用于使用 JavaScript/TypeScript 构建应用程序,包括包管理器、转译器、打包器、脚本运行器、测试运行器等等。