npm7.x 原生支持workspaces,讓monorepo更簡單

簡介

Workspaces 是一個用來在本地的root package 包下面管理多個包的npm 術語和功能。(其實yarn 很早就支持了,npm 在7.x 中開始支持)html

這個功能讓咱們在本地開發包,尤爲是多個互相依賴的包時更加駕輕就熟。它能夠避免咱們再手動的去執行npm link 命令,而是在npm install 的時候,會自動把workspaces 下面的合法包,自動建立符號連接到根目錄的node_modules 裏。node

可以被單獨做爲一個包建立符號連接的文件夾,咱們就稱爲一個workspace,因此是能夠有多個workspace 的,能夠在package.jsonworkspaces 字段中進行配置。git

配置 workspaces

workspaces 字段接收一個數組,數組裏面能夠填寫相對根目錄的文件夾名稱或者是glob 通配符。例如:github

{
  "name": "my-workspaces-powered-project",
  "workspaces": [
    "workspace-a"
  ]
}
複製代碼

上面的配置代表,在根目錄下,有一個workspace-a文件夾,它做爲一個npm 包,包含一個package.jsonshell

.
+-- 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
複製代碼

使用 workspaces

根據 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 時更加便捷。

參考文檔

相關文章
相關標籤/搜索