Bun

Bun v1.1.7


Jarred Sumner · 2024 年 5 月 3 日

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

Bun v1.1.7 終於發佈了!此版本修正了 28 個錯誤(解決了 11 個 👍)。在 bun install 中使用 Glob 工作區名稱。在 expect.extends() equals 中支援非對稱匹配器。bunx --version。修復了 JSX 轉譯、sourcemaps、獨立執行檔的跨平台編譯、bun shell、RegExp、Windows 上的 Worker,以及 Node.js 相容性改進的錯誤。

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

先前的版本

  • v1.1.6 修復了 10 個錯誤(解決了 512 個 👍 反應)。我們已實作 UDP socket 支援和 node:dgram。DataDog 和 ClickHouseDB 現在可以運作了。我們修復了 v1.1.5 中 node:http 的回歸問題。此外,還有 Node.js 相容性改進和錯誤修復。
  • v1.1.5 修復了 64 個錯誤(解決了 101 個 👍)。bun build --compile 跨平台編譯獨立的 JavaScript 和 TypeScript 執行檔到其他平台。透過 type: "text" import 屬性將任何檔案作為文字匯入。引入了新的崩潰報告器。package.json 不會因為註解或尾隨逗號而產生錯誤。修復了 bun run --filter 退出代碼為 0 的錯誤。修復了 bun install 中 file: 相依性的錯誤。修復了 node:fsnode:tlsnode:cryptonode:readlinenode:httpnode:worker_threads 中的錯誤
  • 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

bun install 中使用 Glob workspace 名稱

您現在可以在 package.jsonworkspaces 中使用進階的 glob 模式,以指定要在 monorepo 中包含哪些目錄。例如

{
  "name": "monorepo",
  "workspaces": ["{app,packages,lib}/**"]
}

