Bun

Bun v1.1.16


Chloe Caruso · June 23, 2024

Bun v1.1.16 釋出了!此版本修正了 41 個錯誤(解決了 221 個 👍)。bun test 中 lcov 程式碼涵蓋率報告、從包含 Gitlab 和 Bitbucket 的私人 git 儲存庫安裝依賴項。Buffer.from(string, "base64") 在大型輸入上速度提升了 6 到 30 倍。修復了 bun patchbun install、N-API 附加元件、轉譯器錯誤修復和 Node.js 相容性改進的錯誤。

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

先前的版本

  • v1.1.14 修復了 63 個錯誤(解決了 519 個 👍)。使用 bun patch 修補 node_modules。bun:sqlite 中無 ORM 的物件映射。將所有 fetch() 呼叫記錄為 curl 命令。Node.js 相容性改進。bun install 錯誤修復、bun:sqlite 錯誤修復、Windows 錯誤修復。以及更多。
  • v1.1.10 修復了 20 個錯誤。在 Windows 上,未快取的 bun install 速度提升了 2 倍。fetch()` 使用的記憶體最多減少了 2.8 倍。bun install、sourcemaps、Windows 穩定性改進和 Node.js 相容性改進的多項錯誤修復
  • v1.1.0 Bundows。Windows 支援來了!

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

LCOV 程式碼涵蓋率報告器

當使用 bun test --coverage 時,可以使用 --coverage-reporter lcov 將涵蓋率報告匯出為標準 lcov 格式

bun test --coverage --coverage-reporter lcov

預設情況下,這會輸出一個 coverage/lcov.info 檔案。可以使用 --coverage-dir 變更涵蓋率目錄

若要始終啟用涵蓋率報告,已將兩個新選項新增至 bunfig.toml

bunfig.toml
[test]

# always enable coverage
coverage = true

# new
coverageReporter = ["text", "lcov"]  # default ["text"]
coverageDir = "./path-to-folder"  # default "coverage"

感謝 @exoego 實作此功能。

bun install git ssh 儲存庫

bun install 現在支援透過 ssh 進行身分驗證,以從私人 git 儲存庫安裝依賴項。這些依賴項會透過 git clone 使用您的 git SSH 金鑰進行克隆。

bun i git@github.com:paperclover/secret-utilities.git

installed secret-utilities@git+ssh://git@github.com:paperclover/secret-utilities.git#5a7279074f22e98d64507cb5149633c73897395f

1 package installed [904.00ms]

這使得在使用來自 Gitlab、Bitbucket 或其他 git 託管服務的私人儲存庫時,bun install 更易於使用。GitHub 儲存庫有時會受到此問題的影響,但頻率較低。

感謝 @Eckhardt-D 實作此功能!

Buffer.from(string, "base64") 在大型輸入上速度提升了 6 到 30 倍

透過將我們的 base64 解碼實作變更為使用 simdutf,使用 Buffer.from(string, "base64") 速度更快,尤其是在大型輸入上

bun build 中輸出 Source Map URL

為了告訴瀏覽器開發人員工具在哪裡可以找到 sourcemaps,工具會在檔案末尾插入 //# sourceMappingURL= 註解。

先前,Bun 沒有提供透過此註解連結到外部、非內聯 sourcemaps 的方法。

您現在可以使用 --sourcemap=linked 來告訴 Bun 在捆綁檔案的末尾插入 //# sourceMappingURL= 註解,以連結到外部 sourcemap。

bun build src/app.tsx --outdir ./dist --sourcemap=linked --minify

這將產生包含 app.jsapp.js.map 的目錄 dist,以及註解 //# sourceMappingURL=app.js.map,以載入 sourcemap 進行偵錯。

感謝 @paperclover 實作此功能。

console.log 現在會印出陣列上的非索引屬性

Bun 現在會顯示陣列上的非索引屬性,例如

non-indexed-properties.ts
const arr = ['a', 'b', 'c'];
arr['five'] = 5;

console.log(arr);
bun non-indexed-properties.ts
[ "a", "b", "c", five: 5 ]

已修正:WebSocket 連線 error 事件現在包含 message

當 WebSocket 連線失敗時,error 事件現在包含一個 message 屬性,其中包含更詳細的錯誤訊息。

const ws = new WebSocket("ws://127.0.0.1:8080");
ws.addEventListener("error", (error) => {
  console.log(error.message);
});

// The message previously only was in the "close" event:
ws.addEventListener("close", (close) => {
  console.log(close);
});

這會印出以下錯誤訊息

WebSocket connection to 'ws://127.0.0.1:8080/' failed: Failed to connect

在連線失敗時,error 事件現在包含一個帶有錯誤訊息的 message 屬性,而不是僅在 close 事件中包含相關資訊。

已修正:使用 WebSocket 連線錯誤時 console.log 中的崩潰

當 WebSocket 無法連線時,它會發出 errorclose 事件。

const ws = new WebSocket("ws://127.0.0.1:8080");
ws.addEventListener("error", (error) => {
  // Connection error emitted
});
ws.addEventListener("close", () => {
  // Connection did not fully open, but it is still closed
});

先前,從 WebSocket 連線錯誤印出 console.log(error) 有時會導致崩潰。程式碼錯誤地假設 ErrorEvent 始終包含非 null 的 error。此問題已修正,並且我們的測試涵蓋範圍已得到改進,以涵蓋此邊緣情況。

已修正:在 Windows 上使用非 ascii cwd 時的 Bun Shell 和 bun run

感謝 @dylan-conway,已修正影響在具有非 ascii 字元的目錄中執行的 Bun Shell 和 bun run 的錯誤。

已修正:TypeScript 列舉中的非 ascii 字元

具有非 ascii 金鑰的列舉會損壞。此問題已修正。

unicode-enum.ts
enum X {
  a,
  b,
  ç,
}
console.log(X);

已修正:在抽象屬性上使用實驗性裝飾器時的斷言失敗

感謝 @forcefieldsovereign,已修正在抽象屬性上使用實驗性 TypeScript 裝飾器時會發生的斷言失敗。

已修正:轉譯器中的 ZWJ 和 ZWNJ 字元

已修復當檔案的屬性名稱內包含 Zero Width Joiner (ZWJ) 或 Zero Width Non-Joiner (ZWNJ) 字元時會發生的崩潰。

已修正:module.mock 中的崩潰

感謝 @paperclover,已修復先前載入失敗的模組上使用 module.mock 的邊緣情況導致崩潰的問題。

已修正:process.execArgv

process.execArgv 可讓您傳回傳遞至 Bun 執行時期的引數,相較於 process.argv 中的程式引數。在某些情況下,錯誤地包含了非執行時期參數。感謝 @paperclover 修復此問題。

已修正:忽略不存在的可選依賴項

先前,由於可選依賴項依賴於從未發佈到 NPM 的套件,因此安裝套件 `@laihoe/demoparser2` 會失敗。Bun 現在透過簡單地忽略這些遺失的套件來符合 npm 的行為,因為它們被宣告為可選依賴項。

感謝 @dylan-conway

已修正:重新指派 module.exports 的 N-API 模組

已修復 Bun 不正確處理重新指派 module.exports 的 N-API 模組的錯誤。

先前,Bun 會忽略模組的回傳值,導致模組無法正確載入。此問題已修正,Bun 現在可以正確載入重新指派 module.exports 的 N-API 模組。當 module.exports 被指派給函數時,此問題最為明顯。

在此過程中,我們還修復了載入需要長時間初始化的 N-API 模組時可能發生的崩潰。

已修正:bun:sqlitechanges 欄位在 statement.run() 中始終為 0

預先編譯語句中的錯誤導致 db.prepare(...).run(...) 在某些情況下傳回 0,而不是語句中的變更次數。db.run(...) 不受影響。

已修正:工作區套件中的 bun patch

已修復與 bun patch --commit 差異化巢狀 node_modules 目錄中的檔案導致修補失敗相關的錯誤。

感謝 @zackradisic

內部:Bun 已將 Zig 更新至 0.13 版本

#9965 中,Bun 已升級為使用最新版本的 Zig 編譯器。這使得 Bun 更容易貢獻,因為它包含許多語言伺服器、建置系統和整體程式碼品質改進。

Zig 標準函式庫中的錯誤修復已修復 Bun 中的一些錯誤;最值得注意的是 Windows 修復程式,用於處理路徑和環境中的 WTF-16(UTF-16 的較寬鬆版本)。這修復了一些罕見的邊緣情況,在這些情況下,錯誤 InvalidUTF8 的報告內容很少。感謝 @squeek502。

對於團隊和貢獻者來說,一個重要的建置系統改進是能夠確保所有平台(Linux、Mac 和 Windows)都能成功編譯,而無需等待 CI 完成執行。貢獻者現在可以使用 Bun 儲存庫中的 bun run zig-check 測試編譯所有目標的程式碼。

感謝 9 位貢獻者!