[Bun] Bun notes

Zhentiw發表於2024-11-24

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();

Result

相關文章