【源码共读】第6期 | 从update-notifier库知道如何检测 npm 包是否更新

666 阅读2分钟

前言

先说结论

  • 这是一个用于检查软件包是否为最新版本的库
  • 这个库主要用在需要自动检查和提示软件包更新的场景,比如脚手架应用。常见与用npm下载库,在终端中提示npm存在最新版,并给出更新方法
  • 通过检测库中的package.json文件中的信息,如name,version,distTag等信息判断当前库是否发生变化,具备检查更新、比较版本、通知输出信息、错误信息处理等功能;
  • 如下图所示,我们常见的更新提示信息方式:

image.png

具体源码分析

  1. 检查更新update-notifiercheck方法中通过node的spaw运行子进程每隔一段时间就从fetchInfo方法中使用 latest-version 库来查询 npm 注册表中指定包的最新版本,查看是否有更新。
  2. 存储版本信息:首次运行时,update-notifier 会在用户的主目录中创建一个文件(通常是 ~/.config/configstore/<package-name>.json),以存储当前安装的版本和最后检查更新的时间。
  3. 比较版本:在后续的运行中,update-notifier会比较存储的版本和从 npm 注册表检索到的最新版本。
  4. 显示通知:如果发现新版本,update-notifier 会在notify中使用 boxen 或类似的库在终端中显示一个通知消息。
  5. 控制通知频率:为了防止每次运行应用时都显示通知,update-notifiernotify函数会在用户确认更新或经过一段时间后再次显示通知。

简言之其他库

  • semver-diff:比较两个版本语义化的差异,返回差异的类型;
  • latest-version:快速获取npm上最新版本号;
  • upa:用于制作和呈现动画
  • boxen:创建终端样式
  • configstore:提供一种简单的方式来管理应用程序的配置,json的方式存储在用户的主目录
  • semver:(语义化版本控制)来比较版本字符串
  • xdg-basedir:处理各平台node差异