我們正在舊金山招聘系統工程師,以打造 JavaScript 的未來!
此版本修正了 43 個錯誤。您現在可以在 Bun.serve() 中隨需建置前端應用程式。為 Bun.hash() 新增 xxHash 支援。新增使用 import 讀取 bun.lock 的支援。為 bunx 新增 --no-install 標記。改進 console.warn 輸出。修正 Bun 的 S3 用戶端、HTMLRewriter 和 node:fs 相容性改進等錯誤。
安裝 Bun
curl -fsSL https://bun.dev.org.tw/install | bash
npm install -g bun
powershell -c "irm bun.sh/install.ps1|iex"
scoop install bun
brew tap oven-sh/bun
brew install bun
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun
升級 Bun
bun upgrade
全端開發伺服器
透過HTML 導入,您現在可以在單一極速 Bun.serve()
HTTP 伺服器中同時執行前端和後端。這讓建置與後端整合的現代前端應用程式變得更簡單。
在 Bun 的下一個版本中
— Jarred Sumner (@jarredsumner) 2025 年 1 月 14 日
Bun.serve() 取得隨需捆綁前端應用程式的初步支援 pic.twitter.com/51XcNXt3vy
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 應用程式。
import dashboard from "./public/dashboard.html";
import { serve } from "bun";
serve({
static: {
"/": dashboard,
},
async fetch(req) {
// ...api requests
return new Response("hello world");
},
});
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 />);
});
<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="../src/frontend.tsx"></script>
</body>
</html>
body {
background-color: red;
}
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.xxHash32
、Bun.hash.xxHash64
和 Bun.hash.xxHash3
,實作了 xxHash 系列快速非加密雜湊函數。這些適用於必須非常快速地雜湊資料且可接受某些雜湊碰撞的應用程式,例如檢查您信任未被惡意篡改的資料的完整性,但不應用於密碼或不受信任資料的雜湊等加密用途。
// 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-dom
和 node:vm
的崩潰
Bun v1.1.43 中的回歸導致使用 happy-dom
或 node: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 的伺服器知道您有權存取這些套件
//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 publish
和 bun pm pack
中的 bundleDependencies
支援
package.json
中的 bundleDependencies
(或 bundledDependencies
) 選項允許套件在其發佈到登錄檔的 tarball 中包含其依賴項的原始碼,而不是要求單獨下載依賴項。Bun 先前在 bun pm pack
和 bun pm publish
中識別了此選項的陣列形式,該形式允許指定要捆綁的依賴項列表。但我們尚未支援將此標記設定為 true
,這是指定應捆綁所有依賴項的簡寫。現在我們支援此功能。我們還新增了捆綁作用域套件作為依賴項的支援。
感謝 @RiskyMH 實作此功能!