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