20251108 Bun v1.3.2 更新:特殊场景下安装速度再次提升 x6 及安装策略兼容

Bun v1.3.2 更新

原文:bun.sh/blog/bun-v1... 翻译:DeepSeek 💖 我

Jarred SumnerLydia 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 稳定安装默认值

isolatedhoisted 链接器之间反复更改对我们的用户不利。总的来说,破坏性变更是在浪费每个人的时间。

为了使未来的 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)

bun.lock

js 复制代码
// 新项目:
"configVersion": 1,

// 没有版本的现有项目(运行 `bun install` 后):
"configVersion": 0,

更快的 bun install

依赖流行库(如 esbuildsharp)的项目安装速度更快。

在 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 镜像现在对 x64arm64(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.spawnSyncchild_process.spawnSync 现在在与进程其余部分隔离的事件循环上运行,防止 JavaScript 定时器和微任务触发并干扰主进程的 stdin/stdout。这使得 Bun 的 spawnSync 行为与 Node.js 保持一致,并使超时在包括 Windows 在内的所有平台上可靠。

这本来就应该这样实现。之前的实现存在几个错误和稳定性问题,包括在使用 execSyncvim 时,会"吃掉"按键的第一个字符,导致做任何事情都感觉非常慢。

在极少数情况下,项目可能会错误地依赖此行为。如果您受到此更改的负面影响,请告知我们。

Bug fixes

省略。


!TIP\] 以下总结来自译者

Bun v1.3.2 更新总结

核心改进:

  1. 安装策略调整

    • 恢复提升安装为默认 :为避免破坏现有项目,现有工作区默认改回 hoisted 安装。
    • 新项目仍默认隔离安装 :新项目或从 pnpm 迁移的项目继续默认使用更优的 isolated 安装。
    • 引入锁文件版本 :通过 configVersion 锁定项目安装配置,确保未来升级的稳定性。
  2. 性能提升

    • 安装速度更快 :优化了对 esbuildsharp 等流行库的安装逻辑,部分场景下安装速度提升显著。
    • 智能脚本处理 :改进了 postinstall 等脚本的运行策略。
  3. 开发者工具增强

    • CPU 性能分析 :新增 --cpu-prof 标志,可生成 Chrome DevTools 兼容的性能分析文件,方便定位性能瓶颈。
    • 测试钩子完善bun:test 新增 onTestFinished 钩子,用于在测试完全结束后执行清理或断言。
    • WebSocket 调试ServerWebSocket 新增 subscriptions 获取器,方便查看和管理连接订阅的主题。
  4. 功能优化与修复

    • Git 依赖解析:更好地支持了 npm 风格的 Git URL 和 GitHub 简写。
    • 新命令别名bun list 作为 bun pm ls 的别名,用于快速查看依赖树。
    • 同步子进程spawnSync 改为在独立事件循环运行,解决了与主进程 IO 的干扰问题,行为与 Node.js 保持一致。
    • 基础镜像更新:官方 Docker 镜像升级至 Alpine 3.22。
相关推荐
孟陬5 天前
Bun Test 不支持时间快进?我用这招让单元测试提速 8 倍!
node.js·测试·bun
JohnYan14 天前
Bun技术评估 - 26 Abort
javascript·后端·bun
代码搬运媛15 天前
【工具上新】快速了解一站式开发工具 bun
开发语言·bun
JohnYan17 天前
Bun技术评估 - 20 YAML
后端·代码规范·bun
孟陬1 个月前
Bun 1.2.23发布:119个问题修复,性能飙升!
node.js·deno·bun
葡萄城技术团队1 个月前
Bun v1.3 重磅发布:一站式全栈 JS 运行时,前端开发、数据库、Redis 全内置
bun
JohnYan1 个月前
Bun技术评估 - 24 Secrets
javascript·后端·bun
孟陬1 个月前
一个专业的前端如何在国内安装 `bun`
npm·github·bun
孟陬1 个月前
一个专业的前端如何在国内安装 `pnpm`
npm·node.js·bun