Bun

Bun v0.6.0


Jarred Sumner · 2023 年 5 月 16 日

我們正在招募 C/C++ 和 Zig 工程師,一同打造 JavaScript 的未來!查看職位列表 →

這是 Bun 至今為止最大的一次發布。

Bun 現在內建了 JavaScript 和 TypeScript 打包器和壓縮器。使用它來打包前端應用程式,或將您的程式碼打包成獨立的可執行檔。

我們也一直忙於改進效能和修復錯誤,如同往常一樣:Linux 上的 writeFile() 速度提升高達 20%,Node.js 相容性和 Web API 相容性的大量錯誤修復,支援 TypeScript 5.0 語法,以及 bun install 的各種修復。

Bun 的全新 JavaScript 打包器 & 壓縮器

本次發布的重點是 Bun 的全新 JavaScript 打包器,但打包器僅僅是一個更大專案的開始。在接下來的幾個月裡,我們將宣布 Bun.App — 一個「超級 API」,它將 Bun 原生速度的打包器、HTTP 伺服器和檔案系統路由器整合在一起,形成一個有凝聚力的整體。

它可以使用 bun build CLI 命令或新的 Bun.build() JavaScript API 來使用。

JavaScript
CLI
JavaScript
Bun.build({
  entrypoints: ["./src/index.tsx"],
  outdir: "./build",
  minify: true,
  // ...
});
CLI
bun build ./src/index.tsx --outdir ./build --minify

要了解更多資訊,請查看我們介紹 Bun 打包器的部落格文章

獨立執行檔

您現在可以使用 bun build 建立獨立執行檔。

bun build --compile ./foo.ts

這讓您可以將您的應用程式作為單個可執行檔分發,而無需用戶安裝 Bun。

./foo

您也可以將其最小化,以提高大型應用程式的啟動效能

bun build --minify --compile ./three.ts
  [32ms]  minify  -123 KB (estimate)
  [50ms]  bundle  456 modules
 [107ms] compile  three

這是由 Bun 的全新 JavaScript 打包器和壓縮器所驅動。

import.meta.main

您現在可以使用 import.meta.main 來檢查目前檔案是否為啟動 bun 的入口點。這對於 CLI 判斷目前檔案是否為啟動應用程式的檔案非常有用。

例如,如果您有一個名為 index.ts 的檔案

index.ts
console.log(import.meta.main);

並且您執行它

$ bun ./index.ts
true

但是如果您導入它

other.ts
import "./index.ts";

並且執行它

$ bun ./other.ts
false

