Bun

Bun v1.1.32


Jarred Sumner · 2024 年 10 月 21 日

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

此版本修正了 7 個錯誤,並在 node:crypto 中新增了 crypto.hash()。Next.js 15 中的警告已修正。ESM <> CJS 互通性中影響 Vite 設定物件的回歸錯誤已修正。啟動時傳遞無效 TLS 憑證時 Bun.serve() 中的當機問題已修正。

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

crypto.hash()

Node.js 的 crypto.hash() 方法現在已在 Bun 中提供使用。這是一種單次性方法,會傳回您選擇的雜湊演算法的 bufferhexbase64base64url 表示形式。

import { hash } from "crypto";

const hex = hash("sha256", "hello", "hex");
console.log(hex); // "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"

在內部,這會呼叫 Bun.CryptoHasher.hash()

錯誤修正

已修正:v1.1.31 中的偵錯工具回歸

v1.1.31 中的回歸錯誤導致偵錯工具停止連線。此問題現已修正。感謝 @nektro 的修正。

已修正:影響 Vite 的 CJS <> ESM 錯誤

在 Bun v1.1.30 中,我們對 require(esm) 實作進行了小幅變更,導致具有 "type": "module" 的專案在要求 ESM 模組時,不會設定 __esModule

該變更的目的是避免在模組命名空間物件周圍新增額外的包裝器物件,但這在從 Vite 設定物件讀取時造成了回歸錯誤。

在 Bun v1.1.30 之前,包裝器基本上執行了以下操作

const namespace = Loader.getModuleNamespaceObject(esm!.module);
module.exports =
  namespace.__esModule ? namespace : Object.create(namespace, { __esModule: { value: true } });

這樣做的缺點是在模組命名空間物件周圍新增了額外的包裝器物件,這也表示 ...spread 運算子和 JSON.stringify 會遺失匯出的值。

在 Bun v1.1.30 - Bun v1.1.31 中,為了修正該問題,我們將其簡化為直接傳回命名空間物件(這更符合 Node.js 行為)

module.exports = Loader.getModuleNamespaceObject(esm!.module);

但是,當 package.json "type""module" 時,這導致在從 Vite 設定物件讀取時發生回歸錯誤。

為了在不重新引入額外包裝器物件的情況下修正此問題,我們已對 JavaScriptCore 中的模組命名空間物件進行變更,以特別允許將 __esModule 屬性設定為 trueundefined,而無需 __esModule 匯出。它不會顯示為自有屬性,並且只有在它還不是自有屬性時才能以這種方式寫入。

現在,我們執行以下操作

const namespace = Loader.getModuleNamespaceObject(esm!.module);
if (namespace.__esModule === undefined) {
    namespace.__esModule = true;
}
module.exports = namespace;

已修正:Next.js 15 中的警告

先前,在 Next.js 15 啟動時記錄了以下警告

Failed to install `require('node:crypto').randomUUID()` extension. When using `experimental.dynamicIO` calling this function will not correctly trigger dynamic behavior.
Failed to install `require('node:crypto').randomBytes(size)` extension. When using `experimental.dynamicIO` calling this function without a callback argument will not correctly trigger dynamic behavior.
Failed to install `require('node:crypto').randomUUID()` extension. When using `experimental.dynamicIO` calling this function will not correctly trigger dynamic behavior.
Failed to install `require('node:crypto').randomBytes(size)` extension. When using `experimental.dynamicIO` calling this function without a callback argument will not correctly trigger dynamic behavior.
Failed to install `require('node:crypto').randomUUID()` extension. When using `experimental.dynamicIO` calling this function will not correctly trigger dynamic behavior.
Failed to install `require('node:crypto').randomBytes(size)` extension. When using `experimental.dynamicIO` calling this function without a callback argument will not correctly trigger dynamic behavior.

此問題現已修正。此錯誤的原因是 node:crypto 中的某些屬性在 module.exports 物件上設定為唯讀。這些屬性不再設定為唯讀。

已修正:CryptoHasher 中使用 HMAC 處理不支援演算法時的當機問題

在 Bun v1.1.30 中,我們在 Bun.CryptoHasher 中引入了對 HMAC 的支援。

但是,如果您傳遞 Bun 識別但 BoringSSL 不支援的演算法,則會當機。此問題現已修正,我們改為擲回 TODO 錯誤。

已修正:Bun.serve() 中使用無效 TLS 憑證時的當機問題

我們的錯誤處理程式碼中的一個錯誤導致 Bun.serve() 中的 TLS 設定錯誤在 (啟動伺服器之前) 使處理程序當機,但它應該擲回 JavaScript 例外。

已修正:Bun.color 引數驗證不符

Bun.color 方法在錯誤訊息中列印了 "format" 引數的列舉值,但這些值無效。此問題現已修正,感謝 @nektro

感謝 5 位貢獻者!