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,然後提供給它們執行的 JavaScript 程式使用。

瀏覽器

值得注意的是,瀏覽器附帶 JavaScript 執行環境,這些環境實作了一組 Web 特定的 API,這些 API 通過全域 window 物件公開。瀏覽器執行的任何 JavaScript 程式碼都可以使用這些 API 在當前網頁的上下文中實作互動式或動態行為。

Node.js

同樣地,Node.js 是一個 JavaScript 執行環境,可用於非瀏覽器環境,例如伺服器。Node.js 執行的 JavaScript 程式可以存取一組 Node.js 特定的全域變數,例如 Bufferprocess__dirname,以及用於執行 OS 層級任務的內建模組,例如讀取/寫入檔案 (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 構建應用程式,包括套件管理器、轉譯器、打包器、腳本執行器、測試執行器等等。