Bun

Bun v1.1.1


Jarred Sumner · 2024年4月4日

Bun 是一個極速的 JavaScript 執行環境、打包器、轉譯器和套件管理器 — 一應俱全。

Bun v1.1.1 修復了 20 個錯誤(解決了 60 個 👍 讚的反應)。為 Bun Shell 新增子 Shell 和位置引數支援,修復了 Windows 上 bun install + sharp 的問題。錯誤中印出的原始碼不再佔滿您的終端機。升級 JavaScriptCore,其中包含 RegExp、類型陣列、String indexOf 和 String replace 的效能改進。錯誤物件和 JIT 編譯的函式呼叫使用更少的記憶體。修復了 Windows 上 bun install 的幾個錯誤。修復了 Windows 上 Bun.serve() 的一個錯誤。修復了一個 TOML 解析器錯誤,該錯誤影響 .toml 檔案中的跳脫序列和 Windows 路徑。

先前版本

  • v1.1.0 Bundows。Windows 支援來了!此外,還有 JSON IPC Node <-> Bun。
  • v1.0.36 修復了 13 個錯誤。新增了對 fs.openAsBlobfs.opendir 的支援、修復了 package.json 中有多個 bin 條目的 bun install 邊緣案例、修復了 bun build --target bun 編碼、修復了 process.stdin & process.stdout 的錯誤、修復了 http2 中的錯誤、修復了 bun run 中 .env 的錯誤、修復了各種 Bun shell 錯誤並改進了 Node.js 相容性。

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

Windows 支援改進

已修正:bun install 無法在 Windows 上安裝 sharp

由於 Bun Shell 中未實作的功能(該功能支援 Windows 上的生命週期腳本),Sharp 無法在 Windows 上正確安裝。此未實作的功能已實作!Bun Shell 現在支援子 Shell。

我們的測試套件將在未來捕捉到此錯誤

已修正:bun install 在 Windows 上卡住

已修復可能導致 bun install 卡住一段時間的錯誤。

當 Windows API 傳回 ERROR_DELETE_PENDING 時,就會發生此錯誤。當正在刪除資料夾或檔案但尚未完全刪除時,Windows 有時會傳回 ERROR_DELETE_PENDING。zig 標準函式庫透過休眠 1 毫秒然後重試刪除來處理此問題。當一個執行緒開啟控制代碼,而另一個執行緒嘗試刪除檔案時,這會導致競爭條件。另一個執行緒會進入無限迴圈休眠,而另一個執行緒永遠沒有機會刪除檔案。

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

已修正:bun install 在 Windows 上出現虛假的「安裝失敗」錯誤

已修復可能導致 bun install 中出現虛假的「安裝失敗」錯誤的錯誤。當同時安裝許多套件時,最常發生這種情況。

也修復了涉及 @scoped/package 範圍套件的類似錯誤。

為什麼會發生這種情況?

Windows 中的權限有點奇怪。已開啟的檔案控制代碼具有「共用模式」,這會阻止其他檔案控制代碼在沒有相同權限的情況下開啟同一個檔案。在 zig 標準函式庫中,ERROR_SHARING_VIOLATION 錯誤未正確處理。另外,某些函式也未要求相同的「共用模式」,這會導致 ERROR_SHARING_VIOLATION 錯誤。如果您一直無法在 Windows 上刪除檔案而不關閉應用程式,這通常是原因。

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

已修正:Windows 上的工作區連結錯誤

已修復 bun install 在連結工作區時可能傳回 error: Unexpected 的錯誤。

這是因為將格式不正確的檔案系統路徑傳遞給 Windows API 所導致。

已修正:bunx 中出現「無法找到可執行檔」錯誤

已修復執行 bunx <package> 時,有時會傳回 error: unable to find executable,但實際上應該可以找到可執行檔的錯誤。

此錯誤是由 bunx 中的快取失效錯誤所導致。bunx 正在檢查目標套件的 package.json,而不是將目標套件新增為相依性的產生 package.json。該檔案的檔案系統建立時間可能來自原始套件發佈到 npm 的時間,這表示它幾乎總是會使可執行檔失效。另外,還有另一個錯誤,bunx 會檢查 package.json 的建立時間兩次,第一次是在嘗試使用快取版本時,第二次是在新安裝套件之後。檢查第二次是不必要的,因為它是新建立的。

已修正:Git 相依性出現「安裝失敗」錯誤

