package.json 中使用 workspaces。工作区使得将复杂软件作为包含多个独立包的 monorepo 进行开发变得简单。
一个 monorepo 通常具有如下结构:
File Tree
package.json 中,使用 "workspaces" 键来表示哪些子目录应被视为 monorepo 内的包/工作区。通常将所有工作区放置在名为 packages 的目录下。
package.json
支持 Glob 语法 — Bun 在
"workspaces" 中支持完整的 glob 语法,包括否定模式(例如 !**/excluded/**)。详细支持语法列表见 这里。package.json
package.json。当引用 monorepo 中的其他包时,可以在 package.json 的版本字段中使用语义化版本号(semver)或工作区协议(例如 workspace:*)。
packages/pkg-a/package.json
bun install 会为 monorepo 中的所有工作区安装依赖,如果可能会去重包。如果只想为指定工作区安装依赖,可以使用 --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 共享版本
当多个包需要相同依赖版本时,Catalogs 允许你在根目录的package.json 中一次性定义这些版本,并使用 catalog: 协议在工作区中引用。更新 Catalog 会自动更新所有引用它的包。详情请见 Catalogs。
⚡️ 速度 — 即使是大型 monorepo,安装速度依然非常快。Bun 在 Linux 下安装 Remix monorepo 约需
500ms。- 比
npm install快 28 倍 - 比
yarn install(v1) 快 12 倍 - 比
pnpm install快 8 倍