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:events
、node:readline
和node:http2
的錯誤。 修復了 Bun Shell 中涉及 stdin 重新導向的錯誤,並修復了bun:test
中關於test.each
和describe.only
的錯誤。
安裝 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
已修正: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
中傳回的是編碼後的查詢字串參數,而不是解碼後的查詢字串參數。
對於以下程式碼
import './test?param=value'
console.log(import.meta.url);
先前,Bun 會傳回以下不正確的字串
bun-1.0.31 ./index.mjs
file:///Users/jarred/test.mjs%3Fparam=value
現在 Bun 會傳回正確的字串
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」模組可以發送和接收 ping
和 pong
現在,使用 Bun 時,"ws"
WebSocket client 和 server 可以發送和接收 "ping"
和 "pong"
事件。
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
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%,我們將宣布發布日期。
Windows 版 Bun 目前通過了 Bun 測試套件的 92.51%
— Bun (@bunjavascript) 2024 年 3 月 12 日
████████████░ 92.51%