先前,我們僅支援 /* 作為模式或 workspaces 中的精確路徑。workspaces 匹配現在由 Bun.Glob 提供支援,因此您可以使用 Bun.Glob 支援的任何 glob 模式。

感謝 @zackradisic 實作此功能!

expect.extends() equals 中支援非對稱匹配器

現在,當在 expect.extends() equals 內部使用 this.equals 時,您可以在其中使用非對稱匹配器。例如

import { test, expect } from "bun:test";
expect.extend({
  toCustomEqual(actual, expected) {
    return { pass: this.equals(actual, expected) };
  },
});

test("asymmetric matchers", () => {
  expect(1).toCustomEqual(expect.anything());
  expect(1).toCustomEqual(expect.any(Number));
});

先前,這會拋出錯誤。現在,它可以如預期般運作。

感謝 @anchan828 實作此功能!

bunx --version

當您執行 bunx --version 時,Bun 現在會印出版本號碼

bunx --version
1.1.7

先前,bunx --version 會印出說明選單

bunx --version
Usage: bunx [...flags] <package>[@version] [...flags and arguments]
Execute an npm package executable (CLI), automatically installing into a global shared cache if not installed in node_modules.

Flags:
  --bun      Force the command to run with Bun instead of Node.js

Examples:
  bunx prisma migrate
  bunx prettier foo.js
  bunx --bun vite dev foo.js

感謝 @Electroid 修復此問題!

WebSocket 關閉代碼 1015

WebSocket 用戶端連線因 TLS 錯誤而連線失敗時,關閉代碼現在是 1015 而不是 1006。這樣更準確,並有助於除錯。

const ws = new WebSocket("wss://127.0.0.1:3000");

ws.on("close", ({ code, reason }) => {
  console.log(code); // 1015
  console.log(reason); // "TLS handshake failed"
});

先前,關閉代碼為 1006,這是一個通用錯誤代碼。

未處理的錯誤現在會印出 Bun 版本

當拋出頂層錯誤或 Promise 被拒絕時,Bun 現在會在結尾印出 Bun 版本

1 | function hi() {
2 |   return 42;
3 | }
4 |
5 | function yo() {
6 |   throw new Error("uh oh!");
            ^
error: uh oh!
      at yo (error.js:6:9)
      at hey (error.js:11:3)
      at error.js:14:1

Bun v1.1.7 (macOS arm64)

當向他人尋求除錯協助時,這很有用,因為它可以省去一個問題:「您使用的是哪個 Bun 版本?」

Bun.build() 中更佳的錯誤訊息

已修復:開發模式中 React 「Duplicate key」警告

已修復:Bun Shell 中 seqbasenamedirname 在空輸出時會hang住

當在 Bun Shell 中使用空輸出呼叫 seqbasenamedirname 時,由於未關閉輸出串流,它會無限期地hang住。這已在 Bun v1.1.7 中修復,感謝 @RanoIP

已修復:Windows 上啟動時可能發生的崩潰

Zig 標準函式庫 std.mem.indexOfScalarPos 內 SIMD 程式碼路徑中的無效記憶體存取,可能會導致 Bun 在 Windows 上初始化期間立即崩潰。這已在 Bun v1.1.7 中修復。

此外,我們還對在指標中搜尋 sentinel 值的程式碼新增了最佳化,在適當的情況下使用 Windows wcslenstrlen 函式,而不是速度較慢的手動實作。

感謝 @dylan-conway 修復此問題!

已修復:程序衍生後可能發生的崩潰

在 Bun v1.1.7 中,已修復當衍生的子程序在 stdin 串流被回收之前被垃圾回收時,有時會發生的崩潰。

感謝 @gvilums 修復此問題!

已修復:在 Worker 執行時退出時崩潰

在 Bun v1.1.7 中,已修復當 Bun 在 Worker 仍在執行時退出時可能發生的崩潰。此崩潰是由於在 std::quick_exit 期間為每個執行緒執行 threadlocal 解構子所導致。

感謝 @dylan-conway 修復此問題!

已修復:在 Windows 上讀取目錄時崩潰

在 Windows 上讀取目錄時,Bun 假設 NT API 中的 FILE_DIRECTORY_INFORMATION 結構是 8 位元組對齊的,根據 Windows API 文件。但是,執行階段安全檢查證明這是錯誤的。我們已放寬程式碼中此結構的對齊要求,此崩潰應不再發生。

已修復:在 Windows 上記憶體不足時崩潰

mimalloc 記憶體配置器由於記憶體不足而傳回 NULL 時,Bun 會因斷言失敗(例如 mimalloc: allocated size is too small)而崩潰。此斷言失敗僅適用於開發和測試,不適用於發佈版本(但是,我們在 Windows 上預設啟用斷言)。

這已在 Bun v1.1.7 中修復。

當系統記憶體嚴重不足或模擬記憶體不足時,將大型檔案上傳到 Bun.serve() 伺服器最容易重現此問題。

已修復:WebSocket 用戶端在 Windows 上發生連線錯誤時崩潰

已修復當 WebSocket 用戶端連線在 Windows 上連線失敗時可能發生的崩潰。我們已新增測試以防止此問題在未來再次發生。

已修復:UDP socket 現在會在有效的埠號上拋出錯誤

在 Bun v1.1.6(先前版本)中,我們引入了 Bun.udpSocket 以支援 UDP socket。

先前,所有不在 1 到 65535 之間的埠號都會被視為 0,並使用隨機分配的埠。現在,如果提供的埠號無效,Bun.udpSocket 會拋出錯誤。

感謝 @gvilums 修復此問題!

已修復:堆疊追蹤顯示不正確的行號

Bun v1.1.7 中已修復一個導致堆疊追蹤有時顯示不正確行號的錯誤(注意:可能還有其他錯誤會導致此問題)。

此錯誤是由於 C++ 程式碼中未初始化的整數所導致。我們正在將 clang-analyzer 新增至 Bun 的 CI,以防止此情況再次發生。

已修復:sourcemap 回歸導致 bun build hang住

Bun v1.1.6 中引入的 sourcemap 回歸導致 bun build 無限期地hang住。這已在 Bun v1.1.7 中修復,並且我們已新增整合測試以防止此問題在未來再次發生。

在類似這樣的「hello world」express.js 應用程式上使用 bun build --sourcemap=external 會hang住

const express = require("express");
const app = express();
const port = 3000;

app.get("/", (req, res) => {
  res.send("Hello World!");
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

我們已新增整合測試,以確保來自 bun build --compile --minify 的輸出可以成功執行簡單的 express.js 應用程式。

已修復:可執行檔往返 Windows 的跨平台編譯

跨平台編譯 <> Windows 有一個檔案路徑錯誤,我們假設如果目前的平台是 Windows 或 posix,則使用該平台的檔案路徑前綴,而不是跨平台編譯目標的平台。此錯誤已修復,感謝 @gvilums

已修復:未讀取的伺服器端請求 body 中的記憶體洩漏回歸

在 Bun v1.0.30 - Bun v1.1.6 中,Bun.serve() 的未讀取傳入 HTTP 請求 body 未被正確清除。這也適用於 node:http 伺服器。

這表示選擇不讀取傳入請求的 body 可能會無限期地消耗記憶體。這已在 Bun v1.1.7 中修復,感謝 @cirospacari,並且我們已新增回歸測試以防止此問題再次發生。

已修復:fs.fdatasync 錯誤中缺少 fd

fs.fdatasync 中拋出錯誤時,錯誤物件中缺少 fd 屬性。這已在 Bun v1.1.7 中修復,感謝 @nektro

已修復:自訂 inspect 例外

當自訂 inspect 函式拋出例外時,Bun 會傳回 [native code]。這令人困惑。我們希望可以將其變更為拋出錯誤,但這將會是破壞性變更。相反地,我們已將其變更為印出 [custom formatter threw an exception],這稍微好一些,但不是我們想要的。在未來的 Bun 版本中,我們將會將其變更為拋出錯誤,但我們不希望您的程式碼在次要版本更新中可能隨機中斷。

ServerWebSocket 微幅最佳化

Zig 中 ServerWebSocket 表示法的記憶體內大小已從 32 位元組縮減為 24 位元組。您可能不會注意到記憶體節省,但由於更好的快取區域性,它可能會使某些函式執行得更快。

使用自訂 inspect fn 的 console.log 效能提升 8%

感謝 17 位貢獻者!