Bun

工作區

Bun 支援 workspacespackage.json 中。 工作區讓開發複雜的軟體作為由幾個獨立套件組成的monorepo變得容易。

monorepo 通常具有以下結構

tree
<root>
├── README.md
├── bun.lock
├── 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" 鍵用於指示哪些子目錄應被視為 monorepo 中的套件/工作區。 傳統上,將所有工作區放在名為 packages 的目錄中。

{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/*"],
  "devDependencies": {
    "example-package-in-monorepo": "workspace:*"
  }
}

Glob 支援 — Bun 在 "workspaces" 中支援完整的 glob 語法(請參閱此處以獲取支援語法的完整列表),除了排除項(例如 !**/excluded/**),這些尚未實作。

每個工作區都有自己的 package.json。 當引用 monorepo 中的其他套件時,可以使用 semver 或工作區協定(例如 workspace:*)作為 package.json 中的版本欄位。

{
  "name": "pkg-a",
  "version": "1.0.0",
  "dependencies": {
    "pkg-b": "workspace:*"
  }
}

bun install 將安裝 monorepo 中所有工作區的依賴項,如果可能,將套件去重複。 如果您只想為特定的工作區安裝依賴項,則可以使用 --filter 標誌。

# Install dependencies for all workspaces starting with `pkg-` except for `pkg-c`
bun install --filter "pkg-*" --filter "!pkg-c"

# Paths can also be used. This is equivalent to the command above.
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # or --filter "!./packages/pkg-c"

發佈時,workspace: 版本將被套件的 package.json 版本取代,

"workspace:*" -> "1.0.1"
"workspace:^" -> "^1.0.1"
"workspace:~" -> "~1.0.1"

設定特定版本優先於套件的 package.json 版本,

"workspace:1.0.2" -> "1.0.2" // Even if current version is 1.0.1

工作區有幾個主要優點。

  • 程式碼可以拆分為邏輯部分。 如果一個套件依賴於另一個套件,您可以簡單地將其作為依賴項添加到 package.json 中。 如果套件 b 依賴於 a,則 bun install 將把您的本地 packages/a 目錄安裝到 node_modules 中,而不是從 npm 註冊表下載它。
  • 依賴項可以去重複。 如果 ab 共用一個通用依賴項,它將被提升到根 node_modules 目錄。 這減少了冗餘的磁碟使用量,並最大限度地減少了與同時安裝多個套件版本相關的「依賴地獄」問題。
  • 在多個套件中執行腳本。 您可以使用 --filter 標記,輕鬆地在工作區中的多個套件中執行 package.json 腳本。

⚡️ 速度 — 安裝速度很快,即使是大型的 monorepo 也是如此。在 Linux 上,Bun 安裝 Remix monorepo 大約只需 500ms

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