Bun v1.3.2 更新
原文:bun.sh/blog/bun-v1... 翻译:DeepSeek 💖 我
Jarred Sumner、Lydia Hallie · 2025年11月8日
此版本修复了 287 个问题(处理了 324 个 👍)。
升级 Bun
sh
bun upgrade
默认恢复提升式安装
在 Bun 1.3.0 中,我们将工作区的默认安装方式改为了隔离安装。虽然这消除了幽灵依赖并使安装速度更快、更可预测,但也给一些依赖共享依赖项的现有单体仓库带来了一些问题。
在 Bun 1.3.2 中,隔离安装现在仅是新项目的默认设置,而现有工作区将继续使用提升式安装,除非显式配置。
要在现有工作区/单体仓库中继续使用隔离安装:
bunfig.toml
toml
[install]
# 显式设置链接器为隔离模式
linker = "isolated"
或使用 --linker=isolated 标志:
sh
bun install --linker=isolated
使用工作区的新项目(或没有锁文件的项目) 继续默认使用隔离安装。
configVersion |
使用工作区? | 默认链接器 |
|---|---|---|
1 |
✅ | isolated |
1 |
❌ | hoisted |
0 |
✅ | hoisted |
0 |
❌ | hoisted |
锁文件 configVersion 稳定安装默认值
在 isolated 和 hoisted 链接器之间反复更改对我们的用户不利。总的来说,破坏性变更是在浪费每个人的时间。
为了使未来的 Bun 升级更容易,bun install 现在会向 bun.lock / bun.lockb 写入一个 configVersion。这使我们将来能够更改默认配置,而不会影响现有项目。
工作原理如下:
-
新项目 :默认为
configVersion = 1(v1)。在工作区中,v1 默认使用隔离链接器;否则使用提升式链接。 -
现有 Bun 项目 :如果您现有的锁文件还没有版本,当您运行
bun install时,Bun 会设置configVersion = 0(v0),保留之前的提升式链接器默认值。 -
从其他包管理器迁移:
- 从 pnpm 迁移:
configVersion = 1(v1) - 从 npm 或 yarn 迁移:
configVersion = 0(v0)
- 从 pnpm 迁移:
bun.lock
js
// 新项目:
"configVersion": 1,
// 没有版本的现有项目(运行 `bun install` 后):
"configVersion": 0,
更快的 bun install
依赖流行库(如 esbuild 或 sharp)的项目安装速度更快。
在 Bun 的下一个版本中
bun install 在选择运行哪些及何时运行 postinstall 脚本方面变得更智能。
在一个包含 next.js 和 vite 的仓库中,bun install 速度提升了 6 倍。pic.twitter.com/tJfJUD0pF9
--- Jarred Sumner (@jarredsumner) 2025年11月1日
通过环境变量禁用 Bun 的内置默认值:
SH
BUN_FEATURE_FLAG_DISABLE_NATIVE_DEPENDENCY_LINKER=1 # 禁用原生二进制链接
BUN_FEATURE_FLAG_DISABLE_IGNORE_SCRIPTS=1 # 禁用脚本跳过
使用 --cpu-prof 进行 CPU 分析
Bun 现在支持使用 --cpu-prof 标志对任何脚本进行 CPU 分析。这会记录关于程序在每个函数中花费多少时间的详细信息,帮助您识别性能瓶颈并优化热点路径。
在 Bun 的下一个版本中
bun --cpu-prof 生成可以在 Chrome DevTools 中打开的 CPU 配置文件,由 JavaScriptCore 的采样分析器提供支持。pic.twitter.com/cEPVDfw40S
--- Jarred Sumner (@jarredsumner) 2025年10月30日
配置文件以 Chrome DevTools 兼容的 .cpuprofile 格式保存,可以直接在 Chrome DevTools(性能选项卡)或 VS Code 的 CPU 分析器中打开。采样以 1 毫秒间隔运行,以提供细粒度的洞察。
| 标志 | 描述 |
|---|---|
--cpu-prof |
启用分析 |
--cpu-prof-name <filename> |
设置输出文件名 |
--cpu-prof-dir <dir> |
设置输出目录 |
js
// script.js
function fib(n) {
return n < 2 ? n : fib(n - 1) + fib(n - 2);
}
console.log(fib(35)); // 一些 CPU 密集型工作
您可以启用 CPU 分析运行此脚本:
sh
bun --cpu-prof script.js
bun --cpu-prof --cpu-prof-name my-profile.cpuprofile script.js
bun --cpu-prof --cpu-prof-dir ./profiles script.js
在 Chrome DevTools → 性能 → 加载配置文件中打开生成的 .cpuprofile 文件。
bun:test onTestFinished 钩子
bun:test 现在包含一个新的 onTestFinished(fn) 钩子,它在测试的最后、所有 afterEach 钩子完成后运行。将其用于清理或必须在所有其他每个测试钩子之后发生的断言。
- 仅在测试内部运行(不在
describe或预加载中) - 支持异步和 done 风格的回调
- 不支持并发测试;请改用
test.serial或移除test.concurrent
ts
import { test, afterEach, onTestFinished, expect } from "bun:test";
test("在 afterEach 之后运行", () => {
const calls = [];
afterEach(() => {
calls.push("afterEach");
});
onTestFinished(() => {
calls.push("onTestFinished");
// afterEach 已经运行
expect(calls).toEqual(["afterEach", "onTestFinished"]);
});
// 测试主体...
});
test.serial("在最后进行异步清理", async () => {
onTestFinished(async () => {
await new Promise((r) => setTimeout(r, 10));
// ...关闭数据库连接、停止服务器等
});
// 测试主体...
});
感谢 @pfg 的贡献!
ServerWebSocket 订阅获取器
ServerWebSocket 现在包含一个 subscriptions 获取器,它返回连接当前订阅的主题的去重列表。
这使得在发布/订阅系统中检查和管理每个连接的状态变得容易,例如,调试主题订阅或在客户端断开连接时清理资源。
当套接字关闭时,subscriptions 自动返回一个空数组。
ts
const server = Bun.serve({
fetch(req, server) {
if (server.upgrade(req)) return;
return new Response("不是 WebSocket");
},
websocket: {
open(ws) {
ws.subscribe("chat");
ws.subscribe("notifications");
console.log(ws.subscriptions); // ["chat", "notifications"]
ws.unsubscribe("chat");
console.log(ws.subscriptions); // ["notifications"]
},
close(ws) {
console.log(ws.subscriptions); // []
},
},
});
这使得使用 Bun 的 WebSocket 发布/订阅模型更加透明和易于调试。
官方 Docker 镜像中使用 Alpine 3.22
Bun 官方的 Alpine Linux Docker 镜像现在对 x64 和 arm64(musl) 构建都使用 Alpine 3.22。此更新带来了最新的安全补丁、改进的包兼容性和更小的基础占用空间。
改进的 Git 依赖项解析
bun install 现在能更好地支持 npm 风格的托管 Git URL 和 GitHub 简写形式。
使用自定义协议前缀指定的 GitHub 仓库现在能被正确识别,并通过快速的 HTTP tarball 路径下载。
package.json
json
{
"dependencies": {
// GitHub 简写(现在能正确解析并通过 HTTP tarball 下载)
"cool-lib": "github:owner/repo#v1.2.3",
// 不同协议能确定性解析
"tooling-ssh": "git+ssh://git@github.com/owner/repo.git#main",
"tooling-https": "git+https://github.com/owner/repo.git#main"
}
}
感谢 @markovejnovic 的贡献!
bun list 作为 bun pm ls 的别名
您现在可以使用更简短的顶级命令列出依赖树:bun list。这是 bun pm ls 的直接别名,并支持相同的标志(例如 --all)。
它支持所有相同的标志------包括用于查看完整传递依赖关系的 --all,使得依赖项检查更快、更容易。
sh
# 从当前锁文件列出依赖项(`bun pm ls` 的别名)
bun list
# 显示完整的传递依赖树
bun list --all
spawnSync 现在在独立的事件循环上运行
Bun.spawnSync 和 child_process.spawnSync 现在在与进程其余部分隔离的事件循环上运行,防止 JavaScript 定时器和微任务触发并干扰主进程的 stdin/stdout。这使得 Bun 的 spawnSync 行为与 Node.js 保持一致,并使超时在包括 Windows 在内的所有平台上可靠。
这本来就应该这样实现。之前的实现存在几个错误和稳定性问题,包括在使用 execSync 和 vim 时,会"吃掉"按键的第一个字符,导致做任何事情都感觉非常慢。
在极少数情况下,项目可能会错误地依赖此行为。如果您受到此更改的负面影响,请告知我们。
Bug fixes
省略。
!TIP\] 以下总结来自译者
Bun v1.3.2 更新总结
核心改进:
-
安装策略调整:
- 恢复提升安装为默认 :为避免破坏现有项目,现有工作区默认改回
hoisted安装。 - 新项目仍默认隔离安装 :新项目或从 pnpm 迁移的项目继续默认使用更优的
isolated安装。 - 引入锁文件版本 :通过
configVersion锁定项目安装配置,确保未来升级的稳定性。
- 恢复提升安装为默认 :为避免破坏现有项目,现有工作区默认改回
-
性能提升:
- 安装速度更快 :优化了对
esbuild、sharp等流行库的安装逻辑,部分场景下安装速度提升显著。 - 智能脚本处理 :改进了
postinstall等脚本的运行策略。
- 安装速度更快 :优化了对
-
开发者工具增强:
- CPU 性能分析 :新增
--cpu-prof标志,可生成 Chrome DevTools 兼容的性能分析文件,方便定位性能瓶颈。 - 测试钩子完善 :
bun:test新增onTestFinished钩子,用于在测试完全结束后执行清理或断言。 - WebSocket 调试 :
ServerWebSocket新增subscriptions获取器,方便查看和管理连接订阅的主题。
- CPU 性能分析 :新增
-
功能优化与修复:
- Git 依赖解析:更好地支持了 npm 风格的 Git URL 和 GitHub 简写。
- 新命令别名 :
bun list作为bun pm ls的别名,用于快速查看依赖树。 - 同步子进程 :
spawnSync改为在独立事件循环运行,解决了与主进程 IO 的干扰问题,行为与 Node.js 保持一致。 - 基础镜像更新:官方 Docker 镜像升级至 Alpine 3.22。