Bun

工作区

Bun 支持 workspacespackage.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 注册表中下载它。
  • 可以对依赖项进行去重。如果 ab 共享一个公共依赖项,则它将被提升到根 node_modules 目录。这减少了冗余磁盘使用量,并最大程度地减少了同时安装多个版本包时出现的“依赖项混乱”问题。
  • 在多个包中运行脚本。你可以使用 --filter 标志 在工作区中的多个包中轻松运行 package.json 脚本。

⚡️ 速度 — 安装速度快,即使对于大型单一仓库也是如此。Bun 在 Linux 上大约 500ms 内安装 Remix 单一仓库。

  • npm install 快 28 倍
  • yarn install(v1)快 12 倍
  • pnpm install 快 8 倍