已修復 bun install 無法複製或檢查 Git 儲存庫(該儲存庫具有 Git 儲存庫的相依性)的錯誤。此錯誤是由於在執行 git clonegit checkout 命令時,假設目標套件的目前工作目錄繼續具有有效的檔案描述元所導致。我們已將其切換為使用絕對檔案系統路徑,透過 git 中的 -C 旗標。

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

已修正:在 bun init 中按下 CTRL+C 時出現虛假的錯誤

已修復在 bun init 中按下 CTRL+C 時會發生的錯誤。

已修正:npm install -g bun 現在應該可以在 Windows 上運作

抱歉。如果您在 Windows 上使用 npm install -g bun 時仍然遇到問題,請告訴我們。

執行環境改進

錯誤追蹤中截斷的原始碼預覽

當擲出最上層例外時,Bun 會印出相關的原始碼,以協助您更快地偵錯錯誤。

通常,它看起來像這樣

1 | function oops() {
2 |   throw new Error("Woopsie woops!");
            ^
error: Woopsie woops!
      at oops (woopsie.js:2:9)
      at woopsie.js:5:1

但是,如果錯誤發生在縮小的檔案中會發生什麼事?它看起來會像這樣

1 | function oops() {
2 | var h=1,t=2,m=3,x=4,m={o:{n:{t:{a:[{n: a}, {b: "uffalos"},() => {throw new Error("Woopsie woops!")}]}}}},j=q.u.e.r.y[0];such();minified();

error: Woopsie woops!
      at oops (woopsie.js:2:9)
      at woopsie.js:5:1

有些函式庫會發佈縮小的原始碼。大多數縮小器會嘗試將盡可能多的程式碼壓縮在單行上,以減少網路上的位元組數。嘗試將其列印到您的終端機是...混亂的。

先前,Bun 只會將最近的 4 行印到您的終端機。現在,我們將原始碼截斷為每行最多 1024 個位元組。如果程式碼長度超過 512 個位元組,我們也會隱藏分叉 ^ 字元,因為這樣最終會產生大量的空白。這使其更容易閱讀錯誤訊息。

JavaScriptCore 升級

我們已將 JavaScriptCore 升級到最新版本,其中有一些效能和記憶體改進。

錯誤修復

  • 已修復具有多個 new 關鍵字的成員運算式的來源位置錯誤,感謝 @alexey - #27567fb2a9f3

已修正:TOML 解析器錯誤,包含跳脫序列和 Windows 檔案系統路徑

已修復 Bun 的 TOML 解析器未正確處理跳脫序列和 Windows 檔案系統路徑的錯誤,並且我們新增了更多測試以防止再次發生這種情況。

已修正:當 node:vm 跨全域物件擲出例外時發生崩潰

已修復在 node:vm 環境中執行的程式碼擲出例外,並由主要全域物件處理時可能發生的崩潰。

此崩潰是由於假設全域物件與主要全域物件是同一個物件所導致。

已修正:process.dlopen 現在支援 file: URL

Bun 中的 process.dlopen 現在支援從 file: URL 載入共用函式庫。傳遞至 process.dlopenfile: URL 會自動轉換為檔案系統路徑。

已修正:ResolveMessage.message 和 BuildMessage.message 現在可寫入

當嘗試在 Bun 中使用 ESLint 時,有時會擲出錯誤,指出「嘗試寫入唯讀屬性 'message'」。這是由於 message 屬性在 Bun 的 ResolveMessageBuildMessage 類別中是唯讀的所導致。這不是一個很好的修復方法,BuildMessageResolveMessage 實際上應該擴充 Error 而不是它們自己的類別 - 但無論如何這是一個修復方法。

Bun Shell 改進

Bun Shell 為 Windows 上 bun run 中的 package.json 腳本和 bun install 中的生命週期腳本提供支援。

子 Shell

Bun Shell 現在支援子 Shell。

import { $ } from "bun";

await $`echo hey $(echo hi)`;
// > hey hi

子 Shell 經常被用來將多個命令組合成單個命令。

在 Windows 上,這也表示 bun run package.json 腳本現在支援子 Shell。

感謝 @zackradisic 實作了此功能。

位置引數,使用 $0、$1、$2 至 $9

Bun Shell 現在支援使用 $0$1$2$9 的位置引數。

執行以下腳本

import { $ } from "bun";

await $`echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9`;

從 Bun Shell 將會印出

bun ./script.ts hello world foo bar baz
bun ./script.ts hello world foo bar baz

先前,這會印出

bun ./script.ts hello world foo bar baz
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9

感謝 @nektro 實作了此功能。

感謝 8 位貢獻者!