package.json中workspaces的作用

2,140 阅读1分钟

展示示例,就着示例开始说事儿

// 目录结构如下
root-project
|- packages
|    |- packageA
|    |    - package.json
|    |- packageB
|    |    - package.json
|- package.json

// rootProject package.json
{
    "name": "root-project",
    "private": "true", // 是必要的,我没深究,需自行百度
    "workspaces": [ // 也支持正则,例如packages/*,指packages文件夹内所有包(并不只是下一级哦)
        "packages/packageA",
        "packages/packageB"
    ],
    "dependencies": {
        "lodash": "1.0.0"
    }
}

// packageA package.json
{
    "name": "a-project",
    "dependencies": {
        "lodash": "1.0.0",
        "antd": "1.2.3"
    }
}

// packageB package.json
{
    "name": "b-project",
    "dependencies": {
        "kk": "1.0.0",
        "antd": "1.2.3"
    }
}

// rootProject 打包的最终的产物
node_modules
  |- lodash@1.0.0
  |- kk@1.0.0
  |- antd@1.2.3
  |- a-project // 仅仅是一个虚拟的link而已,并不是正在的依赖包。指向 packages/packageA
  |- b-project // 指向 packages/packageB

package.json中workspaces的作用和表现

  • 当 package.json 文件中定义 workspaces 时,当前所在目录会被当作 project root。默认情况下 project root 不安装依赖包,在根目录下执行yarn add packageName会报错,如需在根目录安装则需用 yarn add packageName -W
  • 将 workspaces 数组中的子包建立一个虚拟的link包,在root project中可以当作正常安装的依赖包直接import子包 import * as pA from packageA | import pA from packageA,怎么 import 取决于你是怎么export的(这是es6的知识)
  • 将 workspaces 数组中的子包的依赖安装,提升到 root project 的依赖同层级