前言
-
本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
-
这是源码共读的第6期,链接:juejin.cn/post/708498… 。
先说结论
- 这是一个用于检查软件包是否为最新版本的库
- 这个库主要用在需要自动检查和提示软件包更新的场景,比如脚手架应用。常见与用npm下载库,在终端中提示npm存在最新版,并给出更新方法
- 通过检测库中的package.json文件中的信息,如name,version,distTag等信息判断当前库是否发生变化,具备检查更新、比较版本、通知输出信息、错误信息处理等功能;
- 如下图所示,我们常见的更新提示信息方式:
具体源码分析
- 检查更新:
update-notifier在check方法中通过node的spaw运行子进程每隔一段时间就从fetchInfo方法中使用latest-version库来查询 npm 注册表中指定包的最新版本,查看是否有更新。 - 存储版本信息:首次运行时,
update-notifier会在用户的主目录中创建一个文件(通常是~/.config/configstore/<package-name>.json),以存储当前安装的版本和最后检查更新的时间。 - 比较版本:在后续的运行中,
update-notifier会比较存储的版本和从 npm 注册表检索到的最新版本。 - 显示通知:如果发现新版本,
update-notifier会在notify中使用boxen或类似的库在终端中显示一个通知消息。 - 控制通知频率:为了防止每次运行应用时都显示通知,
update-notifier中notify函数会在用户确认更新或经过一段时间后再次显示通知。
简言之其他库
semver-diff:比较两个版本语义化的差异,返回差异的类型;latest-version:快速获取npm上最新版本号;upa:用于制作和呈现动画boxen:创建终端样式configstore:提供一种简单的方式来管理应用程序的配置,json的方式存储在用户的主目录semver:(语义化版本控制)来比较版本字符串xdg-basedir:处理各平台node差异