Bun

Bun v0.6.7


Jarred Sumner · 2023年6月2日

我們正在招募 C/C++ 和 Zig 工程師,一同打造 JavaScript 的未來! 加入我們的團隊 →

我們最近發布了許多 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() 串流檔案上傳。

現在我們發布了 Node.js 相容性的錯誤修復,使 Discord.js、Prisma 和 Puppeteer 能夠在 Bun 中執行。我們也修復了 bun build --compile 的回歸錯誤、原生 CommonJS 支援導致崩潰的回歸錯誤,以及數個打包工具的錯誤修復。

安裝 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

在 Bun 中使用 Prisma

Prisma 是一個熱門的 Node.js ORM,現在可以在 Bun 中運作了!

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

const user = await prisma.user.create({
  data: {
    name: "Alice",
    email: "alice@prisma.io",
  },
});

console.log(user);

這是 Bun 中一個熱門的功能請求。

為什麼 Prisma 之前無法運作?

之前有數個 Node-API 的錯誤阻止 Prisma 在 Bun 中運作。@cirospaciari 在 Bun v0.6.7 (此版本) 中修復了這些錯誤。

在 Bun v0.6.5 (兩個版本前) 也修復了一個轉譯器的錯誤。

數個 Node.js 相容性的錯誤修復促使解決了阻止 Prisma 運作的問題。

在 Bun 中使用 Discord.js

Discord.js 是最受歡迎的 Discord 機器人建構函式庫。現在可以在 Bun 中運作了,感謝 @paperclover

import { Client, IntentsBitField } from "discord.js";

const client = new Client({
  intents: [
    IntentsBitField.Flags.Guilds,
    IntentsBitField.Flags.GuildMessages,
    IntentsBitField.Flags.MessageContent,
  ],
});

client.on("ready", () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on("messageCreate", (msg) => {
  console.log(msg.content);
  if (msg.content === "ping") {
    msg.reply("Pong!");
  }
});

client.login(process.env.TOKEN);

這也是 Bun 中一個熱門的功能請求。

為什麼 Discord.js 之前無法運作?

主要是 Bun 中 node:http 和 undici 的 Node.js 相容性錯誤。也有一些 WebSocket 錯誤。@paperclover 在 Bun v0.6.7 (此版本) 中修復了這些錯誤。

我們沒有對 Bun 的程式碼進行任何 Discord.js 專屬的變更,僅修復了 Node.js 相容性錯誤,這些錯誤解決了阻止 Discord.js 運作的問題。

在 Bun 中使用 Puppeteer

Puppeteer 是一個熱門的函式庫,用於自動化 Chromium。現在可以在 Bun 中運作了,感謝 @cirospaciari

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://elysiajs.com");
await page.screenshot({ path: "example.png" });
await browser.close();

為什麼 Puppeteer 之前無法運作?

主要是 node:net 和 CommonJS <> ES Module 互操作性的問題。

更快的 node:crypto 雜湊

@paperclover 對 EventEmitter 和 node:crypto 進行了效能改進,這使得 Bun 在處理小型輸入時,雜湊速度提升約 2 倍。

image

我們原本計畫在 Bun v0.5.0 左右推出這些變更,但測試在 CI 上失敗。我們最終設法修復並推出了這些變更。感謝 @paperclover!

針對 CommonJS 檔案,提供更佳的錯誤訊息

錯誤修復

已修復 CommonJS 重寫造成的回歸錯誤

  • 由於不正確地管理作用域擴展的生命週期,一次載入許多 CommonJS 檔案時可能發生的崩潰
  • Bun 有時會將 import.meta.resolveSync 注入到 CommonJS 檔案中,這導致某些套件 (例如 @prisma/client) 損壞
  • Bun 未在 CommonJS 模組包裝器中正確插入 __dirname__filename

希望這類錯誤不會再有太多。

在 Bun 與 Node.js 中,CommonJS 仍存在兩個顯著差異

  • 模組評估順序。Bun 中的 CommonJS 檔案會在 ES 模組被解析時評估。我們將觀察這是否會導致問題。如果會,我們會將其與 Node.js 的行為對齊。
  • 提供更多具名匯出。Node.js 依賴靜態分析來判斷 CommonJS 檔案的具名匯出。Bun 使用執行階段檢查,應能揭露更多具名匯出。這是一項功能,因為這表示更多具名匯入將在 Bun 中運作。但是,這是一個差異,而差異可能會導致問題。我們會密切關注這一點。

打包工具與轉譯器錯誤修復

  • 某些模組錯誤地將 __esModule 新增到其匯出中,導致 Express 應用程式的打包作業損壞。感謝 @dylan-conway 的修復。
  • 當在 tsconfig.json 或 jsconfig.json 檔案中指定時,Bun 在轉譯 JSX 時錯誤地選擇了 jsxDEV 而非 jsx。感謝 @dylan-conway 的修復。
  • bun build --compile 在 0.6.5 版本中損壞,現在已恢復運作,我們的 CI 將在未來捕捉到此問題。感謝 @dylan-conway 的修復。
  • 在某些情況下,Bun 會錯誤地對反引號引號內含 $ 符號的 UTF-8 字串字面值進行雙重跳脫,這導致 typemorph 等套件損壞
  • 對於 JSON 檔案,預設匯入錯誤地傳回空物件。感謝 @dylan-conway 的修復。

更多功能

Bun 現在支援 NO_COLOR 環境變數,這會停用 CLI 中的彩色輸出。感謝 @electroid 的新增。

內部變更

Bun 的內建 ES 模組現在已使用 Bun 進行打包和最小化,感謝 @paperclover