我們正在招募 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 來使用。
Bun.build({
entrypoints: ["./src/index.tsx"],
outdir: "./build",
minify: true,
// ...
});
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 打包器和壓縮器所驅動。
獨立執行檔即將在 Bun v0.6.0 中推出 pic.twitter.com/eaUeFtKisL
— Jarred Sumner (@jarredsumner) 2023 年 5 月 14 日
import.meta.main
您現在可以使用 import.meta.main
來檢查目前檔案是否為啟動 bun 的入口點。這對於 CLI 判斷目前檔案是否為啟動應用程式的檔案非常有用。
例如,如果您有一個名為 index.ts
的檔案
console.log(import.meta.main);
並且您執行它
$ bun ./index.ts
true
但是如果您導入它
import "./index.ts";
並且執行它
$ bun ./other.ts
false
bun test
的改進
bun test
現在會報告執行測試所花費的時間
在下一個版本的 bun 中
— Jarred Sumner (@jarredsumner) 2023 年 5 月 11 日
bun:test 印出每個測試所花費的時間
速度慢的測試會以黃色突出顯示 pic.twitter.com/yXDSJrkYBu
describe.skip
已實作(感謝 _yogr)expect().toBeEven()
和expect().toBeOdd()
已實作(感謝 will-richards-ii)
Linux 上更快的 fs.writeFile
在下一個版本的 Bun 中
— Jarred Sumner (@jarredsumner) 2023 年 4 月 27 日
Linux 上大型檔案的 fs.writeFile 速度提升 20% pic.twitter.com/QgWhBoiz2c
轉譯器改進
此版本還引入了許多對轉譯器的改進。以下是一些重點
- 對 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()
現在如預期般運作- 修復了
mkdtemp
和mkdtempSync
錯誤
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.bind
、fetch.call
和fetch.apply
無法運作的問題
變更日誌
#2556 | 由 @Jarred-Sumner 實作了 import.meta.main |
#2561 | 由 @privatenumber 從 node: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-Sumner 在 bun 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 實作了 Uint8Array 對 Bun.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