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.openAsBlob
和fs.opendir
的支援、修復了package.json
中有多個bin
條目的 bun install 邊緣案例、修復了bun build --target bun
編碼、修復了 process.stdin & process.stdout 的錯誤、修復了 http2 中的錯誤、修復了 bun run 中 .env 的錯誤、修復了各種 Bun shell 錯誤並改進了 Node.js 相容性。
安裝 Bun
curl -fsSL https://bun.dev.org.tw/install | bash
npm install -g bun
powershell -c "irm bun.sh/install.ps1|iex"
scoop install 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
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 clone
或 git 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 升級到最新版本,其中有一些效能和記憶體改進。
- 函式呼叫的內嵌快取已重新設計,減少了記憶體使用量,感謝 @Constellation - #65c8acc46999 #d0345d69220e
- 錯誤位置追蹤已重新設計以減少記憶體使用量,感謝 @MenloDorian:#22880
- 包含非 ASCII 字元的區分大小寫
RegExp
現在已 JIT 編譯,感謝 @msaboff:#26391 - String.prototype.includes、String.prototype.replace 會根據輸入調整其搜尋方式,感謝 @Constellation:#bacdbdaaf182
- 字串乘以數字的速度提高了 18%,感謝 @Constellation - #57a7762336ee
- RegExp /u 旗標現在尊重代理對的原子性,感謝 @msaboff - #584a9a820ab2
Float32Array
存取速度提高了 9%,感謝 @Constellation - #eebb374f2bcd- 當一個字串是 ascii,而另一個字串具有非 ascii 時,檢查兩個字串是否相等的速度提高了 1%,感謝 @Constellation:#bacdbdaaf1
錯誤修復
- 已修復具有多個
new
關鍵字的成員運算式的來源位置錯誤,感謝 @alexey - #27567fb2a9f3
已修正:TOML 解析器錯誤,包含跳脫序列和 Windows 檔案系統路徑
已修復 Bun 的 TOML 解析器未正確處理跳脫序列和 Windows 檔案系統路徑的錯誤,並且我們新增了更多測試以防止再次發生這種情況。
已修正:當 node:vm
跨全域物件擲出例外時發生崩潰
已修復在 node:vm
環境中執行的程式碼擲出例外,並由主要全域物件處理時可能發生的崩潰。
此崩潰是由於假設全域物件與主要全域物件是同一個物件所導致。
已修正:process.dlopen
現在支援 file:
URL
Bun 中的 process.dlopen
現在支援從 file:
URL 載入共用函式庫。傳遞至 process.dlopen
的 file:
URL 會自動轉換為檔案系統路徑。
已修正:ResolveMessage.message 和 BuildMessage.message 現在可寫入
當嘗試在 Bun 中使用 ESLint 時,有時會擲出錯誤,指出「嘗試寫入唯讀屬性 'message'」。這是由於 message
屬性在 Bun 的 ResolveMessage
和 BuildMessage
類別中是唯讀的所導致。這不是一個很好的修復方法,BuildMessage
和 ResolveMessage
實際上應該擴充 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 實作了此功能。