Workspaces 是一個用來在本地的root package 包下面管理多個包的npm 術語和功能。(其實yarn 很早就支持了,npm 在7.x 中開始支持)html
這個功能讓咱們在本地開發包,尤爲是多個互相依賴的包時更加駕輕就熟。它能夠避免咱們再手動的去執行npm link
命令,而是在npm install
的時候,會自動把workspaces 下面的合法包,自動建立符號連接到根目錄的node_modules
裏。node
可以被單獨做爲一個包建立符號連接的文件夾,咱們就稱爲一個workspace,因此是能夠有多個workspace 的,能夠在package.json
的 workspaces
字段中進行配置。git
workspaces
字段接收一個數組,數組裏面能夠填寫相對根目錄的文件夾名稱或者是glob 通配符。例如:github
{
"name": "my-workspaces-powered-project",
"workspaces": [
"workspace-a"
]
}
複製代碼
上面的配置代表,在根目錄下,有一個workspace-a
文件夾,它做爲一個npm 包,包含一個package.json
。shell
.
+-- package.json
`-- workspace-a
`-- package.json
複製代碼
預期的效果是,在根目錄下執行npm install
命令,文件夾workspace-a
會被符號連接到根目錄的node_modules
文件夾下。對於包的使用和查找,和正常安裝這個包並沒有差異。npm
這個例子若是執行npm install
後,獲得的目錄結構以下:json
.
+-- node_modules
| `-- workspace-a -> ../workspace-a
+-- package-lock.json
+-- package.json
`-- workspace-a
`-- package.json
複製代碼
根據 nodejs 規範定義的包查找規則 ,任何合法定義了package.json
文件的workplace 包均可以被正常使用,經過package.json
裏定義的name 字段來引用包.api
在上面的例子中,咱們能夠這樣來使用workspace-a
包:數組
// ./workspace-a/index.js
module.exports = 'a'
// ./lib/index.js
const moduleA = require('workspace-a')
console.log(moduleA) // -> a
複製代碼
執行:markdown
node lib/index.js
複製代碼
建立一個普通的包開發流程文件夾,在下面把utils
單獨視爲一個包,放在packages/utils
目錄下,整個packages 目錄做爲咱們的workspace。截圖以下:
啓動服務,能夠看到,正常輸出結果:
讓咱們來查看一下node_modules 目錄:
咱們能夠看到,使用workspace 開發多個相關的包十分方便,而且不須要額外的去配置tsconfig,eslint,rollup等工具。npm 原生支持了workspaces ,可讓咱們在管理mono-repos 時更加便捷。