Bun

Bun v1.1.2


Jarred Sumner · 2024年4月6日

Bun 是一個速度極快的 JavaScript 執行階段、打包器、轉譯器和套件管理器 — 功能All-in-One。

Bun v1.1.2 修復了 4 個錯誤(解決了 44 個 👍 表情符號)。已修復 Windows 上 vite dev、next dev 和儲存 bun.lockb 時的 EBUSY 問題。Bun Shell 取得 seq、yes、basename 和 dirname 的支援。已修復 TypeScript 解析的邊緣案例。已修復導致「無法到達的程式碼」錯誤的錯誤。已重寫 Windows 上的 fs.watch 以提升效能和可靠性。

先前的版本

  • v1.1.1 Bun v1.1.1 修復了 20 個錯誤(解決了 60 個 👍 表情符號)。新增子 Shell 和位置引數支援。錯誤中列印的原始碼不再填滿您的終端機。升級 JavaScriptCore,其中包括 RegExp、類型陣列、String indexOf 和 String replace 的效能改進。錯誤物件和 JIT 編譯的函式呼叫使用更少的記憶體。修復了 Windows 上 bun install 的數個錯誤。修復了 Windows 上 Bun.serve() 的錯誤。修復了影響 .toml 檔案中跳脫序列和 Windows 路徑的 TOML 解析器錯誤。
  • v1.1.0 Bundows。Windows 支援來了!此外,還有 JSON IPC Node <-> Bun。

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

Windows 支援改進

已修正:儲存 bun.lockb 時的 EBUSY

在將依賴項新增至 bun.lockb 時,有時 Windows 上的 bun install 會擲回 EBUSY 錯誤。這是因為檔案控制代碼開啟時間過長且未請求正確的權限所導致。

Windows 權限仍然很複雜。

已修正:在 Windows 上將 tarball 解壓縮到快取時的 ENOENTEEXIST 錯誤

有時,套件在 Windows 上安裝失敗,原因是解壓縮 npm 套件的 tarball 時發生競爭條件,導致 ENOENTEEXIST 錯誤。此錯誤主要是由於在開啟新 tarball 的目錄時請求了錯誤的權限所導致。我們已使程式碼更具錯誤容忍性,現在它將請求正確的權限。

已修正:在 Windows 上使用 next devvite dev 時的 EBUSY

v1.1.0 中的迴歸問題導致在 Windows 上執行 next devvite dev 時擲回 EBUSY 錯誤。主要原因是權限問題。我們在不需要時保持開啟受監看目錄的檔案控制代碼。

我們已更新整合測試,以在未來捕捉到此錯誤。

在此過程中,我們已重寫 fs.watch 在 Windows 上的運作方式。fs.watch 將自動重複資料刪除檔案系統路徑,因此如果多個監看器監看相同的路徑,它將僅使用其中一個監看器的資源。這應使 fs.watch 更快、更可靠且使用更少的記憶體。

已修正:bun install 無法安裝具有無效檔案路徑的 tarball

Windows 不支援檔案路徑中包含 ?<> 等字元。有時,npm 套件在其發佈的 tarball 的檔案路徑中包含這些字元。Bun 之前未正確處理此問題。現在,bun install 在 Windows 上的行為與 npm install 相同,並成功安裝套件,但會插入取代字元。

已修正:CouldntReadCurrentDirectory 錯誤

Bun 在目錄中請求過多權限,這可能會導致 Windows 上非管理員帳戶擲回 CouldntReadCurrentDirectory 錯誤。

重寫 Windows 上的 fs.watch

我們重寫了 Windows 上 fs.watch 的實作,使其更可靠且更快速。

現在它會在內部重複資料刪除正在監看的檔案路徑,從而在 glob 中使用 fs.watch 之類的功能時減少資源使用量。

Shell 和 bun run 改進

在 Bun Shell 中支援 seqyesbasenamedirname

現在 Bun Shell 中支援 GNU Coreutils 命令 seqyesbasenamedirname,感謝 @nektro

foo/hello.js
import { $ } from "bun";

await $`seq 0 3`;
// 0
// 1
// 2
// 3

await $`basename $1`; // hello.js
await $`dirname $1`; // foo

已修正:環境變數中 * 的解析錯誤

已修復環境變數中 * 的一些解析錯誤,感謝 @zackradisic

已修復可能導致 bun install 暫停一段時間的錯誤。

Bun install 改進

在沒有 lockfile 的情況下安裝 --production

您現在可以在沒有 lockfile 的情況下使用 bun install --productionbun install --frozen-lockfile。這對於您可能沒有將 bun.lockb 簽入 git 的 CI 環境很有幫助。之前沒有真正的原因禁止這樣做,因此我們只是取消了禁令。

已修正:下載 tarball 時可能發生的崩潰

已修復可能導致 bun install 在下載 tarball 時崩潰的錯誤。這有時會在 Windows 版 Bun 中導致「Unreachable code reached」錯誤。

WebKit 升級

我們再次升級了 WebKit!令人驚嘆的 @Constellation 和 JSC 團隊為我們帶來了新的效能改進和錯誤修復。

快 5 倍的 { ...obj } 複製

在微基準測試中,如下所示的程式碼現在執行速度快了 5 倍

{ ...obj }

此最佳化特定於具有單個 ... 展開運算符的空物件字面量。

bench
splat.mjs
bench
❯ bun splat.mjs
cpu: Apple M1 Max
runtime: bun 1.1.2 (arm64-darwin)

benchmark       time (avg)             (min … max)       p75       p99      p995
-------------------------------------------------- -----------------------------
{ ...obj }   20.33 ns/iter   (18.38 ns … 92.75 ns)  20.08 ns  49.05 ns  53.68 ns

❯ bun-1.1.0 splat.mjs
cpu: Apple M1 Max
runtime: bun 1.1.0 (arm64-darwin)

benchmark       time (avg)             (min … max)       p75       p99      p995
-------------------------------------------------- -----------------------------
{ ...obj }  105.38 ns/iter (100.83 ns … 188.37 ns) 103.29 ns 146.97 ns 149.57 ns
splat.mjs
import { bench, run } from "mitata";

const obj = {
  a: 1,
  b: 2,
  c: 3,
  d: 4,
  e: 5,
  f: 6,
  g: 7,
  h: 8,
  i: 9,
};

bench("{ ...obj }", () => {
  return { ...obj };
});

await run();

解析器改進

已修正:TypeScript 解析邊緣案例

一個錯誤導致 Bun 的解析器無法解析以下 TypeScript 程式碼

var bar: Bar extends string | infer Bar extends string ? Bar : never;
var bar: Bar extends string & infer Bar extends string ? Bar : never;

此錯誤已修復,感謝 @dylan-conway

感謝 7 位貢獻者!