Bun

工作區

Bun 支援在 package.json 中使用 workspaces。工作區讓開發複雜軟體變得容易,這些軟體是一個由多個獨立套件組成的 單一儲存庫

單一儲存庫通常有以下結構

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 依賴於 abun 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 倍