Bun

Bun v1.1.44


Ben Grant · 2025 年 1 月 16 日

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

此版本修正了 43 個錯誤。您現在可以在 Bun.serve() 中隨需建置前端應用程式。為 Bun.hash() 新增 xxHash 支援。新增使用 import 讀取 bun.lock 的支援。為 bunx 新增 --no-install 標記。改進 console.warn 輸出。修正 Bun 的 S3 用戶端、HTMLRewriter 和 node:fs 相容性改進等錯誤。

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

全端開發伺服器

透過HTML 導入,您現在可以在單一極速 Bun.serve() HTTP 伺服器中同時執行前端和後端。這讓建置與後端整合的現代前端應用程式變得更簡單。

HTML 導入

此版本在 Bun 中引入了匯入 HTML 檔案的支援,需使用 --experimental-html CLI 標記。這些 HTML 檔案會由 Bun 的捆綁器Bun.serve() 一起處理。您可以使用 static 選項將這些 HTML 檔案作為路由提供。Bun.serve() 以零配置捆綁前端應用程式,並將捆綁的資產新增為靜態路由。

import mySinglePageApp from "./index.html";
import { s3 } from "bun";

Bun.serve({
  static: {
    // the "/" route goes to
    "/": mySinglePageApp,
    // ... more html imports go here
  },

  // Enable some logging & errors
  development: true,

  async fetch(req) {
    // ... api endpoints go here
    const path = getS3Path(req); // ...
    return Response.redirect(s3.file(path).presign());
  },
});

Bun v1.1.43 中,我們在 Bun 的捆綁器中新增了 HTML 進入點的支援。此版本以此為基礎,在 Bun.serve() 中新增了將 HTML 檔案作為路由提供的初步支援。

您可以使用 HTML 導入在共用後端伺服器中隨需建置單頁 React 應用程式。

src/backend.ts
src/frontend.tsx
public/dashboard.html
src/styles.css
src/app.tsx
src/backend.ts
import dashboard from "./public/dashboard.html";
import { serve } from "bun";

serve({
  static: {
    "/": dashboard,
  },

  async fetch(req) {
    // ...api requests
    return new Response("hello world");
  },
});
src/frontend.tsx
import "./styles.css";
import { createRoot } from "react-dom/client";
import { App } from "./app.tsx";

document.addEventListener("DOMContentLoaded", () => {
  const root = createRoot(document.getElementById("root"));
  root.render(<App />);
});
public/dashboard.html
<!DOCTYPE html>
<html>
  <head>
    <title>Dashboard</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="../src/frontend.tsx"></script>
  </body>
</html>
src/styles.css
body {
  background-color: red;
}
src/app.tsx
export function App() {
  return <div>Hello World</div>;
}

這仍然非常早期 - 尚無熱模組重載支援。但我們會實現的。

bunx --no-install

bunx 現在支援 --no-install 標記,這將導致命令僅在已安裝於當前路徑或全域前綴中時執行。

感謝 @DonIsaac 實作此功能!

使用 import 讀取 bun.lock

您現在可以使用 import 語句讀取 Bun 的新文字型鎖定檔的內容。

import { lockfileVersion } from "./bun.lock";

console.log(lockfileVersion);

我們也為 @types/bun 新增了類型定義,以便 TypeScript 瞭解鎖定檔的結構。而且,由於新的鎖定檔是 JSONC 檔案,我們也允許匯入其他 .jsonc 檔案。

感謝 @RiskyMH 實作此功能!

Bun.hash 中的 xxHash 支援

Bun.hash 命名空間現在包含 Bun.hash.xxHash32Bun.hash.xxHash64Bun.hash.xxHash3,實作了 xxHash 系列快速非加密雜湊函數。這些適用於必須非常快速地雜湊資料且可接受某些雜湊碰撞的應用程式,例如檢查您信任未被惡意篡改的資料的完整性,但不應用於密碼或不受信任資料的雜湊等加密用途。

xxhash.ts
// Print a hash of stdin
const data = await new Response(Bun.stdin).arrayBuffer();
const hash: BigInt = Bun.hash.xxHash3(data);
// Format as 16 hexadecimal digits with leading zeroes
console.log(hash.toString(16).padStart(16, "0"));
cat xxhash.ts | bun xxhash.ts
aeac788911bfd3bb
xxhsum -H3 xxhash.ts # -H3 selects the xxHash3 algorithm
XXH3_aeac788911bfd3bb  xxhash.ts

感謝 @versecafe 將 Zig 標準函式庫連接到 Bun!

Node.js 相容性改進

node:dns > 90% Node.js 測試通過

node:dns 現在通過 > 90% 的 Node.js 自身測試套件。

感謝 @heimskr 實現此目標!

node:fs 修正

我們修復了 node:fs 實作中與 Node.js 相比的幾個錯誤和不一致之處,從而提高了與現有 Node.js 專案和套件的相容性。我們現在還在每次提交時為 fs 模組執行 Node.js 自身測試的大部分。這使得 Bun 中 fs 通過的 Node.js 測試套件增加了約 +10%。

