Skip to main content
Bun 支持 package.json 中的 workspaces。使用工作空间,你可以在一个仓库中开发多个独立的包,即_单体仓库(monorepo)_。 单体仓库通常具有以下结构:
File Tree
package.json 中的 "workspaces" 键列出了要视为工作空间的子目录。按照惯例,它们位于名为 packages 的目录中。
package.json
Glob 支持 — Bun 在 "workspaces" 中支持完整的 glob 语法,包括否定模式如 !**/excluded/**。请参阅支持的 glob 模式
package.json
每个工作空间都有自己的 package.json。要引用单体仓库中的另一个包,请使用 semver 范围或工作空间协议(例如 workspace:*)作为 package.json 中的版本。
packages/pkg-a/package.json
bun install 会安装单体仓库中所有工作空间的依赖,并在可能的情况下进行去重。要仅为特定工作空间安装依赖,请使用 --filter 标志。
发布时,Bun 会将 workspace: 版本替换为包的 package.json 版本:
特定版本会优先于包的 package.json 版本:
工作空间有几个主要优势。
  • 代码可以拆分为逻辑部分。 如果一个包依赖于另一个包,将其作为依赖添加到 package.json 中。如果包 b 依赖于 abun install 会将本地的 packages/a 目录安装到 node_modules 中,而不是从 npm 注册表下载。
  • 依赖可以去重。 如果 ab 共享一个公共依赖,它会被_提升_到根 node_modules 目录。这节省了磁盘空间,并最大限度地减少了多个版本的包同时安装导致的”依赖地狱”。
  • 在多个包中运行脚本。 使用 --filter 标志同时在多个包中运行 package.json 脚本,或使用 --workspaces 在所有工作空间中运行脚本。

使用 Catalogs 共享版本

当许多包需要相同的依赖版本时,在根 package.json 的目录中统一定义这些版本,并使用 catalog: 协议从工作空间中引用它们。更新目录会更新引用它的所有包。请参阅 Catalogs
⚡️ 速度 — 即使对于大型单体仓库,安装也很快。Bun 在 Linux 上安装 Remix 单体仓库大约需要 500ms
  • npm install 快 28 倍
  • yarn install (v1) 快 12 倍
  • pnpm install 快 8 倍