configVersion = 1)的默认安装策略。现有项目继续使用提升安装,除非显式配置。
什么是隔离安装?
隔离安装创建了非提升的依赖结构,包只能访问它们显式声明的依赖。这有别于 npm 和 Yarn 传统的“提升”安装策略,即依赖项被扁平化到共享的node_modules 目录中。
主要优点
- 防止幻影依赖 — 包不能意外导入未声明的依赖
- 确定性解析 — 无论安装了什么,依赖树相同
- 更适合多包仓库 — 工作区隔离防止包之间的交叉污染
- 可复现构建 — 在不同环境下解析行为更可预测
使用隔离安装
命令行
使用--linker 标志指定安装策略:
terminal
配置文件
在你的bunfig.toml 或全局 $HOME/.bunfig.toml 中设置默认 linker 策略:
bunfig.toml
默认行为
默认 linker 策略取决于项目锁文件的configVersion:
configVersion | 是否使用工作区? | 默认 Linker |
|---|---|---|
1 | ✅ | isolated |
1 | ❌ | hoisted |
0 | ✅ | hoisted |
0 | ❌ | hoisted |
configVersion = 1。工作区中,v1 默认使用隔离 linker;否则使用提升链接。
已有 Bun 项目(v1.3.2 之前创建):如果现有锁文件未标明版本,运行 bun install 时 Bun 会将 configVersion 设为 0,保持之前的提升 linker 默认。
从其他包管理器迁移:
- 来自 pnpm:
configVersion = 1(工作区中使用隔离安装) - 来自 npm 或 yarn:
configVersion = 0(使用提升安装)
--linker 标志或在配置文件中设置来覆盖默认行为。
隔离安装如何工作
目录结构
隔离安装不提升依赖,而是创建两层结构:tree layout of node_modules
解析算法
- 中央仓库 — 所有包安装在
node_modules/.bun/package@version/目录中 - 符号链接 — 顶层
node_modules包含指向中央仓库的符号链接 - Peer 解析 — 复杂的 peer 依赖使用特殊目录名
- 去重 — 具有相同包 ID 和 peer 依赖集的包被共享
工作区处理
在多包仓库中,工作区依赖有特殊处理:- 工作区包 — 直接符号链接到它们的源目录,而非存储区
- 工作区依赖 — 可以访问 monorepo 中的其他工作区包
- 外部依赖 — 安装在隔离存储中,保持正确隔离
与提升安装的比较
| 方面 | 提升(npm/Yarn) | 隔离(类似 pnpm) |
|---|---|---|
| 依赖访问 | 包可访问任何提升的依赖 | 包只能看到声明的依赖 |
| 幻影依赖 | ❌ 可能发生 | ✅ 防止 |
| 磁盘使用 | ✅ 较低(共享安装) | ✅ 类似(使用符号链接) |
| 确定性 | ❌ 较低 | ✅ 更高 |
| Node.js 兼容性 | ✅ 标准行为 | ✅ 通过符号链接兼容 |
| 适用场景 | 单项目,旧代码 | 多包仓库,严格依赖管理 |
高级功能
Peer 依赖处理
隔离安装通过复杂解析处理 peer 依赖:tree layout of node_modules
后端策略
Bun 使用不同文件操作策略提升性能:- Clonefile(macOS)— 复制时写入的文件系统克隆,效率最高
- Hardlink(Linux/Windows)— 硬链接节省磁盘空间
- Copyfile(回退方案)— 无其他方式时的完整文件复制
调试隔离安装
开启详细日志了解安装过程:terminal
- 存储条目创建
- 符号链接操作
- Peer 依赖解析
- 去重决策
故障排除
兼容性问题
一些包可能不兼容隔离安装,原因包括:- 硬编码路径 — 假设
node_modules结构扁平 - 动态导入 — 运行时导入不遵循 Node.js 解析
- 构建工具 — 直接扫描
node_modules
-
对特定项目切换回提升模式:
terminal
- 报告兼容性问题,帮助改进隔离安装支持
性能考虑
- 安装时间 — 可能略慢,因符号链接操作
- 磁盘使用 — 与提升类似(使用符号链接,不复制文件)
- 内存使用 — 因复杂 peer 解析,安装时更高
迁移指南
从 npm/Yarn 迁移
terminal
从 pnpm 迁移
隔离安装概念上类似 pnpm,迁移应很简单:terminal
node_modules 中使用符号链接,而 pnpm 使用全局存储与符号链接。
何时使用隔离安装
适合使用隔离安装的情况:- 在多包仓库中工作
- 需要严格依赖管理
- 需要防止幻影依赖
- 构建需依赖确定性的库
- 使用假设扁平
node_modules的旧代码 - 需要兼容现有构建工具
- 在符号链接支持不佳环境中工作
- 喜欢传统 npm 简单行为
相关文档
- 包管理器 > 工作区 — 多包仓库工作区管理
- 包管理器 > 锁文件 — 理解 Bun 的锁文件格式
- CLI > install — 完整的
bun install命令参考