Bun

Bun v1.1.17


Jarred Sumner · 2024年6月25日

Bun v1.1.17 版本在此!此版本修正了 4 個錯誤。修復了 bun repl 中的崩潰問題。使 macOS 上小型目錄中的 fs.readdirSync 速度提升 5%。修復了 "ws" 模組在 "send" 方法中未呼叫回呼函式的問題。修復了在 bun install 中讀取損壞的 lockfile 時發生的崩潰問題。使 macOS 事件迴圈稍微加快。

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

先前的版本

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

已修復:bun repl 中的崩潰問題

在 Bun v1.1.16 中,我們將 Zig 的版本從 0.12.0 升級到 0.13.0。Zig 中的一項變更解決了一個錯誤,該錯誤導致不可變字串被放置到可執行檔的資料段而不是唯讀資料段 (.rodata)。

不幸的是,這個錯誤是 Bun 無意中依賴的東西。

bun replbunx bun-repl 的別名,這是一個我們計劃重寫的非官方 npm 套件。

當將 bun repl 別名設定為 bunx bun-repl 時,我們正在變更一個本應是不可變的字串,並且由於我們對 bun repl 的測試覆蓋率不佳,我們太晚才發現這個錯誤。

此版本修復了 bun repl 中的崩潰問題,並新增了迴歸測試以防止再次發生。

macOS 上小型目錄中的 fs.readdirSync 速度提升 5%

我們已最佳化 fs.readdirSync 方法,使其在 macOS 上小型目錄中的速度提升 5%。

當呼叫 macOS getdirentries64 API 時,XNU 核心新增了一個旗標到緩衝區的末尾,以指示它已到達目錄條目列表的末尾。

getdirentries64_flags_t *gdeflags =
    (getdirentries64_flags_t *)(dirp->dd_buf + dirp->dd_len -
    sizeof(getdirentries64_flags_t));
*gdeflags = 0;
dirp->dd_size = (long)__getdirentries64(dirp->dd_fd,
    dirp->dd_buf, dirp->dd_len, &dirp->dd_td->seekoff);
if (dirp->dd_size >= 0 &&
    dirp->dd_size <= dirp->dd_len - sizeof(getdirentries64_flags_t)) {
  if (*gdeflags & GETDIRENTRIES64_EOF) {
    dirp->dd_flags |= __DTF_ATEND;
  }
}

先前,Bun 未檢查此旗標,而是會額外呼叫一次 getdirentries64,這在我們讀取目錄內容的每個位置都是不必要的系統呼叫。現在,我們檢查該旗標並避免額外的系統呼叫。

已修復:"ws" 模組在 "send" 方法中未呼叫回呼函式的問題

當從 "ws" 模組使用 WebSocket 時,如果訊息已成功傳送,send 方法將不會呼叫回呼函式。此問題已修復。

import { WebSocket } from "ws";
const ws = new WebSocket("ws://www.host.com/path");
ws.send("Hello", (err) => {
  if (err) {
    console.error("Failed to send message:", err);
  } else {
    console.log("Message sent successfully");
  }
});

先前,永遠不會呼叫回呼函式,這影響了依賴回呼函式的函式庫。此問題已修復。

已修復:在 bun install 中讀取損壞的 lockfile 時發生的罕見崩潰問題

已修復 Bun 在 bun install 中讀取損壞的 bun.lockb 檔案時可能崩潰的錯誤。我們新增了邊界檢查和更早的整數下溢/溢位檢查,以防止這種情況發生。我們在讀取快取的 npm 登錄檔資訊清單時也新增了類似的檢查。

macOS 事件迴圈稍微加快

每次事件迴圈中的背景工作完成時,背景執行緒都會分派訊息以喚醒主執行緒。這有點像說「嘿,醒醒!我完成我的工作了!」。由於我們從 libxev 借用的一些程式碼,此步驟 - 喚醒主執行緒 - 在此版本中於 macOS 上變得稍微快一些。具體來說,我們不再需要為我們傳送以喚醒主執行緒的每個訊息分配記憶體。

此變更也影響 bun build