Bun

Bun v1.1.18


Dylan Conway · 2024年7月3日

Bun v1.1.18 隆重登場!此版本修正了 55 個錯誤(解決了 493 個 👍)。支援 npmrc。改進了常數折疊與列舉內聯。改進了 functions 的 console.log 輸出。修正了在工作區中修補依賴項的問題。修正了在連結二進制檔案時 bun install 中的多個錯誤。修正了 dns.lookup 中的崩潰,並標準化 DNS 錯誤以更好地匹配 Node。修正了 Bun.escapeHTML 中的斷言失敗。升級了 JavaScriptCore。

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

先前的版本

  • v1.1.17 修正了 4 個錯誤。修正了 bun repl 中的崩潰。使 macOS 上小型目錄中的 fs.readdirSync 速度提升 5%。修正了 “ws” 模組在 “send” 方法中未調用回調的問題。修正了在 bun install 中讀取損壞的 lockfile 時發生的崩潰。使 macOS 事件循環稍微加快。
  • v1.1.16 修正了 41 個錯誤(解決了 221 個 👍)。bun test 中的 lcov 程式碼覆蓋率報告,從私有 git 倉庫(包括 Gitlab 和 Bitbucket)安裝依賴項。Buffer.from(string, "base64") 在大型輸入上速度提升 6 倍 - 30 倍。修復了 bun patchbun install、N-API addons 的錯誤,transpiler 的錯誤修復以及 Node.js 相容性改進。
  • 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

.npmrc 支援

Bun v1.1.18 新增了讀取 .npmrc 檔案的支援,使 bun install 能夠使用您現有的 npm 登錄檔配置,包括私有登錄檔和作用域套件。

.npmrc
; .npmrc
@my-company-scope:registry=https://packages.my-company.com

bun install 也支援從 package-lock.json 遷移現有的套件版本。

結合 `.npmrc`,您現在可以輕鬆地在公司測試 bun install,而無需更改設定檔。或者您可以偷偷試用 Bun 而不被同事注意到(除了,也許安裝之間喝咖啡的時間變少了)。

enum 內聯

Bun 的最佳化轉譯器現在支援內聯 TypeScript enum 值,這在某些情況下可以提高效能。例如

const enum Version {
  major = 1,
  minor = 1,
  patch = 18,
  pretty = `${major}.${minor}.${patch}`,
}

console.log("Bun v" + Version.pretty);

現在轉譯為

console.log("Bun v1.1.18");

先前,這會轉譯為

var Version;
(function (Version2) {
  Version2[(Version2["major"] = 1)] = "major";
  Version2[(Version2["minor"] = 1)] = "minor";
  Version2[(Version2["patch"] = 18)] = "patch";
  Version2[
    (Version2[
      "pretty"
    ] = `${Version2.major}.${Version2.minor}.${Version2.patch}`)
  ] = "pretty";
})(Version || (Version = {}));
console.log("Bun v" + Version.pretty);

此行為在 Bun 的運行時環境中預設啟用,並且在啟用 `--minify-syntax` 時在 bun build 中也啟用。

當使用帶有長字串的 const enum 時請小心,因為這可能會增加您轉譯後的程式碼大小。

感謝 @paperclover 的這項最佳化!

常數折疊改進

此版本新增了在 Bun 的最佳化轉譯器中,預先對靜態已知值執行常數折疊位元運算的支援。

這適用於數字

in.ts
- console.log(1 << 3);
+ console.log(8);
- console.log(1 | 3);
+ console.log(3);
- console.log(1 ^ 3);
+ console.log(2);
- console.log(1 >> 3);
+ console.log(0);
- console.log((1 + 1) ^ 2);
+ console.log(0);
- console.log(0xFF & 0x50);
+ console.log(80);

這也適用於字串

in.ts
- console.log("hello " + 25);
+ console.log("hello 25");

在內部,我們重複使用 JavaScriptCore 的一些程式碼,以確保它與 JavaScript 引擎的行為一致。

Bun 的運行時環境、bun buildbun testBun.buildBun.Transpiler 都支援此行為。

感謝 @paperclover 的這項最佳化!

TypeScript 命名空間合併

