npm的那些事

npm2和npm3安装机制的差异

npm install后,npm会依赖dependencies和devDependencies中指定的包来确定第一层依赖,执行完毕后,我们会看到 ./node_modules 这层目录中包含有我们 package.json 文件中所有的依赖包。

  • npm 2 会根据第一层依赖的子依赖,递归安装各个包到子依赖的 node_modules 中,直到子依赖不再依赖其他模块。

层级结构明显;在知道自己所需包的名字和版本号时,可以复制粘贴相应的文件到 node_modules 中,然后手动更改 package.json 中的配置;删除某个包时,可直接删除 package.json 中对应的某一行,然后删除 node_modules 中的文件。
当ABC三个包都依赖D时,执行npm install,D会被下载三次,造成大量冗余

  • npm3 为了解决这种问题,目录改成了扁平状的层级结构,尽量把依赖以及依赖的依赖平铺在 node_modules 文件夹下共享使用

会遍历所有节点,将模块都放在node_modules第一层,当重复时,丢弃,如果遇到依赖版本不兼容时,采用npm2处理方式,前面的放在 node_modules 目录中,后面的放在依赖树中。

但在执行 npm install 的时候,按照 package.json 里依赖的顺序依次解析,如果A,B,依赖 D(v 0.0.1),C 依赖 D(v 0.0.2),但c在在 A,B 的前边.


package.json

npm 无法固定依赖的版本
在 npm 5.0 版本后,npm install 后都会自动生成一个 package-lock.json 文件 。如果package.json 和 package-lock.json 中的版本兼容,会根据 package-lock.json 中的版本下载,如果不兼容,将会根据 package.json 的版本,更新 package-lock.json 中的版本。使 package-lock.json 中的版本兼容 package.json。

package-lock.json 文件的结构

version:版本,即包安装在 node_modules 中的版本。
resolved:安装来源。
integrity:对应子依赖的依赖,与子依赖的 package.json 中 dependencies 的依赖项相同
dependencies:结构和外层的 dependencies 结构相同

并不是所有的子依赖都有 dependencies 属性,只有子依赖的依赖和当前已安装在根目录的 node_modules 中的依赖冲突之后,才会有这个属性。

package-lock.json 可以提交到代码库,当想回溯到某一天的目录状态时,只需将package.json和package-lock.json这两个文件回退到某一天就好

npm 会比较 node_modules 已有的包,和 package-lock.json 进行比较,如果重复的话,就跳过安装 ,从而优化了安装的过程。

依赖的区别与使用场景

dependencies

无论在开发环境还是生产环境都需使用的依赖,通过 npm install XXX 下载的包都会默认安装在 dependencies 对象中,或者通过npm install XXX --save 下载

devDependencies

在开发环境使用的依赖,例如 eslint,debug 等,通过 npm install packageName --save-dev 下载

区别

在打包运行时,执行npm install 时默认会把所有依赖全部安装,但使用 npm install --production 时就只会安装 dependencies 中的依赖。
node项目可以采用这种服务运行时安装和打包,减少包大小

optionalDependencies

可以选择的依赖,当某些依赖下载失败或者没有找到时,项目依然可以正常运行或者 npm 继续运行的时,可以把依赖放在optionalDependencies中,但optionalDependencies 会覆盖 dependencies 中的同名依赖包

类似保护机制,如果包存在的话就走存在的逻辑,不存在的就走不存在的逻辑。

peerDependencies

指定当前的插件兼容的宿主必须要安装的包的版本,例如:我们创建了项目,在此项目中我们要使用 [email protected] 这个插件,此时我们的项目就必须先安装 React >= 16.9.0 和 React-dom >= 16.9.0 的版本

回滚

git log
git revert 81720a380331ea14bfcb7d3eec7aff4ccd716376
或
git reset --hard 81720a380331ea14bfcb7d3eec7aff4ccd716376
git push -f

你可能感兴趣的:(npm的那些事)