Bun

Bun v1.0.14


Ashcon Partovi · 2023 年 11 月 22 日

Bun v1.0.14 引入了 Bun.Glob,這是一個快速的 API,用於使用 glob 模式匹配檔案和字串。它還修復了在 bun install 期間提取依賴項時的競爭條件,改進了 node_modules 中的 TypeScript 模組解析,並使錯誤訊息更易於閱讀。

Bun 是一個速度驚人的 JavaScript 運行時、打包器、轉譯器和套件管理器 — 功能All-in-One。如果您錯過了,以下是 Bun 最近的一些變更

  • v1.0.9 - 修復了 glibc 符號版本錯誤、非法指令錯誤、Bun.spawn 錯誤、對等依賴項安裝的邊緣案例以及 JSX 轉譯器錯誤修復
  • v1.0.10 - 修復了 14 個錯誤(解決了 102 個 👍 表情符號),node:http 速度提升了 14%,Bun for Linux ARM64 的穩定性改進,bun install 錯誤修復以及 node:http 錯誤修復
  • v1.0.11 - 修復了 5 個錯誤,添加了 Bun.semver,修復了 bun install 中的錯誤,並修復了影響 astro@google-cloud/storage 的錯誤
  • v1.0.12 - 新增 bun -e 用於評估腳本,bun --env-file 用於載入環境變數,server.urlimport.meta.envexpect.unreachable(),改進的 CLI 說明輸出等等
  • v1.0.13 - 修復了 6 個錯誤(解決了 317 個 👍 表情符號)。'http2' 模組和 gRPC.js 現在可以運作了。Vite 5 和 Rollup 4 可以運作了。實作了 process.report.getReport(),改進了對 ES5 'with' 陳述式的支援,修復了 bun install 中的回歸錯誤,修復了列印例外時的崩潰問題,修復了 Bun.spawn 錯誤,並修復了對等依賴項錯誤

要安裝 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.Glob

Bun.Glob 是一個快速的 API,用於使用 glob 模式匹配檔案和字串。

它類似於流行的 Node.js 函式庫,例如 fast-globmicromatch,只是它匹配字串的速度快了 3 倍。

使用 glob.scan() 掃描與 glob 匹配的檔案,這會返回一個 AsyncIterator,產生匹配的路徑。

import { Glob } from "bun";

const glob = new Glob("**/*.ts");
for await (const path of glob.scan("src")) {
  console.log(path); // "src/index.ts"
}

使用 glob.match() 將字串與 glob 模式進行匹配。

import { Glob } from "bun";

const glob = new Glob("**/*.ts");

const match = glob.match("src/index.ts");
console.log(match); // true

感謝 @zackradisic 實作此功能!還要感謝 @mrmlncfast-glob 以及 micromatchpicomatch 的貢獻者,我們的測試靈感來自於他們。我們 Zig 實作的很大一部分靈感來自 Devon Govett (@devongovett) 和 Stephen Gregoratto (@The-King-of-Toasters) 的 glob 實作,我們對此表示感謝。

修復了使用 bun install 時依賴項遺失的錯誤

Bun 存在競爭條件,在同時提取多個相同套件的不同版本時,可能會導致 bun install 偶爾無法安裝依賴項。這是由於 Bun 建立用於安裝依賴項的臨時檔案名稱的方式存在錯誤所致。使用的路徑不夠唯一,這可能會導致一個建置覆蓋另一個建置的臨時資料夾,有時會發生這種情況。

node_modules 中的 TypeScript 模組解析變更

為了模擬 tsc 行為,Bun 在 JavaScript 檔案之前載入 TypeScript 檔案。這在本地開發中運作良好,但有時 npm 套件會運送轉譯器無法轉譯的 TypeScript 原始碼檔案,例如

  • TypeScript 轉換器外掛程式。
  • 使用 import {Foo} 而不是 import {type Foo}
  • 使用 export {Foo} 而不是 export {type Foo}

接下來,當在 node_modules 內部時,如果 JavaScript 檔案和 TypeScript 檔案都存在,Bun 將優先選擇 JavaScript 檔案。

這修復了如下所示的錯誤

SyntaxError: Indirectly exported binding name 'Foo' is not found.

Bun 繼續支援 node_modules 中的 TypeScript 檔案。當 .ts.js 檔案都存在時,在 node_modules 內部時,Bun 將優先選擇 .js 檔案。否則,Bun 繼續優先選擇 .ts 檔案。

建置失敗時更易於閱讀的錯誤訊息

Bun 現在在建置失敗時顯示更好的錯誤訊息

  • 修復了一個錯誤,該錯誤僅突顯了第一個字元
  • 修剪了錯誤訊息中多餘的換行符
  • 使建置錯誤的樣式與運行時錯誤的樣式相符

更好的匯出和匯入錯誤訊息


針對不支援的 ESM <> CommonJS 功能的錯誤

Bun 在同一個檔案中同時支援 require()import,但是您不能在同一個檔案中使用 import 和 module.exports。您也不能使用 exportsmodulewith 或頂層 return。

以前,Bun 依賴 JavaScriptCore 的運行時錯誤訊息來處理此問題,但是錯誤訊息有點令人困惑。

現在,這些錯誤在建置時被偵測到,並顯示更好的錯誤訊息。在此範例中,您不能在同一個檔案中使用 importwith

import "abc";

with (Bun) {
  write("/tmp/file.txt", escapeHTML(file("/tmp/file.html").text()));
  console.log({
    contents: file("/tmp/file.txt").text(),
  });
}

之前

1 | import "abc";
2 |
3 | with (Bun) {
   ^
SyntaxError: Unexpected string literal "abc". import call expects one or two arguments.
      at unsupported.js:3:0

之後

1 | import "abc";
           ^
error: Cannot use import statement with CommonJS-only features
    at unsupported.js:1:8 7

note: Try require("abc") instead
note: This file is CommonJS because a "with" statement is used

console.log 中顯示類別名稱

console.log() 現在在更多情況下顯示物件的類別名稱,這與 Node.js 的行為相符。

class Foo {}
class Bar {
  value = 1;
}

console.log(new Foo()); // Foo {}
console.log(new Bar()); // Bar { value: 1 }

感謝 @JibranKalia 實作此功能!

修復了使用 process.kill() 的信號

修復了一個錯誤,其中 process.kill() 不支援 SIGKILLSIGSTOP

process.kill("SIGKILL"); // or "SIGSTOP"

如果您遇到以下錯誤,現在已修復

RangeError: Unknown signal name

感謝 @antongolub 修復此錯誤!

如果您想查看完整的變更日誌,可以在這裡找到。

感謝 7 位貢獻者!