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 仍在开发中。使用它来加速你的开发工作流,或在资源受限的环境(如无服务器函数)中运行更简单的生产代码。我们正在努力实现更完整的 Node.js 兼容性,并与现有的框架集成。加入 Discord 并关注 GitHub 存储库,以了解未来版本的最新信息。

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

什么是运行时?

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

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

浏览器

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

Node.js

类似地,Node.js 是一个 JavaScript 运行时,可用于非浏览器环境,例如服务器。Node.js 执行的 JavaScript 程序可以访问一组特定于 Node.js 的 全局变量,例如 Bufferprocess__dirname,此外还有用于执行操作系统级任务的内置模块,例如读/写文件 (node:fs) 和网络 (node:netnode: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 全局变量(processBuffer)和模块(pathfshttp 等)完全兼容。这是一项正在进行的工作,尚未完成。有关当前状态,请参阅 兼容性页面

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