在 TypeScript 中,重複的同級 namespace 宣告會合併為單一共享宣告。Bun 現在支援此行為,其語義與 TypeScript 的編譯器 (tsc) 相同

以下輸入

in.ts
namespace A {
  export const a = 1;
}

namespace A {
  export const b = a + 1;
}

console.log(A.a, A.b);

現在求值為預期輸出

out.sh
bun run in.ts
1 2

先前,這會出錯

1 | namespace A {
2 |   export const a = 1;
3 | }
4 |
5 | namespace A {
6 |   export const b = a + 1;
                       ^
ReferenceError: Can't find variable: a
      at in.ts:6:20
      at in.ts:6:24

Bun 的運行時環境、bun buildbun testBun.buildBun.Transpiler 都支援此行為。

感謝 @paperclover 修復了這個問題!

改進了 functions 的 console.log 輸出

Bun 現在將會 console.log 函數物件類型。例如

function a() {}
async function b() {}
function* c() {}
async function* d() {}
console.log(a, b, c, d);

現在將輸出

[Function: a] [AsyncFunction: b] [GeneratorFunction: c] [AsyncGeneratorFunction: d]

感謝 @erik-dunteman 的這項改進!

已修正:Bun.escapeHTML 中的斷言失敗

當使用啟用 SIMD 的 latin1 編碼輸入進行跳脫字元處理時,Bun 由於在更新緩衝區的長度值之前寫入緩衝區而導致斷言失敗(不是緩衝區溢位,因為記憶體在此時已分配)。

已修正:bun install 二進制檔案連結順序

為了確保安裝是確定性的,Bun 現在將按字母順序連結二進制檔案,如果目的地已存在,則跳過連結二進制檔案。

已修正:bun install 後缺少或錯誤的二進制檔案

當 package node_modules 中有多個副本時,Bun 僅連結了套件的第一個已安裝副本的二進制檔案。現在 Bun 將連結所有副本的二進制檔案,防止使用錯誤的二進制檔案,或可能根本找不到二進制檔案。

已修正:在 bun install 期間標準化 shebang 行尾

Bun 現在將標準化 shebang 行尾,使二進制檔案無論使用 CRLF 或 LF 行尾都能正常工作。

已修正:bun pm trust 中的斷言失敗

當在 node_modules 中對父套件已受信任的套件執行 bun pm trust 時,會發生斷言失敗。感謝 @dylan-conway 修復了此問題

已修正:bun install 中 “overrides” 的崩潰

給定以下 package.json

{
  "dependencies": {
    "is-even": "1.0.0"
  },
  "overrides": {
    "is-odd": "https://my-registry.com/is-odd/-/is-odd-1.2.3.tgz"
  }
}

應該安裝來自 `my-registry.com` 的 `is-odd@1.2.3`,因為 `is-even@1.0.0` 依賴於 `is-odd`。先前,Bun 在嘗試安裝此覆寫時會崩潰,因為它預期覆寫不是 tarball URL。感謝 @dylan-conway 修復了此問題。

已修正:Windows 上 bun test 目錄開啟權限

在 Windows 上搜尋要測試的檔案時,Bun 使用 `DELETE` 存取遮罩開啟目錄,這可能會導致產生的進程無法變更其工作目錄。

已修正 `dns.lookup` 中的崩潰

已修復當給定格式錯誤的主機名稱時 `dns.lookup` 中的崩潰,並新增了改進的 DNS 錯誤訊息,以更好地匹配 node。

const dns = require("dns");
dns.lookup(".", (err) => {
  console.log(err.name); // `DNSException`, previously `Error`
  console.log(err.errno); // `4`, previously `undefined`
});

bun patch 在工作區中的錯誤修復

修復了一個錯誤,其中 `bun patch <package>` 無法在工作區中找到要修補的依賴項。當依賴項被提升到不同的位置時,就會發生這種情況。

感謝 @zackradisic 修復了此問題!

JavaScriptCore 升級

我們已升級到最新版本的 JavaScriptCore,其中修復了擴展語法語義 (`{... object }`)、x64 上的 WebAssembly 評估以及 RegExp 和異常處理中罕見崩潰的錯誤。

感謝 12 位貢獻者!