Bun
    Bun

Bun v1.1.34


Dylan Conway · 2024年11月2日

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

此版本修正了 64 個錯誤(解決了 62 個 👍)。它引入了 Bun.randomUUIDv7、減少了長時間運行的程序的記憶體用量、napi_type_tag_objectnapi_check_object_type_tag、從配置日誌中編輯機密資訊、ReadableStream 和 HTTP/1.1 規範修正,以及多項 bun install 和 Node.js 相容性改進。

安裝 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.randomUUIDv7()

Bun.randomUUIDv7() 傳回 UUID v7,這是一種單調遞增的 UUID,適用於排序和資料庫。

index.ts
import { randomUUIDv7 } from "bun";
const id = randomUUIDv7();
// => "0192ce11-26d5-7dc3-9305-1426de888c5a"

長時間運行的程序使用更少的記憶體

當您的應用程式在事件迴圈中休眠時,垃圾回收器會運行並釋放更多記憶體。這減少了長時間運行的程序的記憶體用量。

範例程式碼

napi_type_tag_objectnapi_check_object_type_tag

Bun v1.1.34 新增了對 napi_type_tag_objectnapi_check_object_type_tag 的 Node-API 支援。這些函數允許將類型標籤與物件關聯,並解鎖了 tree-sitter 套件。

感謝 @190n 實作!

bunfig.toml.npmrc 日誌中編輯機密資訊

現在,Bun 將在 bunfig.toml.npmrc 日誌中,針對語法錯誤或無效配置編輯機密資訊。UUID、npm 機密令牌、url 密碼以及後接 _auth_authTokenemail_passwordtoken 的值將被替換為 *

bunfig.toml
[registry]
a = { b = "http://user:pass@site.org", ; token = "ooops" }
$ bun install
- 2 | a = { b = "http://user:pass@site.org", ; token = "ooops" }
+ 2 | a = { b = "http://user:****@site.org", ; token = "*****" }
                                           ^
error: Unexpected semicolon
    at /path/to/bunfig.toml:2:40

SyntaxError: failed to load bunfig

感謝 @dylan-conway

bun build --compile 中內聯 process.versions.bun

當您使用 bun build --compile 時,Bun 現在將內聯 process.versions.bun 的用法。

這表示在使用 bun build --compile 時,可以使用以下程式碼來靜態載入 node native addons

const bindings =
  typeof process.versions.bun === "string"
    ? // `bun build --compile` will bundle the prebuilt .node file into the standalone build
      require(`./preload/${process.platform}-${process.arch}/my-addon.node`) // -> ./preload/linux-x64/my-addon.node
    : // Otherwise, use node-gyp-build to resolve the .node file at runtime
      require("node-gyp-build")(
        path.join(
          __dirname,
          `${process.platform}-${process.arch}`,
          `my-addon.node`,
        ),
      );

感謝 @youennf

錯誤修正

已修正:ReadableStream 規範更新

我們已根據 WebKit 的上游變更更新了 ReadableStream 實作,修正了多個規範問題,包括

  • 在管道傳輸的 ReadableStream 上發生錯誤可能導致未處理的 Promise 拒絕
  • pipeThroughpipeTo Promise 未標記為已處理
  • ReadableStream 中的錯誤會在錯誤讀取 Promise 之前拒絕已關閉的 Promise
  • ReadableStreamDefaultReader.releaseLock 正在拒絕待定的讀取 Promise

感謝 @pfgithub 和 @youennf(透過 WebKit)提供重要的修正!

已修正:bun install 在使用 patchedDependenciesbin 欄位時失敗

已修正當 package.json 也包含 bin 欄位時,導致修補的依賴項安裝失敗的錯誤。現在,兩者可以同時存在於 package.json 中,並且修補程式將正確應用。

package.json
{
    "name": "pkg",
    "version": "1.0.0",
    "bin": "pkg.js",
    "dependencies": {
        "zod": "3.23.8"
    },
    "patchedDependencies": {
        "zod@3.23.8": "patches/zod@3.23.8.patch"
    }
}

感謝 @dylan-conway 的修正!

已修正:遷移 package-lock.json 時,依賴於根套件

假設有以下 package.json

package.json
{
    "name": "root-dep",
    "dependencies": {
        // becomes `./node_modules/root-dep`, a symlink to the root package
        "root-dep": "."
    }
}

npm 將產生一個 package-lock.json,其中包含兩個套件:一個用於根套件,另一個用於依賴於根套件的套件。根套件依賴項的 resolved 值將為空字串。當遷移具有此結構的 package.json 時,Bun 會因為此類型的根依賴項不是預期的而panic。

感謝 @dylan-conway 的修正!

已修正:在 Bun.build 中,沒有 outdir 的多個輸出檔案

修正了一個錯誤,該錯誤會導致在調用 Bun.build 時,如果有多個輸出檔案且沒有 outdir,則會失敗並顯示訊息,指出需要輸出目錄。當 outdir 未定義時,Bun.build 預設為記憶體內建置,因此此錯誤是不正確的。現在,Bun.build 將在記憶體中建立具有多個輸出檔案的建置,而不會出錯。

