package.json 中支持 workspaces。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共享一个共同依赖,它会被 提升(hoist) 到根目录的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 倍