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。要引用多包仓库中的另一个包,请在 package.json 中将 semver 范围或工作区协议(例如 workspace:*)用作版本。
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 里统一定义这些版本,然后在工作区中通过 catalog: 协议引用它们。更新 catalog 会同步更新所有引用它的软件包。请参阅 Catalogs
⚡️ 速度 — 即使是大型 monorepo,安装速度依然非常快。Bun 在 Linux 下安装 Remix monorepo 约需 500ms
  • npm install 快 28 倍
  • yarn install (v1) 快 12 倍
  • pnpm install 快 8 倍