Bun 支持 workspaces
在 package.json
中。工作区便于将复杂软件作为由多个独立包组成的单一仓库进行开发。
单一仓库通常具有以下结构
tree
<root>
├── README.md
├── bun.lockb
├── package.json
├── tsconfig.json
└── packages
├── pkg-a
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
├── pkg-b
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
└── pkg-c
├── index.ts
├── package.json
└── tsconfig.json
在根 package.json
中,"workspaces"
键用于指示在单一仓库中哪些子目录应被视为包/工作区。通常将所有工作区放在名为 packages
的目录中。
{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}
Glob 支持 — Bun 支持 "workspaces"
中的简单 <directory>/*
glob。尚不支持完整的 glob 语法(例如 **
和 ?
)。
每个工作区都有自己的 package.json
在引用单一仓库中的其他包时,在 package.json
中使用 "workspace:*"
作为版本字段。
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "workspace:*"
}
}
版本支持 — Bun 支持 "dependencies"
中的简单 workspace:*
版本。尚不支持完整的版本语法(例如 workspace:^*
)。
工作区有一些主要优点。
- 代码可以分成逻辑部分。如果一个包依赖于另一个包,则可以简单地将其添加为
package.json
中的依赖项。如果包b
依赖于a
,则bun install
将把本地packages/a
目录安装到node_modules
中,而不是从 npm 注册表中下载它。 - 可以对依赖项进行去重。如果
a
和b
共享一个公共依赖项,则它将被提升到根node_modules
目录。这减少了冗余磁盘使用量,并最大程度地减少了同时安装多个版本包时出现的“依赖项混乱”问题。 - 在多个包中运行脚本。你可以使用
--filter
标志 在工作区中的多个包中轻松运行package.json
脚本。
⚡️ 速度 — 安装速度快,即使对于大型单一仓库也是如此。Bun 在 Linux 上大约 500ms
内安装 Remix 单一仓库。
- 比
npm install
快 28 倍 - 比
yarn install
(v1)快 12 倍 - 比
pnpm install
快 8 倍