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 标志。
workspace: 版本替换为包的 package.json 版本:
package.json 版本:
- 代码可以拆分为逻辑部分。 如果一个包依赖于另一个包,将其作为依赖添加到
package.json中。如果包b依赖于a,bun install会将本地的packages/a目录安装到node_modules中,而不是从 npm 注册表下载。 - 依赖可以去重。 如果
a和b共享一个公共依赖,它会被_提升_到根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 倍