持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
在大家日常开发过程中,势必会使用到npm进行项目依赖的安装。在依赖的安装过程中,就不可避免的会碰到这样那样的问题,而当安装依赖出现问题的时候,有些经验不足的小伙伴的做法就是删除node_modules,然后重新安装依赖。对于一些经验更丰富的小伙伴来说,会知道同时删除对应的package-lock.json文件。
由于对于npm的安装机制没有深入的了解,所以碰到问题的时候只能进行粗暴的解决,如果重新安装依赖依然解决不了问题,可能就会进行求助度娘。一番操作之后,运气好的话,可能会解决掉问题;运气差一点的话,就会导致问题愈发的严重,而不知道该如何处理,白白的浪费时间。
接下来我们就来一起聊一下npm的安装机制,希望能给大家提供一些帮助。
npm 安装机制
小知识点
一个项目中,依赖A和依赖B都引入了依赖C,那么依赖C会多次安装或者重复打包吗?
相信对项目依赖有了一定了解的小伙伴一定会对这个问题产生疑问与思考。那真实情况是什么样的呢?
-
情况一:如果依赖A和依赖B对于依赖C的版本要求可以安装一个一致的版本的话,那么依赖C只会被安装一次。例如:
如果依赖A中依赖C的版本为 ^1.2.1,而依赖B中依赖C的版本为 ^1.3.2,那么最终项目中只会安装依赖C的1.x.x的最新版本;
-
情况二:如果依赖A和依赖B对于依赖C的版本要求无法一致的话,那么最终就会安装两个依赖C。例如:
如果依赖A中依赖C的版本为 ^1.2.1,而依赖B中依赖C的版本为 0.6.4,那么最终项目中会安装依赖C的两个版本0.6.4和1.x.x。
碰到依赖安装问题时,删除node_modules和package-lock.json文件,重新进行依赖安装,这样操作是否存在风险?
答案是肯定的,那就是有风险。至于风险是否会产生,取决于安装的依赖是否有更新,以及更新的版本是否向下兼容。
若想要了解具体原因,那我们就一起看一下npm的安装机制。
npm install 之后会发生什么
第一步:npm install执行之后,首先会检查项目中是否存在package-lock.json文件;
第二步:如果package-lock.json文件不存在的话,则会按照package.json中的依赖要求进行依赖的安装;如果存在package-lock.json文件的话,会对package.json和package-lock.json中的依赖文件进行比对,如果版本一致的话,就会按照package-lock.json中的依赖版本进行安装;如果版本不一致的话,就会按照package.json中的版本进行安装,并更新package-lock.json文件;
第三步:检查本地是否缓存了依赖;
第四步:如果缓存了依赖的话,则直接将缓存的依赖复制到项目下的node_modules中;如果没有缓存的话,则通过网络请求的方式进行资源的下载,并将下载的依赖资源进行缓存。
个人理解
-
package-lock.json文件应该上传到项目中,保证大家基于相同的依赖进行开发,同时也有利于ci和本地构建的一致性。这样可以有效的避免我本地开发的时候明明是好用的,为什么发布部署的时候就构建失败了呢?
-
对于不同项目依赖重复安装的问题,这确实是npm本身设计的问题,当然yarn也存在这样的问题。不过前段时间开始崛起的pnpm有望解决这个问题。
好了,有关npm安装机制的问题我们就先聊到这里了,接下来我们会继续聊一下yarn的相关内容。如果小伙伴们感兴趣的话,欢迎小伙伴们在下方留言讨论。当然,如果小伙伴们觉得文章还不错的话,辛苦大家动一下发财的小手,点赞收藏一下。