Bun

Bun v0.7.2


Jarred Sumner · 2023年8月3日

Bun v0.7.2 新增了對 node:worker_threadsnode:diagnostics_channelBroadcastChannel 的支援,提升了與 Node.js 的相容性,並修復了幾個嚴重的記憶體洩漏問題。

我們正在招募 C/C++ 和 Zig 工程師,以打造 JavaScript 的未來! 加入我們的團隊 →

Bun 是一個速度極快的 JavaScript 執行時環境、打包器、轉譯器和套件管理器 — 集所有功能於一身。在過去幾個月中,我們最近發布了很多針對 Bun 的變更,這裡有一個摘要,以防您錯過了。

  • v0.6.12 - 在 Error.stack 中支援 Sourcemap、Bun.file().exists() 和 Node.js 錯誤修復。
  • v0.6.13 - 實作了模擬 Date、更快的 base64 編碼,以及針對 WebSocketnode:tls 的修復。
  • v0.6.14 - process.memoryUsage()process.cpuUsage()process.on('beforeExit', cb)process.on('exit', cb) 和崩潰修復
  • v0.7.0 - Web Workers、--smol、structuredClone()、WebSocket 可靠性改進、node:tls 修復等等。
  • v0.7.1 - ES Modules 加載速度提升 30% - 250%、fs.watch 修復,以及許多 node:fs 相容性改進。

安裝 Bun

curl
npm
brew
docker
curl
curl -fsSL https://bun.dev.org.tw/install | bash
npm
npm install -g bun
brew
brew tap oven-sh/bun
brew install bun
docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

升級 Bun

bun upgrade

Node.js worker_threads

您現在可以在 Bun 中使用 node:worker_threads 模組。Worker 仍然是全域變數,但您現在可以在 Bun 中使用依賴 node:worker_threads 的套件和框架。

import { Worker } from "node:worker_threads";

const worker = new Worker("./worker.js");

bun . - 執行主檔案

您現在可以使用 bun . 在 Bun 中執行專案,當您不想輸入檔案路徑時。它等同於執行 import '.'

bun .

BroadcastChannel

BroadcastChannel API 現在可在 Bun 中使用。它允許您在多個 Worker 執行緒和主執行緒之間發布和訂閱訊息。這是一個新的全域變數,因此您可以像在網路瀏覽器中一樣直接使用它,無需導入任何內容。

const channel = new BroadcastChannel("my-channel");
const message = { hello: "world" };

channel.onmessage = (event) => {
  console.log(event.data); // { hello: "world" }
};
channel.postMessage(message);

感謝 @dylan-conway 讓這個功能在 Bun 中運作,以及 WebKit/Safari 團隊的原創實作。

postMessage() 現在支援 Error

您現在可以使用 postMessagestructuredClone() 來複製 Error 物件。

const error = new Error("hello world");
const clone = structuredClone(error);
console.log(clone.message); // "hello world"

Node.js node:diagnostics_channel 支援

您現在可以在 Bun 中使用 node:diagnostics_channel 模組。node:diagnostics_channel 模組提供了一個 API,用於建立具名的通道,以報告任意訊息資料,用於診斷目的。

建立新的 TypedArray 速度提升高達 40 倍

模組解析變更:browsermodule exports 條件

Bun 不再遵循 "browser""module" package.json "exports" 條件。這解決了影響 Astro CLI、axios 等的錯誤。

  • Bun 不是網路瀏覽器,因此 Bun 不應使用 "browser" package.json exports 條件。
  • "module" exports 條件由舊版本的 tslib 使用,這會破壞依賴 tslib 的套件。我們仍然在 bun build 中支援這個,但在運行時不支援。

Bun 在運行時遵循的 package.json "exports" 條件列表現在如下:

  • "bun"
  • "worker"
  • "node"
  • "default"

從 ES 模組導入時,會使用 "import",而從 CommonJS 模組導入時,也會使用 "require"

這在技術上是一個破壞性變更,但通常更像是一個「修復」變更。

修復了 2 個記憶體洩漏

Bun 的原生程式碼中持有的強引用中存在記憶體洩漏問題已修復。這是一個約 16 位元組的洩漏,但在長時間運行的進程中很快就會累積起來。

response.clone() 中的記憶體洩漏問題已修復。標頭物件被複製了兩次。

錯誤修復

我們也修復了一些錯誤

PrintingErrorWriteFailed 錯誤已修復

來自非同步轉譯器變更的回歸問題導致某些導入因 PrintingErrorWriteFailed 而失敗。此問題已修復。

file loader 錯誤修復

來自非同步轉譯器變更的回歸問題導致 file loader 導入無法加載,除非明確透過 `--loader` 傳遞。此問題已修復。

require('node:module') 現在是一個 Module 建構子

require('node:module') 現在是一個 Module 建構子,與 Node.js 中相同。

bun install --production 搭配 workspaces

修復了在 workspace 中使用 `--production` 時,導致套件未在 lockfile 中更新的錯誤。此問題已修復。

node:http 檔案上傳錯誤已修復

一個錯誤,該錯誤導致透過 node:http 上傳二進制檔案會產生編碼錯誤的資料,已由 @Hanaasagi 修復。感謝 @Hanaasagi!

內部變更

我們將 JavaScript builtins 從 ES 模組遷移到 CommonJS,這將 "crypto" 的啟動時間縮短約 30%,並修復了導入 "astro" 時的崩潰問題。

變更日誌

查看完整的變更日誌