Bun

Bun v1.1.35


Dylan Conway · 2024 年 11 月 19 日

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

此版本修正了 46 個錯誤(解決了 570 個 👍)。它引入了 Musl LibC 支援、JUnit XML 測試輸出、二進制檔案大小減少 6 MB、Worker preload 選項、更快的適用於小型檔案的 fs.readFile、針對 HeadersURLSearchParams 的深度相等支援、node:net 相容性改進、Unicode 導入錯誤修正,以及多個 bun install 修正。

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

Musl 和 Alpine Linux 的原生支援

Bun v1.1.35 隨附了原生支援 Musl LibC 的二進制檔案,並且現在在每次提交時都經過測試。這是我們排名第一的未完成功能請求,獲得超過 281 個 :+1:。如果您在 Alpine Linux 上執行,Bun 安裝腳本現在將下載這些二進制檔案。

此變更額外影響 Docker 映像檔 oven/bun:alpine 的任何使用。先前,我們依賴 glibc 相容性破解在 Alpine Linux 上執行 Bun - 現在它是原生的。

感謝 @nektro@Electroid

Bun 變得更小 6 MB

我們已將 Windows 上 Bun 二進制檔案的大小減少了 3.5 MB,Linux 和 macOS 上減少了 6 MB。這是通過在堆積而不是堆疊上分配大型結構,以及移除我們的依賴項建立的展開表來實現的。

bun test 的 JUnit XML 輸出支援

Bun v1.1.35 在 bun test 中新增了 JUnit 輸出支援。可以通過帶有 --reporter 的命令行或通過 bunfig.toml 啟用它。

啟用 JUnit 報告器並將輸出寫入 junit.xml

bun test --reporter junit --reporter-outfile junit.xml

或在 bunfig.toml

bunfig.toml
[test.reporter]
junit = "junit.xml"

JUnit 是一種常用的 XML 格式,用於與 Jenkins、CircleCI、GitLab CI 等進行 CI/CD 測試整合。

Workerpreload 選項

Bun v1.1.35 為 Worker 引入了 preload 選項,允許您在執行 worker 腳本之前評估一個腳本。

preload.js
globalThis.preloaded = true;
index.js
const worker = new Worker(new URL("worker.js", import.meta.url).href, {
    preload: new URL("preload.js", import.meta.url).href
});
worker.js
console.log(globalThis.preloaded); // true

data URI import 支援

Bun v1.1.35 新增了將 data URI 作為模組導入的支援。

index.ts
import data from "data:text/javascript,export default 'bun!';"
console.log(data) // bun!

感謝 @yamalight

console.groupconsole.groupEnd

Bun v1.1.35 也新增了對 console.groupconsole.groupEnd 的支援。

index.js
console.group("begin");
console.log("indent!");
console.groupEnd();
// begin
//   indent!

tsconfig.json 中的 ${configDir} 支援

Bun v1.1.35 在 tsconfig.json 檔案中新增了 ${configDir} 的支援。這使得來自擴展的 tsconfig.json 檔案的相對路徑更加有用,因為它們可以相對於包含派生的 tsconfig.json 的目錄。

tsconfig.json
{
    "extends": "../tsconfig.base.json"
}
tsconfig.base.json
{
    "compilerOptions": {
        "outDir": "${configDir}/dist"
    }
}

fs.readFile 對於小型檔案速度提升高達 10%

我們針對小型檔案微調優化了 fs.readFile,使其速度提升高達 10%。

[使用 bun 執行] VSCode 程式碼鏡頭動作

expect().toEqual() 中的 HeadersURLSearchParams 支援

Bun v1.1.35 中新增了對 HeadersURLSearchParams 的深度相等支援。這允許您在 expect().toEqual()Bun.deepEquals() 和其他深度相等檢查中比較 HeadersURLSearchParams 物件中的條目。

以下每個測試先前都會失敗。

index.test.js
test("Headers", () => {
    const headers1 = new Headers([["a", "b"]]);
    const headers2 = new Headers([["a", "c"]]);
    expect(headers1).not.toEqual(headers2);
});
test("URLSearchParams", () => {
    const params1 = new URLSearchParams("a=b");
    const params2 = new URLSearchParams("a=c");
    expect(params1).not.toEqual(params2);
});

Node 相容性改進

node:net 針對 net.Servernet.Socket 和事件發射錯誤的相容性改進

我們在此版本中修正了 node:net 的許多相容性問題。最值得注意的是,現在已完全實作 net.Server 類別,並且已實作 Socket.setKeepAliveSocket.setNoDelay

感謝 @cirospaciari

已修正:node:zlib 類別原型和函數名稱

node:zlib 中的類別缺少 Object.setPrototypeOf,這會在子類化類別時導致細微問題。這已得到修正,同時也針對來自 node:zlibname 屬性進行了更多測試。

已修正:來自 child_process.spawnSync 的結果信號代碼

來自 child_process.spawnSync 的結果的 signal 屬性未正確設定。以下程式碼會印出 null 而不是 SIGTRAP

index.js
import { spawnSync } from 'child_process';
console.log(spawnSync(process.argv0, ['-e', 'process.kill(process.pid, "SIGTRAP")']).signal);
// Before:      null
// Bun v1.1.35: SIGTRAP

感謝 @ippsav 修正!

已修正:node:https Agent 原型鏈回歸

已修正導致 node:https Agent 實例的原型鏈設定不正確的回歸問題,感謝 @nektro

index.js
import { request } from 'node:https';
console.log(request('https://bun.dev.org.tw/', { agent: false }).end().host);
// Before:        ConnectionRefused: Unable to connect. Is this computer able to access the url?
//                 path: "https://bun.dev.org.tw:80/"
// Bun v1.1.35:   bun.sh

