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 構建應用程式的內聚基礎工具包,包括包管理器、轉譯器、打包器、指令碼執行器、測試執行器等。