dependencies与devDependencies区别,以及peerDependencies的作用,npm2和npm3区别

作者:报道出了偏差
链接:https://www.zhihu.com/question/310545060/answer/584122572
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

问题一:为何一个依赖(比如jquery)不管是放到dependencies还是devDependencies下,在打包的时候(NODE_ENV两种情况下都试过)都会把jquery打进去(这跟上面的大多数人解释的貌似不符呀,按照上面的理解如果是放到devDependencies里面并且在production环境下,jquery不应该被打进去的呀???)

答:webpack 构建项目是根据入口文件的引用树来构建的,跟你放在哪个 dependency 里面没有关系,就算你没有放在 dependency 里面,只要你文件中引用了这个库并且 webpack 能在 node_modules 文件夹中找到这个库,就会打包进去。

问题二:当我把这个npm包当做lib包发布到npm库中后,再去require/import使用这个库的时候,不管是npm install mylib --save-dev 还是npm install mylib --save 还是直接npm insatll mylib 最终下载到node_modules下面的依赖都一模一样(都只有mylib包和mylib包自身package.dependencies中唯一指定的jquery包,一共2个包被下载下来)

答:npm install mylib --save-dev 还是 npm install mylib --save 还是直接 npm insatll mylib,这三条指令都会把依赖下载到 node_modules 文件夹。不同的是 --save-dev 还会修改 devDependencies 对象,把 mylib 添加进去;同理,–save 或者不加参数则是把 mylib 添加到 dependencies 对象中。

总结

dependencies和 devDependencies 相同的地方就是在你或者别人 clone 这个库进行开发调试的时候,可以通过 npm install 一键安装这两个目录下所有的依赖,而不用去一行行找你到底在文件中引用了那些依赖。

不同的地方在于

1.当某个项目依赖了你的 mylib,那么在安装的时候会链式地安装 mylib 这个项目中 dependencies 配置声明的依赖,因为根据约定,npm 认为这是项目运行时需要的依赖。而 devDependencies 则是开发时需要的依赖。
2. 如果你输入 npm install --production 指令,就只会安装 dependencies 目录下的依赖,在一些服务端自动构建的过程中或者在一些特殊的需求下,可能会用到这个指令。

peerDependencies

在npm2和npm3中区别:

在npm2中,如果我们项目依赖A包,A包又依赖B包,那在npm install时,会将B包嵌套安装在A包的nodemodule中(因为npm2安装包均为嵌套安装)。而peerDependencies所指定的依赖会随着npm install A一起被强制安装,并且会把包安装到我们项目的nodemodule中,跟A包同级

但是在npm3中,peerDependencies的表现与npm2不同,npm3中不会默认安装B包,而是会去检查B包是否被安装,如果B包尚未安装,则会提示用户A包依赖B包,但B包尚未安装。

npm2和npm3的区别

npm2中包的安装时层层嵌套的,A依赖B,B依赖C,则层层嵌套。

npm3中会将所有包都尽量抽到最顶层来(所以会出现你只安装了一个包,但是你看到nodemodule中很多文件夹的情况)。如果多个包依赖的版本冲突,这时候,提升1个包,剩下的包仍然按照嵌套的规则安装。

pnpm

而最近火起来的pnpm,优化了npm3和yarn都在顶层平铺大多包,但仍有部分需要嵌套安装的问题和幽灵依赖的问题(A包依赖B包,然后你在代码里可以直接使用A和B,但如果某天A包更新后不依赖B了,你直接使用B的代码便会出问题)。这里仅作简单介绍。

pnpm 是凭什么对 npm 和 yarn 降维打击的

猜你喜欢

转载自blog.csdn.net/m0_37793545/article/details/114023717