Bun v0.7.2 新增了對 node:worker_threads
、node:diagnostics_channel
、BroadcastChannel
的支援,提升了與 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 編碼,以及針對WebSocket
和node: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 -fsSL https://bun.dev.org.tw/install | bash
npm install -g bun
brew tap oven-sh/bun
brew install bun
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
您現在可以使用 postMessage
和 structuredClone()
來複製 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 倍
在 Bun 的下一個版本中
— Jarred Sumner (@jarredsumner) August 3, 2023
建立大型的新型陣列的速度提升高達 40 倍,感謝 @Constellation pic.twitter.com/PRvKsVh7GE
模組解析變更:browser
和 module
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 位元組的洩漏,但在長時間運行的進程中很快就會累積起來。
修復了 fetch、Bun.spawn、napi、Bun.write、Bun.connect、Bun.listen、streams 中的記憶體洩漏... pic.twitter.com/FqhSg4HTZy
— Jarred Sumner (@jarredsumner) July 30, 2023
response.clone()
中的記憶體洩漏問題已修復。標頭物件被複製了兩次。
修復了 response.clone() 中的記憶體洩漏 pic.twitter.com/6c37kllgWC
— Jarred Sumner (@jarredsumner) July 31, 2023
錯誤修復
我們也修復了一些錯誤
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"
時的崩潰問題。