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会增加本地项目的体积
举例:
- 生产环境的包放进开发依赖
具体就例如:将 Vue 放进 devDependencies,这样做的后果是什么?分两种情况:
-
下载项目源码,然后运行 npm install。这种情况无论 Vue 在哪个字段里都会被正确下载到 node_modules 里。
-
作为 npm 包发布,然后 npm install xxx 的形式下载。这种情况只会下载 dependencies 的依赖,其余依赖将会无视处理,这样别人下载你的 npm 包运行时,就会找不到 xxx 而出错。
- 开发环境的包放进生产依赖
具体就例如:将 xx包 放进 dependencies,这样做的后果是什么?分两种情况:
- 下载项目源码,然后运行 npm install。这种情况无论 xx包在哪个字段里都会被正确下载到 node_modules 里。
- 作为 npm 包发布,然后 npm install xxx 的形式下载。这种情况只会下载 dependencies 的依赖,其余依赖将会无视处理,这样别人下载你的 npm 包运行时,就会包含有xx包代码,从而增加本地项目的体积。
注意点
-
node版本:有时候不同项目node版本不同,安装时node版本要与项目的版本保持统一
-
package.json: 为了其他人能够正常运行项目或者安装包版本统一,一定要将安装包的版本放到package.json中。
以上就是我对npm instal的一些浅薄理解,足以应对平时的问题。