Bun
    Bun
    DocsGuidesBlogDiscord logoGitHub logoDocsGuidesBlogDiscord logoGitHub logo

    Bun v1.1.8


    Ashcon Partovi · 2024年5月10日

    Bun v1.1.8 版本在此!此版本修正了 54 個錯誤 (解決了 184 個 👍)。支援 process.on("uncaughtException")process.on("unhandledRejection")JSON.parse 速度更快、node:zlib 中的 Brotli 支援、Bun API 中的 [Symbol.dispose]、修正了 Windows 上大量的當機問題,以及許多其他的錯誤修正。

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

    先前的版本

    • v1.1.7 修正了 28 個錯誤 (解決了 11 個 👍)。bun install 中的 Glob 工作區名稱。expect.extends() equals 中的非對稱匹配器支援。bunx --version。JSX 轉譯、source map、獨立執行檔的跨平台編譯、bun shell、RegExp、Windows 上的 Worker 和 Node.js 相容性改進的錯誤修正。
    • v1.1.6 修正了 10 個錯誤 (解決了 512 個 👍 反應)。我們實作了 UDP socket 支援和 node:dgram。DataDog 和 ClickHouseDB 現在可以運作了。我們修正了 v1.1.5 中 node:http 的回歸問題。此外,還有 Node.js 相容性改進和錯誤修正。
    • v1.1.0 Bundows。Windows 支援來了!

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

    新功能:支援 process.on("uncaughtException")process.on("unhandledRejection")

    Bun 現在支援 process.on("uncaughtException")process.on("unhandledRejection") 事件,讓您能夠以更優雅的方式處理未捕獲的例外和未處理的 Promise。

    process.on("uncaughtException", (error) => {
      console.error("Uncaught exception:", error);
    });
    
    process.nextTick(() => {
      throw new Error("Oops!");
    });
    

    這也適用於未處理的 Promise,這對於處理非同步程式碼中的錯誤很有用。

    process.on("unhandledRejection", (reason, promise) => {
      console.error("Unhandled rejection:", reason);
    });
    
    await 42;
    throw new Error("Oops!");
    

    這應該可以解決各種 npm 套件 (例如 puppeteer) 的問題,這些套件會在發生未處理的例外時清理資源。

    感謝 @gvilums 新增此功能!

    新功能:node:zlib 的 Brotli 支援

    Bun 現在於 node:zlib 模組中實作 Brotli API,包括 BrotliCompress()BrotliDecompress()brotliCompress()brotliDecompress() 等等!

    import { brotliCompressSync, brotliDecompressSync } from "node:zlib";
    
    const compressed = brotliCompressSync("Hello, world!");
    console.log(compressed.toString("hex"));
    // => 0b068048656c6c6f2c20776f726c642103
    
    const decompressed = brotliDecompressSync(compressed);
    console.log(decompressed.toString("utf8"));
    // => Hello, world!
    

    您也可以將 Brotli streams 與 zlib 模組一起使用。

    import { createBrotliCompress } from "node:zlib";
    
    const compressor = createBrotliCompress();
    compressor.write("Hello, world!");
    compressor.end();
    
    const compressed = compressor.read();
    console.log(compressed.toString("hex"));
    // => 0b068048656c6c6f2c20776f726c642103
    

    修正了 axios 的回歸問題

    新增 Brotli 支援也修正了 axios 的回歸問題,因此它現在應該可以在 Bun 中再次運作。

    感謝 @nektro 新增此功能!

    新功能:Bun API 中支援 [Symbol.dispose]

    Bun 現在於各種 API 上支援 [Symbol.dispose] 屬性,包括 Bun.spawnBun.serveBun.connectBun.listen。這讓您可以使用 using 語法定義變數,該語法由 TC39 關於 JavaScript 中顯式資源管理的提案所定義。

    import { serve } from "bun";
    
    {
      using server = serve({
        port: 0,
        fetch(request) {
          return new Response("Hello, world!");
        },
      });
    
      doStuff(server);
    }
    
    function doStuff(server) {
      // ...
    }
    

    在此範例中,即使拋出例外,server 變數超出範圍時,伺服器也會自動關閉。這對於確保資源被正確清理非常有用,尤其是在測試中。

    import { spawn } from "bun";
    import { test, expect } from "bun:test";
    
    test("able to spawn a process", async () => {
      using subprocess = spawn({
        cmd: [process.execPath, "-e", "console.log('Hello, world!')"],
        stdout: "pipe",
      });
    
      const stdout = new Response(subprocess.stdout).text();
      expect(stdout).resolves.toBe("Hello, world!");
    });
    

    感謝 @paperclover 實作此功能!

    更快速:JSON.parse

    已修正:Windows 上的 Illegal instruction 錯誤

    我們修正了 Bun 的建置腳本中的一個錯誤,該錯誤導致 Windows 相依性是以錯誤的 CPU 旗標建置的。這導致在 Windows 上使用較舊的 CPU 時出現 Illegal instruction 錯誤。

    此錯誤解決了超過 18 個 GitHub issue,並且歸功於 Bun 全新的當機回報器而被發現。

    已修正:使用 %i 格式字串的 console.log 造成的當機

    我們修正了一個錯誤,其中 console.log 可能會在使用超出引數數量的 %i 格式字串時當機。

    console.log("Hello %i %i", [1, 2, 3, 4]);
    // Before: <panic>
    // Now: 'Hello NaN %i'
    

    感謝 @paperclover 修正此錯誤!

    已修正:多個 workspace dependency not found 錯誤

    我們修正了各種會導致 bun install 失敗並出現 workspace dependency not found 錯誤的問題。

    • 第一個錯誤是由於將新的工作區相依性新增至未在其 package.json 中定義 version 屬性的工作區所造成的。

    • 第二個錯誤是由於手動將工作區相依性新增至工作區 package.json 中的 packages 屬性,然後嘗試執行 bun install 所造成的。

    我們仍在努力改進 Bun 中的工作區。如果您仍然遇到工作區問題,請提交 issue

    已修正:重複呼叫 console.table 造成的當機

    我們修正了一個錯誤,其中 console.table 使用的字串參考計數被錯誤地計算,這可能會導致當機。

    for (let i = 0; i < 50; i++) {
      console.table([{ n: 8 }]);
    }
    

    感謝 @dylan-conway 修正此錯誤!

    已修正:搭配檔案描述符和偏移量的 createReadStream 錯誤

    我們修正了一個錯誤,其中將 createReadStream 與檔案描述符和起始偏移量一起使用會導致偏移量被忽略。

    import { openSync, createReadStream, writeSync } from "node:fs";
    
    const fd = openSync("hello.txt", "w+");
    const stream = createReadStream("", { fd: fd, start: 2 });
    
    stream.on("data", (chunk) => {
      // Before: "Hello, world!"
      // Now: "llo, world!"
    });
    
    writeSync(fd, "Hello, world!");
    

    感謝 @gvilums 修正此錯誤!

    已修正:confirm() 在 Windows 上無法運作

    Bun 實作了 confirm() Web API,它會提示終端機顯示確認訊息。我們沒有正確處理 Windows 行尾符號,因此確認永遠不會是 true

    if (confirm("Are you sure?")) {
      console.log("Yes!");
    } else {
      console.log("No!");
    }
    

    這已由 @rcaselles 修正。

    已修正:某些 CPU 的 os.cpus() 錯誤

    我們修正了一個錯誤,其中當 CPU 字串太長時,os.cpus() 會拋出錯誤。

    import { cpus } from "node:os";
    
    console.log(cpus());
    // Before: <error: Failed to get cpu information>
    // Now: [ { model: "Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz", ... } ]
    

    這已由 @dylan-conway 修正。

    已修正:ClientRequest 上缺少 agent 屬性

    我們修正了一個錯誤,其中 ClientRequest 類別上缺少 agent 屬性。

    import { request } from "node:http";
    
    const req = request("https://example.com");
    console.log(req.agent);
    // Before: undefined
    // Now: <Agent>
    

    感謝 @nektro 修正此錯誤!

    已修正:將 stdout 從 Bun.spawn() 重新導向至 Bun.serve() 無法運作

    有一個錯誤,其中將 stdout 從 Bun.spawn() 重新導向至 Bun.serve() 無法運作。此問題現已修正。

    import { spawn, serve } from "bun";
    
    const server = serve({
      port: 0,
      async fetch(req) {
        const { stdout } = spawn({
          cmd: [process.execPath, "-e", 'console.write("Hello, world!")'],
          stdout: "pipe",
        });
    
        return new Response(stdout);
      },
    });
    
    const response = await fetch(server.url);
    console.write(await response.text());
    server.stop(true);
    

    已修正:node:netonread 無法運作

    我們在 node:net 模組中新增了對 onread 事件的支援,讓您可以監聽 socket 上的傳入資料。

    import { connect } from "node:net";
    
    const socket = connect({
      host: "example.com",
      port: 80,
      onread: {
        buffer: Buffer.alloc(1024),
        callback(size, buffer) {
          console.log("onread:", size);
        },
      },
    });
    
    socket.write("GET / HTTP/1.1\r\n\r\n");
    // Before: <nothing>
    // Now: onread: 504
    

    感謝 @gvilums 修正此錯誤!

    已修正:InlineCacheCompiler 中的當機

    已修正一個當機問題,該問題可能在函數以特定方式被存取,並在活動幾分鐘後被垃圾回收時發生。此當機問題是 JavaScriptCore 引擎中的上游問題,始於 Bun v1.1.7,現已解決。有些使用者回報在使用 Next.js 時發生此當機問題。

    已修正:node:inspector 的更佳 Stub

    Bun 不支援 node:inspector 模組,因為它依賴 Chrome DevTools 協定,該協定與 WebKit 的協定類似但不相同。

    先前,當嘗試使用 inspector.url() 時,Bun 會拋出未實作錯誤。現在,我們已將其變更為傳回 undefined,這是根據Node.js 文件所允許的行為。

    某些 npm 套件 (例如 typedoc) 使用此 API 進行功能偵測。透過這些變更,這些套件現在可以與 Bun 搭配使用。

    import { url } from "node:inspector";
    // ...
    const isDebugging = () => !!url();
    

    感謝 @Electroid 使其變得更好!

    感謝 12 位貢獻者!