2024 年 4 月 1 日 Bun v1.1 如期發布,開發者現在可以在 Windows 10 及更高版本上運行 Bun。 這是一個巨大的里程碑,也意味著 Bun 能讓更多的開發者受益。
Windows 上的 Bun 通過了 macOS 和 Linux 上的 Bun 測試套件的 98% 測試。 這意味著從運行時、測試運行器、包管理器到打包器的所有內容都可以在 Windows 上運行。
要開始在 Windows 上使用 Bun,可以在終端中運行以下命令:
powershell -c "irm bun.sh/install.ps1 | iex"
Windows 上運行 Bun 帶來了巨大的性能提升,比如:
Bun 在 Windows 上優化了 Node.js API 以使用 Windows 上最快的系統調用。
例如,Bun 上的 fs.readdir() 比 Windows 上的 Node.js 快 58%。
fs.readdir(__dirname, (err, files)=> {
if (err)
console.log(err);
else {
console.log("\nCurrent directory filenames:");
files.forEach(file=> {
console.log(file);
})
}
})
Bun 內置了對 JavaScript、TypeScript 和 JSX 的支持,由 Bun 高度優化的本機代碼編寫的轉譯器提供支持。
Summary
bun --bun ./node_modules/.bin/tsc --help ran
1.38 ± 0.06 times faster than node ./node_modules/.bin/tsc --help
2.40 ± 0.09 times faster than bun-1.0.14 --bun ./node_modules/.bin/tsc --help
自 Bun 1.0 以來為大于 50KB 的文件實現了內容可尋址緩存,以避免重復轉譯相同文件的性能開銷。從而使得 tsc 等命令行工具的運行速度比 Bun 1.0 快 2 倍。然而 Bun v1.1 性能得到明顯提升。
Bun 現在是一個跨平臺的 shell,類似于 bash,但也可以在 Windows 上運行。
import {spawnSync} from "child_process";
// 這里可以做很多事情
const {status, stdout, stderr}=spawnSync("ls", ["-l", "*.js"], {
encoding: "utf8",
});
Bun Shell 是一個詞法分析器、解析器和解釋器,實現了類似 bash 的編程語言,以及一系列核心實用程序,例如 ls、rm 和 cat。 shell 還可以使用 Bun.$ API 從 JavaScript 和 TypeScript 運行。
import {$} from "bun";
// 輸出到 stdout
await $`ls *.js`;
// 輸出到 string 字符串
const text=await $`ls *.js`.text();
該語法使得在 shell 和 JavaScript 之間傳遞參數、緩沖區和管道變得容易:
const response=await fetch("https://example.com/");
// 響應輸出到 stdin
// 將 stdout 寫入到 JavaScript
const stdout=await $`gzip -c <${response}`.arrayBuffer();
Bun 現在有一個內置的 Glob API,用于使用 glob 模式匹配文件和字符串,其與流行的 Node.js 庫(如 fast-glob 和 micromatch)類似,但它匹配字符串的速度快了 3 倍。
使用 glob.match() 將字符串與 glob 模式進行匹配:
import {Glob} from "bun";
const glob=new Glob("**/*.ts");
const match=glob.match("src/index.ts");
// 輸出 true
使用 glob.scan() 通過 AsyncIterator 列出與 glob 模式匹配的文件:
const glob=new Glob("**/*.ts");
for await (const path of glob.scan("src")) {
console.log(path);
// 輸出內容 "src/index.ts", "src/utils.ts"
}
更多關于 Bun v1.1 新特性可以參考文末資料,本文不再過多展開。
https://bun.sh/blog/bun-v1.1#large-projects-start-2x-faster
https://www.geeksforgeeks.org/node-js-fs-readdir-method/
https://www.oschina.net/news/285850/bun-1-1-released
近日,隨著 WinterJS 1.0 的發布,Bun 這邊也加快了開發進展,截止發文,Bun for Windows 目前通過了 Bun 測試套件的 93.88%,一旦 Bun for Windows 通過了 Bun 測試套件的 95% ,Bun 將發布支持 Windows 的 Bun 1.1 版本。
JavaScript 運行時越來越多優秀的選手加入對局,在很久以前以前僅限于客戶端的 JavaScript,終于可在服務端大展身手。然而隨著眾多的運行時發布,相互之間的兼容性難以保持平衡。
對此 Cloudflare 與 Vercel、Shopify 將與 Node.js 和 Deno 的個人核心貢獻者合作,共同成立一個新的社區小組,命名為 WinterCG,該小組匯集了三個最大的 JavaScript 環境,為開發人員提供了靈活性和選擇,同時創建邊緣計算的未來標準。
為了能夠更直觀的查看不同運行時的兼容性表現,Vercel 工程師 Tom Lienard 宣布與 Matt Kane、UnJS、CanadaHonk 和 Open Web Docs 人員合作推出一個新的開源項目 Runtime Compat,用于顯示不同 JavaScript 運行時之間的 API 兼容性,下面讓我們一起看一下 Runtime Compat 有什么好玩的有趣的功能吧。
在不同的 JavaScript 運行時中顯示 API 的兼容性。數據是使用 mdn-bcd-collector 中的運行時測試自動生成的,并以 MDN 瀏覽器兼容性數據格式發布。
警告:當前數據并非 100% 準確,而是自動生成的。
數據是使用 mdn-bcd-collector 項目中的測試生成的。這些最初是為 MDN 的 browser-compat-data 創建的,該數據支持 MDN Web Docs 和 CanIUse 等網站。這些測試旨在在瀏覽器環境中運行,因此我們使用了一個稍微修改過的測試工具版本,以便讓它們能夠在非瀏覽器運行時執行。
每個運行時代碼略有不同,因為它們被設計成以不同方式調用。廣義上分為兩組:可直接從 CLI 運行的和通過 HTTP 請求調用的其他類型。對于后者,我們使用項目自己的開發服務器,然后使用 start-server-and-test 來啟動服務器并請求運行測試文件的函數。
每個運行時目錄中都會生成一個 data.json 文件,其中包含了測試結果。如果要檢查特定測試失敗原因,請首先檢查此文件內容,因為它包含了每個測試的代碼和錯誤消息。
然后另一個腳本處理這些文件,并將其與 browser-compat-data 項目關于每個 API 的元數據結合起來,并將數據作為 JSON 文件寫入 runtime-compat-data 目錄,然后發布到 npm 作為 runtime-compat-data 模塊。
可以在本地運行這些測試,但實際數據生成過程是通過 GitHub Actions 運行完成,如果有任何更改,則會打開 PR 。
實際測試是設計在瀏覽器中運行的,因此可能存在不一致性。出于同樣的原因,它們也不會測試任何 WinterCG 特定功能。
通常使用托管服務來運行幾個支持的運行時。這些通過開發庫或服務器在本地進行測試,可能與生產環境有所不同。
一些運行時可能會定義特定的 API 對象或方法,但作為一個存根或空操作而不是實際功能。在大多數情況下,這將被顯示為受支持的。通常這些功能在瀏覽器環境之外沒有意義,但已經實現以允許代碼跨平臺運行。
這些測試是為瀏覽器創建的,因此它們對其環境做出了一些假設。我們盡量解決盡可能多的問題,但仍然存在錯誤負面影響。例如,大多數請求和 URL 測試都假定它們可以創建相對 URL。由于設計原因,在大多數非瀏覽器運行時中這種方式無法工作,因為沒有 location.href 供其相對參照。目前這意味著很多這些測試報告為失敗,即使運行時支持其中的大部分功能。
測試僅針對每個運行時的最新穩定版本進行,因此數據僅顯示該功能當前是否受支持。在大多數情況下,這些運行時會定期更新,所以這不應該是一個問題。唯一的例外是 Node.js,它經常使用舊版本運行。對于這種情況,您可能希望將數據與 MDN 文檔進行比較,其中包含有關舊版本 Node 的支持詳細信息。
在線查看:https://runtime-compat.unjs.io
項目地址:https://github.com/unjs/runtime-compat