小结:
1)
npm install --force
【前端开发技巧】npm install xxxx --legacy-peer-deps到底做了些什么? - 掘金 https://juejin.cn/post/6971268824288985118
下面,我就结合我现有的理解实践进行分析解答:
在理解 --legacy-peer-deps 做了什么前,我们先来了解一下peerDependency
正常开发中,我们经常接触到的是package.json中的dependencies 和devDependencies, 本文不对上面两个进行细节分析,让我们来看看peerDependencies是什么?
Dependencies: Libraries or modules that an NPM module needs in order to work in production.
peerDependencies: A peer dependency is a specific version or set of versions of a third-party software library that a module is designed to work with. They're similar in concept to the relationship between a browser extension and a browser.
在NPM v7中,默认安装peerDependencies,在我们日常使用的插件例如babel-plugin-dynamic-import-node、babel-plugin-transform-vue-jsx、lottie-web,它们都依赖于webpack进行开发的。
peerDependencies在我们的日常开发当中到底承担一个怎样的角色呢?
举个例子 【借鉴】
假设现在有一个helloWorld工程,已经在其package.json的dependencies中声明了 packageA,有两个插件plugin1和plugin2他们也依赖 packageA,如果在插件中使用dependencies而不是peerDependencies来声明 packageA,那么npm install安装完plugin1和plugin2之后的依赖图是这样的:
.
├── helloWorld
│ └── node_modules
│ ├── packageA
│ ├── plugin1
│ │ └── nodule_modules
│ │ └── packageA
│ └── plugin2
│ │ └── nodule_modules
│ │ └── packageA
复制代码
从上面的依赖图可以看出,helloWorld 本身已经安装了一次packageA,但是因为因为在 plugin1 和 plugin2 中的 dependencies 也声明了 packageA,所以最后 packageA 会被安装三次,有两次安装是冗余的。
而 peerDependency 就可以避免类似的核心依赖库被重复下载的问题。 如果在 plugin1 和 plugin2 的package.json中使用peerDependency来声明核心依赖库,例如:
plugin1/package.json
{
"peerDependencies": {
"packageA": "1.0.1"
}
}
复制代码
plugin2/package.json
{
"peerDependencies": {
"packageA": "1.0.1"
}
}
复制代码
在主系统中声明一下 packageA:
helloWorld/package.json
{
"dependencies": {
"packageA": "1.0.1"
}
}
复制代码
此时在主系统中执行npm install生成的依赖图就是这样的:
.
├── helloWorld
│ └── node_modules
│ ├── packageA
│ ├── plugin1
│ └── plugin2
复制代码
可以看到这时候生成的依赖图是扁平的,packageA 也只会被安装一次。
因此我们总结下在插件使用dependencies声明依赖库的特点:
- 如果用户显式依赖了核心库,则可以忽略各插件的peerDependencies声明;
- 如果用户没有显式依赖核心库,则按照插件peerDependencies中声明的版本将库安装到项目根目录中;
- 当用户依赖的版本、各插件依赖的版本之间不相互兼容,会报错让用户自行修复。
--legacy-peer-deps 的作用
在理解peerDependencies的功能后,让我们来看看 --legacy-peer-deps 的作用;
上面讲过,在NPM v7中,现在默认安装peerDependencies。
在很多情况下,这会导致版本冲突,从而中断安装过程。
--legacy-peer-deps标志是在v7中引入的,目的是绕过peerDependency自动安装;它告诉 NPM 忽略项目中引入的各个modules之间的相同modules但不同版本的问题并继续安装,保证各个引入的依赖之间对自身所使用的不同版本modules共存。