Bun
    Bun

Bun v0.6.14


Ashcon Partovi · 2023 年 7 月 12 日

我們正在招聘 C/C++ 和 Zig 工程師,以構建 JavaScript 的未來! 加入我們的團隊 →

提醒您:Bun 是一個速度極快的 JavaScript 執行環境、打包器、轉譯器和套件管理器 — 功能All-in-One。

我們最近發布了許多 Bun 的變更,以下是回顧,以防您錯過了

  • v0.6.0 - 介紹 bun build,Bun 的全新 JavaScript 打包器。
  • v0.6.2 - 效能提升:JSON.parse 速度提升 20%,Proxyarguments 速度提升高達 2 倍。
  • v0.6.3 - 實作 node:vm,並修復了許多 node:httpnode:tls 的問題。
  • v0.6.4 - 實作 require.cacheprocess.env.TZ,以及 bun test 速度提升 80%。
  • v0.6.5 - 原生支援 CommonJS 模組(先前,Bun 執行 CJS 到 ESM 的轉譯),
  • v0.6.6 - bun test 改善,包括 Github Actions 支援、test.only()test.if()describe.skip(),以及 15 個以上的 expect() 匹配器;以及使用 fetch() 進行串流檔案上傳。
  • v0.6.7 - Node.js 相容性改進,以解除對 Discord.js、Prisma 和 Puppeteer 的封鎖
  • v0.6.8 - 導入 Bun.passwordbun test 中的模擬 (mocking),以及 toMatchObject()
  • v0.6.9 - 減少記憶體用量並支援非 ASCII 檔名
  • v0.6.10 - fs.watch()bun install 錯誤修正、bun test 功能,以及改進的 CommonJS 支援
  • v0.6.11 - 解決了 v0.6.10 中的發布版本問題。
  • v0.6.12 - Error.stack 中的 Sourcemap 支援、Bun.file().exists(),以及 Node.js 錯誤修正。
  • v0.6.13 - 實作模擬 Date、更快的 base64 編碼,以及針對 WebSocketnode:tls 的修正。

安裝 Bun

curl
npm
brew
docker
curl
curl -fsSL https://bun.dev.org.tw/install | bash
npm
npm install -g bun
brew
brew tap oven-sh/bun
brew install bun
docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

升級 Bun

bun upgrade

更佳的 process 支援

Bun 改善了對 Node.js process 物件的支援。

記憶體用量

您現在可以使用 process.memoryUsage() 來取得 Bun 程序的記憶體用量。

console.log(process.memoryUsage());
// {
//  rss: 4935680,
//  heapTotal: 1826816,
//  heapUsed: 650472,
//  external: 49879,
//  arrayBuffers: 9386
// }

CPU 用量

您也可以使用 process.cpuUsage() 從 Bun 取得目前的 CPU 用量。

console.log(process.cpuUsage());
// {
//  user: 38579,
//  system: 6986
// }

訊號事件

您現在可以使用 process.on() 來監聽並在程序接收到訊號事件時執行程式碼。

process.on("SIGINT", () => {
  console.log("Interrupt from keyboard");
});

結束事件

如果您不知道要監聽哪個訊號,您也可以監聽通用的 exitbeforeExit 事件。

process.on("beforeExit", (code) => {
  console.log("Event loop is empty and no work is left to schedule.", code);
});

process.on("exit", (code) => {
  console.log("Exiting with code:", code);
});

process.kill

您現在可以使用 process.kill(pid, signal),它會依據 pid 終止程序。

process.kill(123, "SIGTERM");

getuid、geteuid、getgid、getegid、getgroups

已新增下列方法

  • process.getegid()
  • process.geteuid()
  • process.getgid()
  • process.getgroups()
  • process.getuid()

process.assert

process.assert()require("assert") 的已棄用替代方案。Bun 新增了這個已棄用的函式,以與現有的 npm 套件相容。

process.assert(false, "PleAsE don't Use THIs It IS dEpReCATED");

process.reallyExit

某些 npm 套件會使用 process.reallyExit() 在不觸發 "exit" 事件處理常式的情況下結束。這是一個未記載的函式,Bun 現在為了生態系統相容性原因而實作它。

process.reallyExit(); // probably just use process.exit() though

console.log 中的類別建構子

先前,當值列印到 console.log 時,類別會被錯誤地歸類為函式。現在已修正此問題,並顯示該值為類別。

console.log(class A {});
// Previous: [Function: A]
// Now: [class A]

已修正 TypeScript 裝飾器錯誤

先前,當裝飾器用於匿名預設匯出時,Bun 有一個錯誤導致裝飾器未被評估。此問題已修正

function decorator(target: unknown, propertyKey: unknown) {
  // ...
}

export default class {
  @decorator
  method() {
    // ...
  }
}

已修正不帶斜線的 URL 中 fetch 的問題

先前,當 fetch() 中使用的 URL 沒有斜線時,Bun 會擲回錯誤。此問題已修正

await fetch("http://example.com?a=b");
// Previous: <throw>
// Now: Response { ... }

已修正 Error.captureStackTrace 中的 2 個崩潰錯誤

我們為 Error.captureStackTrace 新增了一個小型壓力測試,這促使我們修正了兩個崩潰錯誤

  • 當堆疊框架的 sourceURL 為空且呼叫 Error.captureStackTrace() 時,有時可能會將錯誤初始化的記憶體傳遞到堆疊追蹤 sourcemapper。此問題已修正。
  • 建立 CallSite 物件陣列有時可能會導致崩潰,原因在於使用快速路徑建立陣列,這會禁止在陣列完全初始化之前進行額外的 GC 管理記憶體配置。由於 CallSite 物件各自都是 GC 管理的配置,因此當建立這些物件時發生 GC(例如在迴圈中重複呼叫時)可能會導致崩潰。此問題已修正。

已實作 throwIfNoEntry

已實作node:fsstatlstatthrowIfNoEntry 選項的支援。如果設定為 false 且檔案不存在,則會傳回 undefined 而不是擲回錯誤。

import { statSync } from "node:fs";

statSync("./does-not-exist.txt"); // <throws>
statSync("./does-not-exist.txt", { throwIfNoEntry: false }); // undefined

其他變更

  • 已實作 node:crypto 中的 getCurves()

  • 已新增對不明 HTTP 方法的支援。

  • 已修正導致 bun build 非決定性地重新命名符號的錯誤。

  • 已修正可能導致堆疊追蹤顯示錯誤預覽的差一錯誤。

  • 已修正在串流被銷毀後發出 readable 事件的錯誤。

  • 已修正未正確實作 digest("binary") 的錯誤。

  • 已修正 node:fs 中來自大型數字和 BigInt 的錯誤強制轉換。

  • 已修正不應發出 connection 事件時卻發出的問題。

  • 已修正 HTMLRewriterelement.attributes 使用錯誤編碼的錯誤。

  • 已修正來自 Buffer.isBuffer() 的 JIT 可能會失效的錯誤。

  • 已修正 React 支援的回歸問題,其中捆綁包大小大於先前的版本。

  • 已修正 ref()unref() 未傳回 Timer 物件的錯誤。

  • 已修正來自 randomUUID() 的中繼資料位元不正確的錯誤。

  • 已修正 node:string_decoder 中來自無效 utf-8 資料的崩潰。

  • 已修正由於 monkey-patch,express-session 中不存在 Set-Cookie錯誤。(感謝 @Hanaasagi 修正了最後三個錯誤!)

變更日誌

請參閱 GitHub 上的變更日誌