npm依赖分析

转载请注明出处: https://jsjsjs.icu/

直接上图

npm2与npm3+ 安装依赖的区别

npm在安装依赖包时,会将依赖包下载到当前的node_modules目录中。每个包安装过后都会有自己的node_modules吗?这又涉及到不同版本的npm其对包依赖的目录组织结构有所不同

npm2

因为 npm 设计的初衷就是考虑到了包依赖的版本错综复杂的关系,同一个包因为被依赖的关系原因会出现多个版本,简单地填充结构保证了无论是安装还是删除都会有统一的行为和结构

npm3+

按照 package.json 里依赖的顺序依次解析,遇到新的包就把它放在第一级目录,后面如果遇到一级目录已经存在的包,会先判断版本,如果版本一样则忽略,否则会按照 npm2 的方式依次挂在依赖包目录下。

NPM3升级总结

npm3+采用扁平结构部分的解决了npm2的痛点。npm3+并没有完美解决npm2中的问题,在某些情况下甚至会退化到npm2的行为。

例如项目App里依赖模块A、C、D、E, 其中A、C、D依赖模块B v2.0, E依赖模块B v1.0,生成的npm3结构如下

解决代码冗余问题,在E模块依赖的模块B升级到V2.0前提下,我们可以通过 npm dedupe 把所有二级的依赖模块B v2.0重定向到一级模块B下

node_modules路径查找模式

const webapck = require('webpack'); //引入webpack模块

如果传递给require()的参数不是nodejs的核心模块,也不是以/ 、 ../或 ./开头,那么nodejs会尝试从当前模块所在目录开始,尝试在它的 node_modules 文件夹里加载相应模块,根据模块的package.json来加载对应的js文件;如果没有找到,那么就再向上一级目录移动,直到文件系统的根目录为止

例如,假设在/home/wonyun/projects/foo.js 文件里调用了 require('bar.js') ,那么 nodejs 查找其位置的顺序依次为:

/home/wonyun/projects/node_modules/bar.js
/home/wonyun/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js