Bun 是一个用于 JavaScript 和 TypeScript 应用程序的一体化工具包。它以一个名为 bun 的可执行文件形式发布。
其核心是 Bun 运行时,这是一个快速的 JavaScript 运行时,被设计为 Node.js 的直接替代品。它用 Zig 编写,底层由 JavaScriptCore 提供支持,大大减少了启动时间和内存使用。
bun run index.tsx  # TS and JSX supported out of the boxbun 命令行工具还实现了一个测试运行器、脚本运行器和兼容 Node.js 的包管理器,所有这些都比现有工具快得多,并且可以在现有 Node.js 项目中使用,几乎无需更改。
bun run start                 # run the `start` scriptbun install <pkg>             # install a packagebun build ./index.tsx         # bundle a project for browsersbun test                      # run testsbunx 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 特定的全局对象,例如 Buffer、process 和 __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,如 fetch、WebSocket和ReadableStream。Bun 由 Apple 为 Safari 开发的 JavaScriptCore 引擎提供支持,因此某些 API,如Headers和URL,直接使用了 Safari 的实现。
- Node.js 兼容性。除了支持 Node 风格的模块解析,Bun 的目标是与内置的 Node.js 全局对象 (process,Buffer) 和模块 (path,fs,http等) 完全兼容。这是一项正在进行的工作,尚未完成。 请参阅兼容性页面了解当前状态。
Bun 不仅仅是一个运行时。其长期目标是成为一个用于使用 JavaScript/TypeScript 构建应用程序的内聚基础工具包,包括包管理器、转译器、打包器、脚本运行器、测试运行器等。