bun test 的改進

  • bun test 現在會報告執行測試所花費的時間
  • describe.skip 已實作(感謝 _yogr

  • expect().toBeEven()expect().toBeOdd() 已實作(感謝 will-richards-ii

Linux 上更快的 fs.writeFile

轉譯器改進

此版本還引入了許多對轉譯器的改進。以下是一些重點

  • TypeScript 5.0 的剖析器支援。
  • import attributes 的剖析器支援。
  • 由於 Bun 轉譯器中循環導入的錯誤,某些 npm 套件在導入時拋出「ReferenceError: Cannot access uninitialized variable」錯誤。此問題已修復。
  • 支援 // @jsx// @jsxImportSource// @jsxFragment 註解。
  • 消除未使用全域建構函式呼叫(如 new Set())的無效程式碼。
  • 字串範本字面串聯,如 foo${1}${"2"}${'3'} -> foo123
  • 已棄用的 ES5 with 語句 的剖析器錯誤修復。

非常感謝 @kzc 提供了許多有用的錯誤報告。

Node.js 相容性

  • tls.Server 具有基本支援(先前未實作)
  • fs.promises.constants 現在已正確匯出(先前遺失)
  • node:http 的伺服器模組現在(正確地)接受 callback 參數
  • Timer.refresh() 現在如預期般運作
  • 修復了 mkdtempmkdtempSync 錯誤

Web API 相容性

  • new Request("http://example.com", otherRequest).url 先前會傳回 otherRequest 的 URL,而不是 "http://example.com"。此問題已修復。
  • 已新增 Bun.file(path).lastModified,這類似於 File API 的 lastModified 屬性
  • fetch() 中支援 redirect: "error"
  • 修復了 fetch.bindfetch.callfetch.apply 無法運作的問題

變更日誌

#2556@Jarred-Sumner 實作了 import.meta.main
#2561@privatenumbernode:path 匯出中移除 Object.prototype
#2557@dylan-conway 修復了具有存取器和空洞陣列的 Bun.deepEquals()
#2554@cirospaciari 修復了 fetch({ proxy }) 的問題
#2491@zhongweiy 實作了 BunFile.lastModified
#2567@paperclover 修復了 node:fs/promises 中的 constants 匯出
#2552@cirospaciari 實作了對 tls.Server 的基本支援
#2593@Jarred-Sumner 實作了對 TypeScript 5.0 語法的支援
#2652@paperclover 提升了 crypto.createHash() 的效能
#2661@will-richards-ii 修復了 expect().toBeFalsy() 未遞增斷言的錯誤
#2673@Jarred-Sumner 實作了對 axios 的支援
9e1745e@Jarred-Sumner 修復了 path.dirname() 會為根目錄傳回錯誤路徑的錯誤
#2728@alexlamsl 修復了 bun add <github>
3c4f092移除 由 @Jarred-Sumner
5353d41@Jarred-Sumner 修復了負運算元模數的不正確值
#2748@Jarred-Sumner 修復了無效 JavaScript 的崩潰問題
#2759@Jarred-Sumner 提升了 open()writeFileSync() 的效能
#2761@silversquirl 修復了 Hash.copy() 的不正確輸出
396416a@Jarred-Sumner 修復了 fetch() 中無效輸入的崩潰問題
#2780@alexlamsl 修復了 GitHub 依賴項重複 bun install 的錯誤
#2781@alexlamsl 修復了 devDependencies 未從本機依賴項解析的錯誤
#2754@will-richards-ii 實作了 expect().toBeEven()expect().toBeOdd()
c43c1b5@Electroid 實作了 ClientRequest.setNoDelay()
f95a81e@Jarred-Sumner 修復了 napi_create_external_buffer 中的崩潰問題
c7c5dc1@Jarred-Sumner 實作了 BunFile.name
#2834@alexlamsl 修復了 bun install --cwd 無法正確運作的錯誤
#2841@alexlamsl 變更了 bun add 以忽略無效的工作區
#2843@cirospaciari 修復了 WebSocket.close() 期間的崩潰問題
#2842@cirospaciari 修復了 fetch.bind 不是函式的問題
#2845@cirospaciari 實作了 fetch({ redirect: "error" })
#2836@blackmann 實作了 describe.skip()
5ffee94@Jarred-Sumnerbun test 中為每個測試新增了計時
#2846@cirospaciari 實作了 dns.lookup({ all: true })
#2851@cirospaciari 修復了 mkdtemp()mktempSync() 的虛假錯誤
5c08200@Jarred-Sumner 變更了 node:http 以更好地處理來自 fetch() 的錯誤
#2850@cirospaciari 修復了具有大型 stdout 的 Bun.spawn()
#2869@paperclover 修復了 Windows 的 node:path
#2879@Jarred-Sumner 實作了產生獨立 Bun 可執行檔的支援
#2866@cirospaciari 實作了 Uint8ArrayBun.spawn() stdout 的支援
#2881@Jarred-Sumner 修復了 Request.url 不正確的錯誤

貢獻者

最後,感謝所有來自社群的貢獻者,他們協助改進了此版本的 Bun:@privatenumber@Lawlzer@jakeboone02@zhongweiy@xHyroM@rmorey@marktani@Kruithne@will-richards-ii@simon04@alexlamsl@flakey5@MaanuVazquez@Plecra@silversquirl@beeburrt@aquapi@blackmann@Fire-The-Fox