build.ts
const result = await Bun.build({
    entrypoints: ["main.ts", "index.html"],
})

for (const output of result.outputs) {
    console.log(output.path);
}
// "./main.js"
// "./index.js"
// "./index-7qpw8w4s.html"

感謝 @BjornTheProgrammer 的修正!

已修正:Amazon Linux 2 回歸問題

Bun v1.1.33 中不再支援 Amazon Linux 2 的回歸問題已修正。

此錯誤是由於依賴於 libc powf 函數引起的,該函數使用的 glibc 版本比 Amazon Linux 2 支援的版本更高。我們已新增一個回歸測試,以確保我們不會新增對 glibc 2.27 版本中不可用的符號的依賴。當使用 Vercel 的 Node.js v18 映像時,此錯誤也會影響 Vercel 建置。

已修正:在具有 glibc-compat 的 arm64 Linux 上,bun:sqlite 回歸問題

已修正透過 alpine linux 內部的 glibc 使用 bun:sqlite 會導致崩潰的回歸問題。

已新增:node:net Socket 的 bytesWritten 屬性

現在已正確實作 node:net Socket 物件上的 bytesWritten 屬性,感謝 @cirospaciari

這也使 net.Socket 中的 encoding 選項與 Node.js 的行為保持一致。

已修正:node:fs 的選項解析與 "encoding" 選項

node:fs 中的 encoding 選項在某些 node:fs 函數中未正確解析。這導致在 Node 不會拋出錯誤時拋出錯誤。此問題已修正。

已修正:從另一個 File 建立的 File 物件附加 FormData 時可能發生的崩潰

已修正一個錯誤,該錯誤會導致在某些情況下,從另一個 File 建立的 Web File 物件附加 FormData 時可能會導致崩潰。這影響了 OpenAI 套件。

已修正:非物件上的 napi 屬性方法

Node-API 函數支援在原始值(如字串文字和數字)上調用方法。這與 JavaScript (如 "foo".slice()) 一致,但在 native 程式碼中,為了提高效能,底層實作以不同於 JavaScript 的方式處理這些值。

已修正一個錯誤,該錯誤會導致當在非物件上調用 Node-API 函數(如 String.prototype.sliceNumber.prototype.toFixed)時拋出錯誤,感謝 @190n

已修正:TextEncoder.encode(undefined) 結果不正確

TextEncoder.encode() 會字串化輸入,除非輸入為 undefined。Bun 錯誤地將 undefined 包含在字串轉換中,而它應該傳回一個空的 Uint8Array

index.js
const encoder = new TextEncoder();
console.log(encoder.encode());
// Before:       Uint8Array(9) [ 117, 110, 100, 101, 102, 105, 110, 101, 100 ]
// Bun v1.1.34:  Uint8Array(0) []

感謝 @dylan-conway 的修正!

已修正:Error.prepareStackTrace 參數轉換中的崩潰

修正了一個錯誤,該錯誤會導致在使用非 CallSite 值的陣列調用 Error.prepareStackTrace() 時崩潰。現在,值會如預期般字串化以用於錯誤堆疊追蹤。

index.js
const result = Error.prepareStackTrace(new Error("oops"), [{ a: 1 }]);
console.log(result);
// Error: oops
//     at [object Object]

已修正:多個 HTTP 規範問題

我們的 uWebSockets 依賴項已更新並新增了其他 HTTP/1.1 規範相容性測試,解決了多個涉及無效標頭的 HTTP 規範問題。

感謝 Alex Hultman 提供重要的修正!

已修正:EventEmitter.name

修正了一個錯誤,該錯誤會導致 EventEmitter.name 設定為 EventEmitter2 而不是 EventEmitter

index.js
import { EventEmitter } from "events";
console.log(EventEmitter.name);
// Before:         EventEmitter2
// Bun v1.1.34:    EventEmitter

已修正:使用 package.json 腳本時,額外參數的跳脫字元

當參數傳遞到 package.json 中的腳本時,參數未正確跳脫字元。感謝 @pfgithub,此問題已修正!

假設有以下 package.json

package.json
{
    "scripts": {
        "args": "echo"
    }
}

bun run args \$HOME 之前會印出 /path/to/home 而不是 $HOME

已改進:移除 .npmrc 中未使用註冊表選項的警告

先前,如果為預設註冊表(使用 registry=<...> 設定)以外的註冊表設定了 npmrc 中的選項,Bun 會印出警告。我們已移除此警告,因為它是非必要的。

感謝 @dylan-conway

已改進:使用 bun add 的第一個依賴項格式化 package.json

當使用 bun add/install/update 將第一個依賴項新增到 dependencies 時,產生的 package.json 現在將具有更好的格式。

bun add jquery@4.0.0-beta.2
package.json
{
    "name": "dependency-formatting",
    "dependencies": {
        "jquery": "4.0.0-beta.2"
    },
    "dependencies": { "jquery": "4.0.0-beta.2" }
}

感謝 @nektro

全域安裝套件將不再連結來自遞移依賴項的二進位檔到全域 bin 目錄。這將防止將意外的二進位檔放置在 PATH 中。

感謝 @dylan-conway

感謝 14 位貢獻者!