前言
简单点来说,Node
包管理更新机制指的就是 npm
(node package manager
)更新机制。
今天也不讲什么是 npm
,以及 npm
的使用方法,来讲讲 npm
中的包更新管理机制。
Npm install && Npm update
Npm install
先从 npm install
说起。
npm install <packageName>
这个命令能够在当前项目中,给你加入你需要的程序包。
但是为什么能够给你在当前项目中引入程序包呢?以及是怎么给你添加进来的。
Npm install安装流程
安装之前,npm
先会检查,当前项目中的 node_module
中是否已经存在制定模块,如果存在,就算本地版本不是最新的,npm 也不会重新安装了。(强制安装可以添加 --force
参数)
注意: 这个地方就是为什么,我们常说在修改了
package.json
后如果发现没有更新,删除当前node_module
后在执行install
的原因所在,如果本地已经存在,会直接跳过安装。
Npm update
在修改完 package.json
配置文件后,可以采用 npm update
来更新需要更新的包。
npm update <packageName>
这个命令会先去远程仓库查询当前包的最新版本,然后查询本地的版本,如果本地不存在,或者远程有更新,那么就会重新安装这个包。
Registry
npm update
通过 npm
的查询服务(registry
服务),会去调起一个请求,去查询当前需要更新的包的,然后返回的对象中会包含很多信息(下载地址、版本号、包大小等等)
注意: 想要详细查看这块的内容,请见https://docs.npmjs.com/cli/v7/using-npm/registry
缓存
我们通过npm install 或者 npm update 下载来的内容并不是直接放入node_module中的,通过registry去下载的压缩包,都先会存放在本地的缓存目录。
这个缓存目录,在 Linux 或 Mac 默认是用户主
目录下的.npm
目录,在 Windows 默认是%AppData%/npm-cache
。通过配置命令,可以查看这个目录的具体位置。
你会看到里面存放着大量的模块,储存结构是{cache}/{name}/{version}
。
每个模块的每个版本,都有一个自己的子目录,里面是代码的压缩包package.tgz
文件,以及一个描述文件package/package.json
。
注意: 详细关于缓存的内容,请见https://docs.npmjs.com/cli/v7/commands/npm-cache
对于一些不是很关键的操作(比如npm search
或npm view
),npm会先查看.cache.json
里面的模块最近更新时间,跟当前时间的差距,是不是在可接受的范围之内。如果是的,就不再向远程仓库发出请求,而是直接返回.cache.json
的数据。
流程总结
我们现在了解了上面的信息后,我们再来看看更新机制。
基本上模块安装的流程为如下几个方式:
-
发出
npm install
命令 -
检查当前项目中的
node_module
中是否包需要的包 -
npm
向registry
查询模块压缩包的网址 -
下载压缩包,存放在
~/.npm
目录 -
解压压缩包到当前项目的
node_modules
目录