说在前面
我们在开发前端项目的时候经常会用到诸如 npm install
来初始化依赖,这个过程中究竟发生了哪些事情,每次都需要从网络端重新下载依赖吗?
安装依赖时,总会有一些莫名其妙的报错,这个时候我们只要删除package-lock.json
,然后删除node_modules重新下载依赖,这样就能顺利安装依赖了,到底是为什么呢?
让我们带着疑问一起往下走。
经常使用npm
的小伙伴应该知道,项目中用到的依赖,大部分都不是全局安装的,两个不同的项目,即使依赖的包完全一致,初始化都需要重新执行一遍 npm install
,下面我们来介绍下他的安装机制。
package-lock.json
细心地小伙伴会发现,项目中install
之后会出现一个package-lock.json
文件,以下是文件内容的截取。
"vue": {
"version": "2.5.21",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.5.21.tgz",
"integrity": "sha512-Aejvyyfhn0zjVeLvXd70h4hrE4zZDx1wfZqia6ekkobLmUZ+vNFQer53B4fu0EjWBSiqApxPejzkO1Znt3joxQ=="
},
这段代码与package.json
中vue-baidu-map: ^0.21.20
,相呼应。值得注意的是,他在lock文件中确定了当前vue
的版本。这个文件需要被上传到git
上吗?需要!这是锁定安装时的版本号,以保证其他人在安装依赖时大家的依赖能保持一致。
如果package-lock
依赖版本出现问题,我们需要升级,要怎么做呢? 需要通过npm install xxx@x.x.x
这样来更新依赖,package-lock.json
也能随之更新。
缓存
考虑到npm
不忍心让我们每次都重新下载依赖,他对一个依赖包的同一版本会进行本地化缓存。执行命令
npm config get cache
可以查看缓存目录的位置。
继续下钻可以看到以下文件目录:
当我们执行 npm cache clean --force
时,实际上是清理 _chcache
文件夹。顾名思义,文件夹 content-v2
中存放的是一些二进制文件,解压后就是我们的npm
包资源。index-v5
则是二进制文件的索引,方便查找。
每次执行install
操作时,根据package-lock.json
中存储的几个属性生成一个唯一的key,这个key可以找到index-v5
目录下的缓存记录,如果发现,就会到content-v2
中找到资源并把对应的二进制文件解压到对应项目的node_modules
下面,省去了网络下载资源的开销。
总结
当执行npm install
时,会先检查本地是否有lock文件:
1、如果没有会从package.json
中获取包的一些信息然后检查缓存,没有缓存则下载包资源,然后添加到缓存。有缓存则直接解压,最终生成package-lock.json
。
2、有package-lock.json
时会判断与package.json
版本是否一致,如果不一致,不同的npm
版本会有不同的处理方式,所以当前npm
版本需要特殊注意,一般我们现在安装的都是大于v5.4.2
版本的,他的特性是在安装时,如果package-lock.json
安装版本兼容package.json
则按照package-lock.json
安装,如果不兼容,按照package.json
安装并更新package-lock.json
。
以上。