Bun

Bun v1.1.28


Dylan Conway · 2024年9月18日

Bun v1.1.28 發布了!此版本修復了 40 個錯誤 (解決了 51 個 👍)。從 JavaScript 編譯 & 執行 C 語言。path.resolve 快了 30 倍。Windows 上的具名管道。多項 Node.js 相容性改進和錯誤修復。

我們正在舊金山招募系統工程師,以打造 JavaScript 的未來!

安裝 Bun

curl
npm
powershell
scoop
brew
docker
curl
curl -fsSL https://bun.dev.org.tw/install | bash
npm
npm install -g bun
powershell
powershell -c "irm bun.sh/install.ps1|iex"
scoop
scoop install 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

從 JavaScript 編譯 & 執行 C 語言

Bun 現在支援從 JavaScript 編譯和執行 C 語言。這是一種從 JavaScript 使用原生系統函式庫的簡單方法,無需額外增加建置步驟。

這裡瞭解更多關於此功能的資訊。

path.resolve 快了 30 倍

此版本讓 path.resolve 快了 30 倍。

Windows 上的具名管道

感謝 @cirospaciari!Bun 現在在許多 Node.js 和 Bun API 中支援 Windows 上的具名管道!具名管道很有趣,因為它們不完全是磁碟上的檔案。它們是另一種東西,有點像 Unix 網域套接字,但也不盡然。

Node.js 相容性改進

process._exiting 設定為 false

以前,process._exiting 在發出 exit 事件之前會設定為 undefined。現在,它將會是 false

console.log(process._exiting); // Previously: `undefined`, now: `false`

process.on("exit", () => {
  console.log(process._exiting); // true
});

workerDataworker_threads 預設為 null

workerData 的預設值已從 undefined 變更為 null

import { workerData } from "worker_threads";

console.log(workerData); // Previously: `undefined`, now: `null`

已新增 perf_hooks 中遺失的常數

以下常數先前在 perf_hooks 模組中遺失

import { constants } from "perf_hooks";
console.log(constants.NODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE); // 7
console.log(constants.NODE_PERFORMANCE_MILESTONE_ENVIRONMENT); // 2
console.log(constants.NODE_PERFORMANCE_MILESTONE_LOOP_EXIT); // 6
console.log(constants.NODE_PERFORMANCE_MILESTONE_LOOP_START); // 5
console.log(constants.NODE_PERFORMANCE_MILESTONE_NODE_START); // 3
console.log(constants.NODE_PERFORMANCE_MILESTONE_TIME_ORIGIN_TIMESTAMP); // 0
console.log(constants.NODE_PERFORMANCE_MILESTONE_TIME_ORIGIN); // 1
console.log(constants.NODE_PERFORMANCE_MILESTONE_V8_START); // 4
console.log(constants.NODE_PERFORMANCE_ENTRY_TYPE_DNS); // 4
console.log(constants.NODE_PERFORMANCE_ENTRY_TYPE_GC); // 0
console.log(constants.NODE_PERFORMANCE_ENTRY_TYPE_HTTP); // 1
console.log(constants.NODE_PERFORMANCE_ENTRY_TYPE_HTTP2); // 2
console.log(constants.NODE_PERFORMANCE_ENTRY_TYPE_NET); // 3

修復了為 node:zlib 提供的未定義選項的邏輯

node:zlib 中的選項處理已修復,允許選項為 undefined 而不會導致錯誤。

import { createGzip } from "zlib";

createGzip({ level: undefined });

OutgoingMessage.headersSentnode:http 現在設定為 true

在標頭發送後,req.headersSent 將會設定為 true

新增了 timers.promises

為了更好地與 Node.js 相符,node:timers/promises 的匯出現在也可在 timers.promises 中使用。

import { promises } from "timers";

console.time("timeout");
await promises.setTimeout(1000);
console.timeEnd("timeout"); // [1002.48ms] test

修復:在產生程序之前,cwd 會在 node:child_process 中搜尋可執行檔之前更新

以前,Bun 會在呼叫程序的 cwd 中搜尋要產生的可執行檔。如果提供了不同的 cwd,並且為可執行檔路徑提供了相對路徑,則預期的可執行檔將無法找到。現在,Bun 將從目標 cwd 搜尋。

import { spawnSync } from "child_process";
import { join } from "path";

// This will search for `foo` in `./node_modules/package/bin/`
spawnSync("./bin/foo", { cwd: join(import.meta.dir, "node_modules/package") });

修復:napi 可逸出控制代碼作用域中的崩潰

感謝 @190n!已修復 napi 可逸出控制代碼作用域可能導致 Bun 崩潰的錯誤。

修復:napi 控制代碼作用域最終確定中的崩潰

感謝 @190n 的修復!已修復在呼叫 napi finalizer 然後我們嘗試分配控制代碼作用域時會發生的錯誤。這會在 sqlite3 套件的某些情況下導致崩潰。這是 v1.1.27 的回歸問題。

更多修復和改進

修復了 bun installoscpu 欄位的邊緣情況

在某些情況下,bun install 中的 oscpu 欄位無法正確處理排除,導致始終跳過安裝。這已修復。

我們還在 bun install --verbose 中新增了一條額外的記錄訊息,以便更輕鬆地偵錯套件被跳過的原因。

修復:透過 bun run 的 IPC

感謝 @snoglobe!以前,如果您產生一個啟用了 IPC 的 bun run 程序,則 IPC 套接字將在子程序可以使用它之前關閉。這已修復。

修復:Windows 上的不區分大小寫的監看模式

感謝 @dylan-conway!在 Windows 上,監看模式在某些情況下不會偵測到區分大小寫的檔案的變更。這已修復。

修復:bun ./bun.lockb 會印出環境已載入訊息

感謝 @snoglobe!如果您執行 bun ./bun.lockb,並且在同一個目錄中有一個 .env 檔案,Bun 會印出訊息告訴您它已載入 .env 檔案。它不應該載入 .env 檔案,但無論如何,當它載入 .env 檔案時也不應該印出訊息,因為當您只是想從 bun.lockb 查看印出的 yarn.lock 時,這會造成雜訊。這已修復。

修復:Windows 上的 Bun.file(path).text() 有時無法讀取到檔案末尾

感謝 @190n!在 Windows 上,在某些情況下,Bun.file(path).text() 無法讀取到檔案末尾。這已修復。

修復:React 19 生產模式 SSR

React 19 變更了用於識別 JSX 元素的符號。這破壞了 Bun 的 JSX 內聯最佳化。為了繼續支援 React 19,我們暫時停用了最佳化。

感謝 @paperclover 的修復!

修復:TextDecoder 導致 DOMJIT 崩潰

已修復從 TextDecoder 拋出例外時可能發生的崩潰。DOMJIT 是 JavaScriptCore 中的一個很棒的功能,它允許我們在建置時利用型別資訊來呼叫原生實作的 JS 函數,速度快約 30%。我們在不久前新增了對型別陣列的支援,但已被證明在某些情況下會導致崩潰 - 因此我們暫時停用它,並將在我們使此 API 更穩健後重新啟用它。

感謝 12 位貢獻者!