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.url
,import.meta.env
,expect.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 -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
Bun.Glob
Bun.Glob
是一個快速的 API,用於使用 glob 模式匹配檔案和字串。
它類似於流行的 Node.js 函式庫,例如 fast-glob
或 micromatch
,只是它匹配字串的速度快了 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 實作此功能!還要感謝 @mrmlnc 的 fast-glob
以及 micromatch
和 picomatch
的貢獻者,我們的測試靈感來自於他們。我們 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 現在在建置失敗時顯示更好的錯誤訊息
- 修復了一個錯誤,該錯誤僅突顯了第一個字元
- 修剪了錯誤訊息中多餘的換行符
- 使建置錯誤的樣式與運行時錯誤的樣式相符
更好的匯出和匯入錯誤訊息
在下一個版本的 Bun 中
— Jarred Sumner (@jarredsumner) 2023 年 11 月 19 日
當您將具名匯入與預設匯入混淆時,它會建議改用具名匯入 pic.twitter.com/UGIxbEeO7C
在下一個版本的 Bun 中
— Jarred Sumner (@jarredsumner) 2023 年 11 月 19 日
當您將預設匯入與具名匯入混淆時,它會建議改用預設匯入 pic.twitter.com/Tjx3px19pa
針對不支援的 ESM <> CommonJS 功能的錯誤
Bun 在同一個檔案中同時支援 require()
和 import
,但是您不能在同一個檔案中使用 import 和 module.exports
。您也不能使用 exports
、module
、with
或頂層 return。
以前,Bun 依賴 JavaScriptCore 的運行時錯誤訊息來處理此問題,但是錯誤訊息有點令人困惑。
現在,這些錯誤在建置時被偵測到,並顯示更好的錯誤訊息。在此範例中,您不能在同一個檔案中使用 import
和 with
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()
不支援 SIGKILL
和 SIGSTOP
。
process.kill("SIGKILL"); // or "SIGSTOP"
如果您遇到以下錯誤,現在已修復
RangeError: Unknown signal name
感謝 @antongolub 修復此錯誤!
如果您想查看完整的變更日誌,可以在這裡找到。