Bun

Bun v1.0.9


Jarred Sumner · 2023年11月5日

Bun v1.0.9 修復了影響在 Vercel 和舊款 CPU 上使用的回歸錯誤、一個 Bun.spawn 錯誤、與 peer dependency 安裝相關的邊緣案例,以及一個 JSX 轉譯器錯誤修復。

Bun 是一個速度驚人的 JavaScript 執行時環境、打包器、轉譯器和套件管理器 — 功能All-in-one。如果您錯過了,這裡列出 Bun 最近的一些變更

  • v1.0.0 - 首個穩定版本!
  • v1.0.1 - 為 .json 和 .toml 檔案新增具名匯入,修復了 bun installnode:pathBuffer
  • v1.0.2 - 讓 --watch 更快並修復大量錯誤
  • v1.0.3 - emitDecoratorMetadata 和 Nest.js 支援,修復了私有 registry 等問題
  • v1.0.4 - server.requestIP、runtime plugins 中的虛擬模組等等
  • v1.0.5 - 修復了 fetch() 的記憶體洩漏、node:crypto 模組中的 KeyObject 支援、bun:test 中的 expect().toEqualIgnoringWhitespace 等等
  • v1.0.6 - 修復了 3 個錯誤(解決了 85 個 👍 反應),在 package.json 中實作了 overridesresolutions,並修復了影響 Docker 使用 Bun 的回歸錯誤
  • v1.0.7 - 修復了 59 個錯誤(解決了 78 個 👍 反應),在 bun install 中實作了可選的 peer dependencies,並改進了 Node.js 相容性。
  • v1.0.8 - 修復了 138 個錯誤(解決了 257 個 👍 反應),讓 require() 使用的記憶體減少 30%,為 bun test 新增了模組模擬,修復了更多 bun install 錯誤

安裝 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

「Illegal instruction」和 v1.0.8 版本的 glibc 符號版本回歸錯誤已修復

在 Bun v1.0.8 中,我們將內部建置系統從客製化的 2,000 行 Makefile 移至 CMake 和 Ninja。這是為了簡化我們為貢獻者提供的建置系統,並讓在 Windows 上建置 Bun 更加容易。

在此過程中,出現了三個回歸錯誤

  1. Bun v1.0.8 在舊款 CPU(例如 Intel Xeon E5-2670 v1)和某些 Linux arm64 CPU 上會因「Illegal instruction」錯誤而崩潰。這影響了 Docker 使用者和舊款 CPU 的使用者。
  2. Bun v1.0.8 對於使用低於 glibc 2.28 的使用者會因「symbol not found」錯誤而崩潰。這影響了 Vercel 使用者和舊版 Linux 發行版的使用者。
  3. bun init 會在 README.md 中錯誤地印出版本號碼

這些回歸錯誤已修復,但對於 1.0 版本後的產品來說,這令人感到抱歉,我在此致歉。

以下是我們為防止再次發生這種情況所做的措施

  1. 我們正在新增一個 CI 工作,該工作會在搭載舊款 CPU 的機器上執行,以測試 Bun 在舊款 CPU 上的效能
  2. 我們正在新增一個 CI 工作,以檢查 Bun 最終可執行檔使用的 glibc 最低版本,如果它請求的版本太新,則會擲回錯誤
  3. 我們新增了一個測試,以確保 bun initREADME.md 中印出正確的版本號碼

Bun.spawn 錯誤修復

此版本修復了 Bun.spawn 中的兩個錯誤。我們也為 Bun.spawn 新增了更多測試。

已修復:await spawn(...).exited 有時會傳回字串

await child.exited 有時會傳回字串而不是數字。該字串是導致程序結束的訊號。

import { spawn } from "bun";

const child = spawn(["sleep", "1"]);
child.kill();
const code = await child.exited;

// Before:
console.log(code); // "SIGHUP"

// After:
console.log(code); // 129

現在 await child.exited 會傳回數字,而不是字串。這與我們的 TypeScript 類型宣告、文件說明以及 bash 的結束代碼行為一致。

如果程序正常結束,則傳回 0。如果程序因訊號而結束,則傳回 128 + 訊號編號。例如,如果程序因 SIGTERM 而結束,則會傳回 128 + 15 = 143

已修復:導致 await spawn(...).exited 無法解析的邊緣案例

可能導致 await spawn(...).exited 無法解析的邊緣案例已修復。

bun install peer dependency 版本過多錯誤修復

在此版本中,我們開始將其他套件管理器的某些測試移植到 Bun。

其中一個測試發現一個問題,Bun 無法重複使用現有專案中 peer dependency 的版本。此問題已修復,以符合 npm 的行為。

當 peer dependency 的選定版本與 package.json 中指定的版本範圍不相容時,我們也新增了一個警告。

JSX 轉譯器錯誤修復

以下任一行程式碼先前都會因斷言失敗而導致執行階段 panic

<A key={() => {}} b={class {}} />
<A key={() => {}} b={() => {}} />

此問題已修復。

此錯誤是由於對 key prop 的特殊處理導致 AST 節點未按照剖析順序被訪問。如果 key prop 建立了一個作用域(例如定義函數或類別),則可能會發生此錯誤。

感謝 @dylan-conway 修復此錯誤!