Bun 課堂筆記
對比 | Node.js | Bun |
---|---|---|
語言 | C++ | Zig |
JS 引擎 | V8 | JSCore |
Zig:https://ziglang.org/
關於 V8 和 JSCore 各自有不同的架構和最佳化策略:
- JSC 優先考慮的是更快的啟動時間和更少的記憶體佔用,執行時間會稍微久一下
- V8 優先考慮快速執行,同時進行執行時的最佳化,但是 V8 會導致更多的記憶體佔用
因此 Bun 這個執行時的特點就是速度很快,特別是啟動速度,基本比 Node.js 快 3-4 倍。
Bun 官網:https://bun.sh/
首先第一步需要安裝 Bun,直接使用 npm 全域性安裝即可:
npm install -g bun
安裝完成之後透過 bun -v 可以檢視版本。
包管理器
Bun 除了是一個 JavaScript 執行時,同時還是一個包管理器。
回顧在 Node.js 環境中,流行的包管理器:
- npm(官方)
- yarn
- pnpm
但是 Bun 中,天然就自帶包管理器。
測試執行器
Bun 同時還自帶測試執行器。Bun 的內部有一個內建的測試模組 bun:test
如果你熟悉 Jest/Vitest,那麼你可以無縫的遷移過來,零學習成本。
總結
Bun 首先是一個 JS 的執行時,但是不僅僅是執行時,還是一個全能的工具包,其中包含了:
- 包管理器
- 測試執行器
- 構建工具
- 轉譯器(天生支援 ts)
除此之外,Bun 還有相當多的非常實用的特性:
- 天生支援 ts 以及 JSX
- ESM 和 CommonJS 相容
- 內建 WebAPI
- 能夠使用頂層 await
- 熱更新
Elysia
Elysia 是一個基於 Bun 執行時的 Web 框架。
官網地址:https://elysiajs.com/
Performance
// node-server.js
import http from "http";
const hostname = "localhost";
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello World By Node.js");
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/ by Node.js`);
});
// bun-server.js
// 在 Bun 這個執行時裡面,內建了一個全域性的物件叫做 Bun
// 這個物件裡面有一些全域性的方法,比如說 Bun.serve
// 該方法就是建立一個伺服器
const server = Bun.serve({
port: 3001,
fetch() {
return new Response("Hello World!");
},
});
console.log(`Server is running at http://localhost:${server.port} by Bun`);
// test_node.js
import fetch from "node-fetch";
let count = 1000; // 要傳送的請求數量,初始化為 1000
const start = Date.now(); // 開始時間
let err_count = 0; // 錯誤數量
async function runTest() {
while (count > 0) {
try {
const res = await fetch("http://localhost:3000");
await res.text();
count--;
} catch (err) {
err_count++;
}
}
const end = Date.now(); // 結束時間
console.log(`花費時間為:${end - start}ms`);
console.log(`錯誤數量為:${err_count}`);
}
runTest();
// test_bun.js
import fetch from "node-fetch";
let count = 1000; // 要傳送的請求數量,初始化為 1000
const start = Date.now(); // 開始時間
let err_count = 0; // 錯誤數量
async function runTest() {
while (count > 0) {
try {
const res = await fetch("http://localhost:3001");
await res.text();
count--;
} catch (err) {
err_count++;
}
}
const end = Date.now(); // 結束時間
console.log(`花費時間為:${end - start}ms`);
console.log(`錯誤數量為:${err_count}`);
}
runTest();