我們正在招募 C/C++ 和 Zig 工程師,一同打造 JavaScript 的未來! 加入我們的團隊 →
我們最近發布了許多 Bun 的變更,這裡為您整理摘要,以防您錯過任何資訊
v0.6.0
- 推出bun build
,Bun 的全新 JavaScript 打包工具。v0.6.2
- 效能提升:JSON.parse
速度提升 20%,Proxy
和arguments
速度最高提升 2 倍。v0.6.3
- 實作node:vm
,並對node:http
和node:tls
進行了大量修復。v0.6.4
- 實作require.cache
、process.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 -fsSL https://bun.dev.org.tw/install | bash
npm install -g bun
brew tap oven-sh/bun
brew install bun
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 版本中
— Jarred Sumner (@jarredsumner) 2023年6月3日
Prisma 可以運作了,感謝 @cirospaciari pic.twitter.com/CVyEDzaHnp
在 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 中一個熱門的功能請求。
在下一個 Bun 版本中
— clo (@paperclover_dev) 2023年6月1日
Discord.js 可以運作了 pic.twitter.com/bjOWgxMuLV
為什麼 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();
在下一個 Bun 版本中
— Jarred Sumner (@jarredsumner) 2023年6月3日
Puppeteer 可以運作了,感謝 @cirospaciari pic.twitter.com/DNc1wlipGA
為什麼 Puppeteer 之前無法運作?
主要是 node:net
和 CommonJS <> ES Module 互操作性的問題。
更快的 node:crypto 雜湊
@paperclover 對 EventEmitter 和 node:crypto 進行了效能改進,這使得 Bun 在處理小型輸入時,雜湊速度提升約 2 倍。
我們原本計畫在 Bun v0.5.0 左右推出這些變更,但測試在 CI 上失敗。我們最終設法修復並推出了這些變更。感謝 @paperclover!
針對 CommonJS 檔案,提供更佳的錯誤訊息
在下一個 bun 版本中
— Jarred Sumner (@jarredsumner) 2023年6月2日
修復了載入 commonjs 檔案時,錯誤訊息的錯誤 pic.twitter.com/UERe2WqL0W
錯誤修復
已修復 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