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 时更加便捷。

参考文档

相关文章
相关标签/搜索