当我们执行npm install时,如何找到对应的依赖包的?

1,453 阅读3分钟

node install 是我们在项目开发中很常用的命令,我们都知道它可以安装依赖包。但是它到底是怎样执行的一直没有仔细了解过,遇到安装问题时总是一知半解。

于是打算深入了解下,主要流程是根据设定的npm源和package-lock.json(没有就查找package.json)来安装相关依赖,具体细节如下:

查找npm源:

优先级为项目级的 .npmrc 文件 > 用户级的 .npmrc 文件> 全局级的 .npmrc 文件 > npm 内置的 .npmrc 文件

若有多个npm源可以安装nrm管理:npm install -g nrm

设置npm源:npm config set registry https://registry.npm.taobao.org

查看npm源: nrm ls

切换npm源: nrm use xx

查找package-lock.json文件

  • 没有package-lock.json文件 根据 package.json 构建依赖树,从 npm 远程仓库获取包信息,构建过程:

构建依赖树时,不管其是直接依赖还是子依赖的依赖,优先将其放置在 node_modules 根目录。

当遇到相同模块时,判断已放置在依赖树的模块版本是否符合新模块的版本范围,如果符合则跳过,不符合则在当前模块的 node_modules 下放置该模块。

注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包,在缓存中依次查找依赖树中的每个包

不存在缓存:

从 npm 远程仓库下载包,校验包的完整性

校验不通过: 重新下载

校验通过:将下载的包复制到 npm 缓存目录,将下载的包按照依赖结构解压到 node_modules 存在缓存:将缓存按照依赖结构解压到 node_modules,将包解压到 node_modules,生成 lock 文件

  • 有package-lock.json文件 检查 package.json 中的依赖版本是否和 package-lock.json 中的依赖有冲突。

如果没有冲突,直接跳过获取包信息、构建依赖树过程,开始在缓存中查找包信息,后续过程相同

注:开发系统应用时,建议把 package-lock.json 文件提交到代码版本仓库,从而保证所有团队开发者以及 CI 环节可以在执行 npm install 时安装的依赖版本都是一致的。

devDependencies与dependencies有什么区别

对于项目:npm install 时两者的依赖包都会安装到node_modules中,即没有本质区别,只是为了规范将其区分。

对于npm包发布者:npm install时使用者只会下载dependencies的依赖,若放devDependencies中会导致找不到xx而报错,若都放dependencies会增加本地项目的体积

举例:

  1. 生产环境的包放进开发依赖

具体就例如:将 Vue 放进 devDependencies,这样做的后果是什么?分两种情况:

  • 下载项目源码,然后运行 npm install。这种情况无论 Vue 在哪个字段里都会被正确下载到 node_modules 里。

  • 作为 npm 包发布,然后 npm install xxx 的形式下载。这种情况只会下载 dependencies 的依赖,其余依赖将会无视处理,这样别人下载你的 npm 包运行时,就会找不到 xxx 而出错。

  1. 开发环境的包放进生产依赖

具体就例如:将 xx包 放进 dependencies,这样做的后果是什么?分两种情况:

  • 下载项目源码,然后运行 npm install。这种情况无论 xx包在哪个字段里都会被正确下载到 node_modules 里。
  • 作为 npm 包发布,然后 npm install xxx 的形式下载。这种情况只会下载 dependencies 的依赖,其余依赖将会无视处理,这样别人下载你的 npm 包运行时,就会包含有xx包代码,从而增加本地项目的体积。

注意点

  • node版本:有时候不同项目node版本不同,安装时node版本要与项目的版本保持统一

  • package.json: 为了其他人能够正常运行项目或者安装包版本统一,一定要将安装包的版本放到package.json中。

以上就是我对npm instal的一些浅薄理解,足以应对平时的问题。