感謝 @paperclover 實作此功能!

已修正:嘗試在 Axios 中指派唯讀屬性

node:http 中的一個屬性被錯誤地標記為唯讀,導致 Axios 在某些情況下拋出錯誤。此版本修正了該錯誤。

已修正:影響 happy-domnode:vm 的崩潰

Bun v1.1.43 中的回歸導致使用 happy-domnode:vm 時發生崩潰。此版本修正了此崩潰,並新增了一個測試以防止再次發生。

已修正:以 Bun 作為父進程進行 JSON 序列化的 IPC

先前,如果 IPC 與設定為 "json"serialization 一起使用,Bun 會向子進程發送格式不正確的訊息。現在,在這種情況下,它始終發送 JSON 訊息。

感謝 @nektro 修復此問題!

錯誤修正

此版本還包含許多錯誤修正。

已修正:bun install --lockfile-only --silent 列印鎖定檔摘要

先前,執行 bun install --lockfile-only --silent 仍會列印鎖定檔中儲存的套件摘要,儘管使用了 --silent 選項。現在,--silent 選項已生效。

感謝 @DonIsaac 修復此問題!

已修正:expect.extend() 的回歸

Bun v1.1.43 中對 JavaScriptCore 綁定的變更導致 expect.extend() 忽略原型物件上的屬性,導致某些測試匹配器程式庫無法正常運作。此版本修正了此回歸。

感謝 @pfgithub 修復此問題!

已修正:S3 用戶端中遺失 x-amz-acl 標頭

Bun 的 S3 用戶端在某些情況下遺失了 x-amz-acl 標頭。

感謝 @robertshuford 修復此問題!

已修正:expect().toThrow() 現在匹配 expect().toThrow("")

在 Jest 和 Vitest 中,當您執行 expect(a).toThrow("") 時,其行為與 expect(a).toThrow() 相同。在 bun:test 中,它會拋出錯誤。我們已將其更改為與 Jest 和 Vitest 匹配,以便更容易遷移您的測試。

感謝 @DonIsaac 修復此問題!

已修正:HTMLRewriter 中的錯誤處理

當拋出 JavaScript 異常時,Bun 的 HTMLRewriter API 中已修復崩潰。現在,這些錯誤已正確傳播。

已修正:以偏移量 0 切割 S3 檔案

先前,在 Bun 的 S3 用戶端傳回的檔案上呼叫 slice(),且偏移量設定為零時,將不起作用。現在,檔案已透過 HTTP 範圍請求正確截斷。

感謝 @cirospaciari 修復此問題!

已修正:私有 npm 套件遺失授權

在解析 .npmrc 配置檔案時,如果預設登錄檔與作用域登錄檔具有相同的主機名稱,則先前版本的 Bun 不會將授權配置應用於作用域登錄檔。例如,如果您需要存取 npmjs.org 上的私有套件,您需要設定一個權杖,以便 npm 的伺服器知道您有權存取這些套件

.npmrc
//registry.npmjs.org/:_authToken=<AUTH_TOKEN>

由於 registry.npmjs.org 是預設登錄檔之一,因此 Bun 不會發送身份驗證權杖,並且您將無法下載私有套件。現在,所有配置選項都已正確應用。

感謝 @robertshuford 修復此問題!

更多改進

console.warn 為黃色

當您 console.warn 一個 Error 物件時,name 屬性現在為黃色而不是紅色。這告訴您這是一個警告而不是錯誤。

此外,當 name 屬性為 "Error" 時,它會列印 "warn" 而不是 "error",以更清楚地表明這是一個警告而不是錯誤。

一致的說明訊息色彩化

Bun 子命令的 --help 訊息現在在其格式和色彩化方面更加一致。

感謝 @fel1x-developer 修復此問題!

bun exec --help 的說明訊息

命令列解析中的錯誤導致 bun exec --help 重複使用 bun run 的說明訊息。現在它會正確列印自己的說明訊息。

感謝 @RiskyMH 修復此問題!

已更新根憑證

Bun 的內建根憑證已更新至 NSS 3.107。這些是與 Firefox 134 一起發佈的相同憑證。

感謝 @cirospaciari 實作此功能!

改進 bun publishbun pm pack 中的 bundleDependencies 支援

package.json 中的 bundleDependencies (或 bundledDependencies) 選項允許套件在其發佈到登錄檔的 tarball 中包含其依賴項的原始碼,而不是要求單獨下載依賴項。Bun 先前在 bun pm packbun pm publish 中識別了此選項的陣列形式,該形式允許指定要捆綁的依賴項列表。但我們尚未支援將此標記設定為 true,這是指定應捆綁所有依賴項的簡寫。現在我們支援此功能。我們還新增了捆綁作用域套件作為依賴項的支援。

感謝 @RiskyMH 實作此功能!

感謝 21 位貢獻者!