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