Bun

Bun v1.0.27


Jarred Sumner · 2024年2月17日

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
npm
brew
docker
curl
curl -fsSL https://bun.dev.org.tw/install | bash
npm
npm install -g 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 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.stdinBun.stdoutBun.stderr 可能會崩潰的錯誤已修正,感謝 @argosphil。這是 Bun v1.0.24 中引入的回歸問題。

Bundows 即將推出

儘管此版本中所有非 Windows 特定的修正 —— 大多數程式碼變更都是為了使 Bun 在 Windows 上更好地工作 (並且在此處未提及,因為它尚未發布)。

一旦更多測試套件在 Windows 上通過,我們就會發布 Windows 版本。目前有 85% 的測試通過。我們正在盡快將其提升到 100%。

感謝 27 位貢獻者!