我們正在舊金山招聘系統工程師,以打造 JavaScript 的未來!
此版本修正了 46 個錯誤(解決了 570 個 👍)。它引入了 Musl LibC 支援、JUnit XML 測試輸出、二進制檔案大小減少 6 MB、Worker
preload
選項、更快的適用於小型檔案的 fs.readFile
、針對 Headers
和 URLSearchParams
的深度相等支援、node:net
相容性改進、Unicode 導入錯誤修正,以及多個 bun install
修正。
安裝 Bun
curl -fsSL https://bun.dev.org.tw/install | bash
npm install -g bun
powershell -c "irm bun.sh/install.ps1|iex"
scoop install 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
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
中
[test.reporter]
junit = "junit.xml"
JUnit 是一種常用的 XML 格式,用於與 Jenkins、CircleCI、GitLab CI 等進行 CI/CD 測試整合。
在下一個 Bun 版本中
— Bun (@bunjavascript) 2024 年 11 月 19 日
bun test 支援以 junit xml 格式報告測試結果,該格式用於 GitLab 等 CI/Cd pic.twitter.com/MbP8Q5HQxk
Worker
的 preload
選項
Bun v1.1.35 為 Worker
引入了 preload
選項,允許您在執行 worker 腳本之前評估一個腳本。
globalThis.preloaded = true;
const worker = new Worker(new URL("worker.js", import.meta.url).href, {
preload: new URL("preload.js", import.meta.url).href
});
console.log(globalThis.preloaded); // true
data URI import
支援
Bun v1.1.35 新增了將 data URI 作為模組導入的支援。
import data from "data:text/javascript,export default 'bun!';"
console.log(data) // bun!
感謝 @yamalight!
console.group
和 console.groupEnd
Bun v1.1.35 也新增了對 console.group
和 console.groupEnd
的支援。
console.group("begin");
console.log("indent!");
console.groupEnd();
// begin
// indent!
tsconfig.json
中的 ${configDir}
支援
Bun v1.1.35 在 tsconfig.json
檔案中新增了 ${configDir}
的支援。這使得來自擴展的 tsconfig.json
檔案的相對路徑更加有用,因為它們可以相對於包含派生的 tsconfig.json
的目錄。
{
"extends": "../tsconfig.base.json"
}
{
"compilerOptions": {
"outDir": "${configDir}/dist"
}
}
fs.readFile
對於小型檔案速度提升高達 10%
我們針對小型檔案微調優化了 fs.readFile
,使其速度提升高達 10%。
在下一個 Bun 版本中
— Jarred Sumner (@jarredsumner) 2024 年 11 月 10 日
fs.readFile 在讀取小型檔案時速度提升高達 10%(提醒:1 µs == 1000ns)pic.twitter.com/3vgg8FRfMs
[使用 bun 執行]
VSCode 程式碼鏡頭動作
在下一個 Bun 的 VSCode 擴充功能版本中
— Jarred Sumner (@jarredsumner) 2024 年 11 月 4 日
未命名的 JavaScript 和 TypeScript 檔案具有「使用 bun 執行」程式碼鏡頭動作(僅限於暫存檔案)pic.twitter.com/iv9L6444wv
expect().toEqual()
中的 Headers
和 URLSearchParams
支援
Bun v1.1.35 中新增了對 Headers
和 URLSearchParams
的深度相等支援。這允許您在 expect().toEqual()
、Bun.deepEquals()
和其他深度相等檢查中比較 Headers
和 URLSearchParams
物件中的條目。
以下每個測試先前都會失敗。
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.Server
、net.Socket
和事件發射錯誤的相容性改進
我們在此版本中修正了 node:net
的許多相容性問題。最值得注意的是,現在已完全實作 net.Server
類別,並且已實作 Socket.setKeepAlive
和 Socket.setNoDelay
。
感謝 @cirospaciari!
已修正:node:zlib
類別原型和函數名稱
node:zlib
中的類別缺少 Object.setPrototypeOf
,這會在子類化類別時導致細微問題。這已得到修正,同時也針對來自 node:zlib
的 name
屬性進行了更多測試。
已修正:來自 child_process.spawnSync
的結果信號代碼
來自 child_process.spawnSync
的結果的 signal
屬性未正確設定。以下程式碼會印出 null
而不是 SIGTRAP
。
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!
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
的伺服器中 listen
中 path
選項的處理不當問題。在 Bun v1.1.35 之前,以下程式碼會拋出錯誤,指出 TypeError: undefined is not an object
。
import { createServer } from 'node:net';
const server = createServer();
server.listen({ path: 'socket-path' });
感謝 @ippsav 修正!
錯誤修正
已修正:Unicode 導入和 Unicode 逸出變數名稱
已修正多個關於導入和導出帶有 Unicode 字元的變數的錯誤,感謝 @pfgithub!
import { mile𐃘nautical } from "./lib"
console.log(mile𐃘nautical(10)); // 12
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-fetch
的 Request
物件的 url
屬性未定義。感謝 @pfgithub,此問題已得到修正!
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 標籤的程式碼,因為它是沒有必要的。
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()
會拋出錯誤。
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
的絕對路徑時,修正了斷言失敗。
[install]
cafile = "/does/not/exist/cafile.pem"
感謝 @dylan-conway 修正!
已修正:當停用符號連結時,Windows 上的自動安裝無法運作
Bun 自動安裝 使用符號連結從全域快取解析依賴項。在 Windows 上,如果符號連結不可用,Bun 將無法導入依賴項,因為符號連結將不存在。通過使用 接合點 進行自動安裝連結,此問題已得到修正。
感謝 @dylan-conway!
已修正:使用不存在的 preload 腳本時崩潰
當結合 --hot
或 --watch
為 Bun 提供不存在的 preload 腳本時,修正了崩潰問題。
已修正:使用方法 OPTIONS
的 fetch
始終返回 ""
感謝 @Kapsonfire-DE,修正了導致 fetch
使用方法 OPTIONS
時始終返回空字串的錯誤!
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.promisify
的 setTimeout
修正了 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 不再掛起。