已修正:使用 Unix socket 路徑的 node:net listen

修正了來自 node:net 的伺服器中 listenpath 選項的處理不當問題。在 Bun v1.1.35 之前,以下程式碼會拋出錯誤,指出 TypeError: undefined is not an object

index.js
import { createServer } from 'node:net';
const server = createServer();
server.listen({ path: 'socket-path' });

感謝 @ippsav 修正!

錯誤修正

已修正:Unicode 導入和 Unicode 逸出變數名稱

已修正多個關於導入和導出帶有 Unicode 字元的變數的錯誤,感謝 @pfgithub

index.js
import { mile𐃘nautical } from "./lib"
console.log(mile𐃘nautical(10)); // 12
lib.js
export const mile𐃘nautical = int => Math.round(int * 1.150779448)

已修正:Windows 具名管道使用正斜線

Bun 錯誤處理了 Windows 上帶有正斜線的具名管道。感謝 @cirospaciari,此問題已得到修正!

來自我們更新的測試的範例

test(`\\\\.\\pipe\\test\\${randomUUID()}`);
test(`\\\\?\\pipe\\test\\${randomUUID()}`);
test(`//?/pipe/test/${randomUUID()}`);
test(`//./pipe/test/${randomUUID()}`);
test(`/\\./pipe/test/${randomUUID()}`);
test(`/\\./pipe\\test/${randomUUID()}`);
test(`\\/.\\pipe/test\\${randomUUID()}`);

已修正:vscode 除錯器錯誤修正

除非使用了 --inspect 標誌,否則 vscode 除錯器未正確啟用。這導致範圍變數未顯示在除錯器中。

感謝 @RiskyMH 修正!

已修正:node-fetch Request.url 錯誤修正

一個錯誤導致來自 node-fetchRequest 物件的 url 屬性未定義。感謝 @pfgithub,此問題已得到修正!

index.js
import { Request } from 'node-fetch';
console.log(new Request('https://bun.dev.org.tw/').url);
// Before: undefined
// After: 'https://bun.dev.org.tw/'

已修正:剖析自我關閉 JSX 標籤時的 Panic

修正了 JSX 和函數定義的組合會導致 panic 的崩潰問題。此修復涉及刪除用於檢查自我關閉 JSX 標籤的程式碼,因為它是沒有必要的。

index.jsx
function Input() {
    return <input>{(() => { if (true) { } })}</input>
}
function fn1() { return 1; }
function fn2() { return 2; }

感謝 @ceymard 修正!

已修正:Bun.CryptoHasher 中的回歸

在 Bun v1.1.34 中引入了一個回歸問題,其中當給定 Blob 時,Bun.CryptoHasher.update() 會拋出錯誤。

index.js
const hasher = new Bun.CryptoHasher("sha512")
hasher.update(new Blob(["hello blob!"]));
hasher.digest();

感謝 @dylan-conway 修正!

已修正:遷移具有帶有腳本的根依賴項的 package-lock.json

遷移具有具有生命週期腳本的根依賴項的 package-lock.json 時觸發了斷言失敗。由 @dylan-conway 修正!

已修正:在 bun install 中使用不存在的 cafile 時的斷言失敗

當為 Windows 上的 bun install 提供了不存在的 cafile 的絕對路徑時,修正了斷言失敗。

bunfig.toml
[install]
cafile = "/does/not/exist/cafile.pem"

感謝 @dylan-conway 修正!

Bun 自動安裝 使用符號連結從全域快取解析依賴項。在 Windows 上,如果符號連結不可用,Bun 將無法導入依賴項,因為符號連結將不存在。通過使用 接合點 進行自動安裝連結,此問題已得到修正。

感謝 @dylan-conway

已修正:使用不存在的 preload 腳本時崩潰

當結合 --hot--watch 為 Bun 提供不存在的 preload 腳本時,修正了崩潰問題。

已修正:使用方法 OPTIONSfetch 始終返回 ""

感謝 @Kapsonfire-DE,修正了導致 fetch 使用方法 OPTIONS 時始終返回空字串的錯誤!

index.js
const res = await fetch('https://google.com', { method: 'OPTIONS' });
console.log(await res.text());

已修正:在用於入口點的複製檔案載入器上使用 onLoad 外掛程式時,Bundler 崩潰

onLoad 外掛程式與入口點匹配,並且入口點具有複製檔案載入器類型(帶有 experimentalCss: false 的 css、wasm、...)時,修正了 Bun.build 中的崩潰問題。感謝 @zackradisic 修正!

已修正:使用 node:util.promisifysetTimeout

修正了 Bun v1.1.27 中的一個回歸問題,如果未在同一個檔案中導入 node:timers,則 setTimeout 將沒有 promisify 實作。可以使用以下程式碼重現此錯誤

bun --print "require('util').promisify(setTimeout)(1000).then(() => 'done')"

現在,這將正確等待一秒鐘並印出 done

感謝 @pfgithub 修正!

已修正:Linux 上的 Hang

在 Bun v1.1.34 中,我們允許垃圾收集器在事件迴圈休眠時執行工作。這減少了 Bun 在長時間運行的進程中的記憶體使用量。但是,在某些情況下,此變更也 導致死鎖,從而導致 Bun 進程掛起。我們正在研究如何在不引起掛起的情況下保持記憶體使用量減少,但在此期間,我們已還原 v1.1.34 中的變更,以便 Bun 不再掛起。

感謝 16 位貢獻者!