一、npm2
采用递归模式,根据dependencies 和devdependencies 属性中指定的包来确定第一层依赖。再根据第一层的子依赖,递归安装各个包到子依赖的 node_modules 中,直到子依赖不再依赖其他模块。类似:
二、npm3
node_modules 目录改成了更为扁平状的层级结构,尽量把依赖和子依赖都在一个目录下共享,如若出现子依赖的版本号不同的情况,采用npm2d的模式,。如:
三、package-lock.json
npm5.0后会自动生成package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖子模块.npm install时从package.json中读取模块名称,从package-lock.json中读取对应的版本号,本地的模块版本更新会同步更新package-lock.json中的版本号
附:当package.json与package-lock.json都不存在,执行"npm install"时,node会重新生成package-lock.json文件,然后把node_modules中的模块信息全部记入package-lock.json文件,但不会生成package.json文件,此时,你可以通过"npm init --yes"来初始化生成package.json文件。
四、dependencies和devDependencies
dependencies:无论在开发环境还是在生产环境都必须使用的依赖,通过 npm install 或者npm install XXX --save 下载的包都会默认安装在 dependencies 对象
devDependencies:指可以在开发环境使用的依赖,通过 npm install 包名--save-dev 下载的包都会在devDependencies 对象中;
两者 最大的区别是在打包运行时,执行 npm install 时默认会把所有依赖全部安装,但是如果使用 npm install --production 时就只会安装 dependencies 中的依赖,如果是 node 服务项目,就可以采用这样的方式用于服务运行时安装和打包,减少包大小