Bun

Bun v1.0.32


Jarred Sumner · 2024 年 3 月 17 日

Bun 是一個速度極快的 JavaScript 執行時環境、打包器、轉譯器和套件管理器 — 功能All-in-One。

Bun v1.0.32 修復了 13 個錯誤並改進了 Node.js 相容性。「ws」套件現在可以發送和接收 ping/pong 事件。 util.promisify 的 setTimeout setInterval、setImmediate 現在可以運作了。 FileHandle 方法已經實作。

先前的版本

  • v1.0.31 修復了 54 個錯誤(解決了 113 個 👍 表情符號),引入了 bun --print<stdin> | bun run -bun add --trust、具有 Unix socket 的 fetch(),修復了 macOS 二進制檔案大小回歸問題,修復了舊版 Linux 上 spawn() 中 CPU 使用率過高的錯誤,新增了 util.styleText、Node.js 相容性改進、bun install 錯誤修復和 bunx 錯誤修復
  • v1.0.30 修復了 27 個錯誤(解決了 103 個 👍 表情符號),修復了 Bun.serve() 的 8 倍效能回歸問題,為 bun build 和 Bun 的執行時環境新增了新的 --conditions 標誌,在 Bun 的測試執行器中新增了對 expect.assertions()expect.hasAssertions() 的支援,修復了崩潰問題並改進了 Node.js 相容性。
  • v1.0.29 修復了 8 個錯誤。 Bun.stringWidth(a) 是廣受歡迎的 'string-width' 套件的 ~6,756 倍速度更快的替代品。 bunx 更頻繁地檢查更新。 在 bun:test 中新增 expect().toBeOneOf()。 修復了影響 Prisma 的記憶體洩漏問題。 Shell 現在支援進階重新導向,例如 '2>&1'、'&>'。 改善了 bunx、bun install、WebSocket client 和 Bun Shell 的可靠性
  • v1.0.28 修復了 6 個錯誤(解決了 26 個 👍 表情符號)。 修復了影響 Prisma 和 Astro、node:eventsnode:readlinenode:http2 的錯誤。 修復了 Bun Shell 中涉及 stdin 重新導向的錯誤,並修復了 bun:test 中關於 test.eachdescribe.only 的錯誤。

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

已修正:GitHub actions 因 bun install 超時

在 Bun v1.0.31 中,我們重寫了 Bun 中大量 I/O 的運作方式,為支援 Windows 做準備。 這導致了一些回歸問題。

當在安裝過程的最後調用超過 16 個生命週期腳本時,bun install 可能會卡住。 為了防止系統不穩定,bun install 設定了並行執行的生命週期腳本的最大數量。 由於一個錯誤,遞增活動生命週期腳本數量的計數器從未遞減。 這個問題已修正。

感謝 @farreldarian 提供了簡單的重現方式。

已修正:bun install --production 回歸問題

Bun v1.0.31 錯誤地更改了 --frozen-lockfile--production 標誌的處理順序。

這些標誌應該阻止更改 lockfile 的安裝,但在 v1.0.31 中,安裝過程仍然會發生。 退出代碼仍然是正確的(導致 CI 失敗),但套件仍然被安裝了。

現在,它會正確地驗證 lockfile,並且在安裝套件之前傳遞 --frozen-lockfile 時,不會安裝套件。

我們擴展了我們的測試套件,以防止這種情況再次發生。

已修正:Shell 在使用 || 和 && 時卡住

在某些情況下,以下命令會卡住

import { $ } from "bun";
await $`echo 1 && echo 1`;

這是由我們的 I/O 重寫引起的回歸問題。 我們沒有關閉檔案描述符。 這個問題已修正,感謝 @zackradisic。 我們擴展了我們的測試套件,以防止這種情況再次發生。

已修正:使用 bun shell 而非系統 shell

在 Bun v1.0.31 中,我們無意中啟用了 bun shell 作為 posix 的 package.json 腳本執行器。 這原本僅適用於 Windows。 我們編寫了測試以防止這種情況再次發生。

我們還新增了 --shell 標誌,讓您可以選擇使用 "bun" shell 或 "system" shell

bun --shell=bun run my-package-json-script

已修正:import.meta.url 查詢字串參數

Bun 在 import.meta.url 中傳回的是編碼後的查詢字串參數,而不是解碼後的查詢字串參數。

對於以下程式碼

index.mjs
import './test?param=value'
test.mjs
console.log(import.meta.url);

先前,Bun 會傳回以下不正確的字串

run.sh
bun-1.0.31 ./index.mjs
file:///Users/jarred/test.mjs%3Fparam=value

現在 Bun 會傳回正確的字串

run.sh
bun ./index.mjs
file:///Users/jarred/test.mjs?param=value

感謝 @paperclover 修復了這個問題。

已修正:Subprocess.kill(undefined)

已調整 Bun.spawn().kill 的參數強制轉換程式碼,以符合 Node 的行為。

先前,此程式碼片段會永遠卡住

import { spawn } from "bun";

const proc = spawn({
  cmd: ["sleep", "infinity"],
});
proc.kill(undefined);

現在,undefined 將強制轉換為等同於不傳遞任何參數 — SIGTERM。 同樣地,null""false 也會強制轉換為 SIGTERM。 這使行為與 Node 的 child_process.kill 一致,並且確實更像 JavaScript。

Node.js 相容性改進

此版本還包括一些 Node.js 相容性改進

「ws」模組可以發送和接收 pingpong

現在,使用 Bun 時,"ws" WebSocket client 和 server 可以發送和接收 "ping""pong" 事件。

輸出
ping.mjs
輸出
bun ping.mjs
Server is listening
Ping received on server side hello
Pong received on client side hello
Pong received on client side hello
bun-1.0.31 ping.mjs # Before
Server is listening
Pong received on client side hello
node ping.mjs # Node, for comparison
Server is listening
Ping received on server side hello
Pong received on client side hello
Pong received on client side hello
ping.mjs
import WebSocket, { WebSocketServer } from "ws";

const wss = new WebSocketServer({ port: 8080 });

wss.on("connection", (ws) => {
  ws.on("ping", (data) => {
    console.log("Ping received on server side", data.toString());
    ws.pong(data);
  });
});

// test client
const ws = new WebSocket("ws://127.0.0.1:8080");

ws.on("pong", (data) => {
  console.log("Pong received on client side", data.toString());
});

ws.on("open", () => {
  ws.ping(Buffer.from("hello"));
});

// listen for the server
wss.on("listening", () => {
  console.log("Server is listening");
});

FileHandle 讀取和寫入方法

Bun 中的 Node FileHandle 類別實作已更正確地實作。 您可以調用 .read.write,它會傳回預期的結果,而不僅僅是一個數字。

我們還修復了一個錯誤,該錯誤可能導致它在應該關閉檔案描述符時沒有調用 close

感謝 @eventualbuddha 在這方面的協助

util.promisify + setTimeout、setInterval、setImmediate

在 Bun 的計時器上使用 util.promisify 時,它們現在的行為與在 Node.js 中的行為相同。 這包括

  • setTimeout
  • setInterval
  • setImmediate
import { promisify } from "util";

const setTimeoutAsync = promisify(setTimeout);

await setTimeoutAsync(1000);
// await Bun.sleep(1000)

Windows 支援即將推出

我們即將在 Bun v1.1 中推出 Windows 支援。 一旦 Windows 版 Bun 通過 Bun 測試套件的 95%,我們將宣布發布日期。

感謝 8 位貢獻者!

完整變更日誌