Bun 是一個速度極快的 JavaScript 執行時、打包器、轉譯器和套件管理器 — 全部集於一身。
此版本修正了 72 個錯誤 (解決了 192 個 👍 反應),Bun Shell 支援在非零退出代碼時拋出錯誤,使用非同步生成器串流 Response 主體,提高了 fetch()、http2 客戶端、Bun.Glob 修復的可靠性。修正了 Linux 上 bun --watch 的回歸問題。改善了 Node.js 相容性
先前的版本
v1.0.26
修正了 30 個錯誤 (解決了 60 個 👍 反應),在 bun:sqlite 中新增了對多語句查詢的支援,使 bun --watch 在長時間運行的會話中更可靠,Bun.FileSystemRouter 現在支援超過 64 個路由,修正了 expect().toStrictEqual() 的錯誤,修正了 error.stack 的 2 個錯誤,改善了 Node.js 相容性v1.0.25
修正了 4 個錯誤,新增了 vm.createScript。修正了 fs.readFile 中的崩潰、Bun.file().text() 中的崩潰、IPC 中的崩潰,以及涉及寬鬆相等的轉譯器錯誤v1.0.24
修正了 9 個錯誤,並新增了 Bun Shell,這是一個快速的跨平台 shell,具有無縫 JavaScript 互操作性。修正了 socket 超時錯誤、socket 關閉時可能發生的崩潰、Hapi 的 Node.js 相容性問題、process.exit 錯誤,以及 bun install binlinking 錯誤、bun inspect 回歸和 bun:test expect().toContain 錯誤
安裝 Bun
curl -fsSL https://bun.dev.org.tw/install | bash
npm install -g 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
Bun Shell 支援在非零退出代碼時拋出錯誤
當我們發布 Bun Shell 時,我們犯了一個小的 API 設計錯誤。在 Bash 中,即使命令失敗,shell 腳本預設也會繼續運行。這通常是 shell 腳本中細微錯誤的根源。為了相容性,Bun Shell 也這樣做了 —— 但這不是 JavaScript 開發人員所期望的。
此版本新增了對在非零退出代碼時拋出錯誤的支援
import { $ } from "bun";
$.throws(true);
await $`cat /not-found`;
它會拋出類似這樣的錯誤
ShellError: Failed with exit code 1
info: {
"stderr": "cat: /not-found: No such file or directory\n",
"exitCode": 1,
"stdout": ""
}
此錯誤中未顯示完整堆疊追蹤存在問題,我們正在調查如何修正。
即將到來的重大變更
經過大量回饋,在 Bun v1.1 (非此版本) 中,Bun Shell 預設會在非零退出代碼時拋出錯誤 - 使其成為預設行為 (重大變更)。我們在 API 文件中提到 Bun Shell 是一個不穩定的 API,這是一個很好的例子說明原因。
Bun.Shell 中更強大的跳脫字元
在此版本中,我們在 Bun Shell 中針對以下情況使跳脫字元邏輯更強大
import { $ } from "bun";
const str = "cookies & creme";
await $`echo "${str}"`;
先前,這會像這樣跳脫字元
await $`echo ""cookies & creme ""`;
這會導致以下錯誤
1 | import { $ } from "bun";
2 | const str = "cookies & creme";
3 | await $`echo "${str}"`;
^
error: expected a command or assignment but got: "Ampersand"
at BunShell (:117:69)
at /private/tmp/sh.js:3:7
現在它會正確地像這樣跳脫字元
await $`echo "cookies & creme"`;
使用非同步生成器串流 Response 主體
此版本新增了使用非同步生成器串流 Response 主體的支援
Bun.serve({
async fetch(req) {
return new Response(
// using an async generator* function
async function* stream() {
yield "Hello, ";
yield Buffer.from("world!");
},
);
},
});
Bun.serve({
async fetch(req) {
return new Response({
// You can also pass async iterables
async *[Symbol.asyncIterator]() {
yield "Hello, ";
yield Buffer.from("world!");
},
});
},
});
您可以將非同步生成器函數或非同步可迭代物件傳遞給 Response
建構函式。您可以產生 string
或任何 TypedArray (如 Buffer
)。傳遞字串會自動將其轉換為 UTF-8 字串。
在內部,這會變成 ReadableStream
。Bun 繼續直接支援 ReadableStream。
Bun.serve() 中的 Node.js Readable 串流
由於 Node.js Readable 實作了 [Symbol.asyncIterator]
,您現在也可以將 Node.js Readable 串流傳遞給 Response
建構函式。
import { Readable } from "stream";
import { serve } from "bun";
serve({
port: 3001,
fetch(req) {
const r = new Readable();
r.push("your text here");
r.push(null);
return new Response(r);
},
});
已修正:Astro v4.4 渲染空白頁面
在 Astro v4.4 中,他們切換為使用非同步生成器函數來渲染頁面。這導致 Bun 中出現一個錯誤,它會渲染空白頁面。此問題已修正。
已修正:Linux 上 bun --watch 中的 ctrl+c
Bun v1.0.26 中的回歸問題導致在 Linux 上按下 ctrl+c 時,bun --watch
無法退出。此問題已修正。對此感到抱歉。
感謝 @gvilums 修正此問題。
已修正:fetch() 中的 "ShortRead"
在 Bun v1.0.21 中,我們為 fetch()
新增了 Brotli 串流支援 —— 但在將串流資料區塊消耗到 JavaScript 時,實作中存在一個錯誤。在某些情況下,它會拋出 "error: ShortRead"。此版本修正了該錯誤,感謝 @argosphil。
已修正:http2 客戶端掛起
已修正 http2 客戶端有時會掛起的錯誤。在使用 Firebase 或 Firestore 時,此問題最為明顯。
已修正:在沒有模板標籤的情況下將 Bun.$ 作為函數調用時崩潰
在類似這樣的程式碼中會發生崩潰
import { $ } from "bun";
await $("i should've used a template tag instead :(");
現在它會正確地拋出錯誤。
感謝 @zackradisic 修正此問題
已修正:Glob 匹配 **
有時返回空列表的錯誤
Bun.Glob 與 **
有時會返回空列表的錯誤已修正,感謝 @zackradisic。
已修正:支援 HTTP 標頭名稱中的 _
先前,Bun.serve() 認為包含底線的標頭名稱無效。此問題已修正,感謝 @uNetworkingAB。
已修正:符號連結進入點將 import.meta.main 報告為 false
在 Bun 中,您可以使用 import.meta.main
找出目前模組是否為進入點。當進入點是符號連結時,這無法正常運作。此問題已修正,感謝 @paperclover。
已修正:bun:test 中的非同步模組模擬
在模組模擬內部使用非同步或 Promise 無法正常運作的錯誤已修正。
此測試現在通過
import { mock, test, expect } from "bun:test";
test("mock.module async", async () => {
mock.module("i-am-async-and-mocked", async () => {
await 42;
await Bun.sleep(0);
return { a: 123 };
});
expect((await import("i-am-async-and-mocked")).a).toBe(123);
});
已修正:node:crypto 中潛在的崩潰
使用 KeyObject 時可能在 node:crypto 中發生的崩潰已修正,感謝 @cirospaciari。
已修正:path.win32 Node.js 測試現在通過
path.win32
的實作已重寫,現在通過所有 Node.js 測試,感謝 @jdalton。
已修正:tsconfig.json 路徑映射中的邊緣案例
當多個可能的路徑可能匹配且其中一個路徑比另一個路徑長時,tsconfig.json
路徑映射無法正常運作的錯誤已修正,感謝 @james-elicx。
已修正:移除大量檔案時 Bun.$ 中潛在的崩潰
使用 rm -rf
移除大量檔案時,潛在的崩潰已修正。當在 Linux 上使用記憶體檔案系統時,此問題最為明顯。
已修正:fetch() 在重新導向後潛在的崩潰
我們在 fetch()
中處理重新導向的程式碼中的錯誤已修正,感謝 @cirospaciari。
已修正:bun test -t 'pattern',其中模式在開頭匹配
bun test -t 'pattern'
無法匹配模式在測試名稱開頭匹配的測試的錯誤已修正,感謝 @argosphil。
已修正:Bun.stdin、Bun.stdout、Bun.stderr 中潛在的崩潰
有時使用 Bun.stdin
、Bun.stdout
和 Bun.stderr
可能會崩潰的錯誤已修正,感謝 @argosphil。這是 Bun v1.0.24 中引入的回歸問題。
Bundows 即將推出
儘管此版本中所有非 Windows 特定的修正 —— 大多數程式碼變更都是為了使 Bun 在 Windows 上更好地工作 (並且在此處未提及,因為它尚未發布)。
一旦更多測試套件在 Windows 上通過,我們就會發布 Windows 版本。目前有 85% 的測試通過。我們正在盡快將其提升到 100%。