叮咚,系统检测到 npm 有更新,原理揭秘!

发表于 3年以前  | 总阅读数:391 次

本文来自V同学投稿的源码共读第六期笔记,写得很有趣。现在已经进行到第十期了。你或许经常看见 npm 更新的提示

npm 更新提示

面试官可能也会问你,组件库更新了,怎么让使用组件的人都知道。本文分析这个提示的原理实现,很有趣。

1前言

Hello,大家好,这里是V同学

今天我们又来看源码了

今天若川大大没有写源码阅读的掘金文章

正好,可以让我们一试身手

考验一下我们之前跟随着川大的源码所锻炼的源码阅读能力

今天我们要看的是 update-notifier 的源码

老样子,在我们阅读源码之前,先分析一手,看看这个到底是干嘛用的吧

2分析

这个是我们本期源码阅读的代码仓库

大家可以先克隆下来,我们且慢慢分析

我们可以用5W1H分析法来试着去分析一下

5w1h

那么什么是5w1h呢,简单来说就是从

  • 原因(Why)
  • 对象(What)
  • 地点(Where)
  • 时间(When)
  • 人员(Who)
  • 方法(How)

这六个纬度去思考

那我们就一个一个来

What

首先,我们要来看看本期源码是什么

通过度娘,我们可以大致的了解到,我们本期要看的源码

似乎是一个和更新有关的工具,可以更新你的npm包和cli应用程序

我们在看一下仓库的readme

现在就非常的清晰明了了,这是一个以非入侵的方式通知你更新的这么一个工具

Why

那么我们为什么要读它的源码呢

有一下几点

1. 美化终端输出信息,描绘边框。
2. 我们可以学会怎么去开启子进程
3.  给一个node方法作为传参的几种方式
4.  通过configstore这个库我们能够持久化存储一些信息
5.  通过latest-version获取对应pkg包的最新版本信息

Who

谁应该去读他的源码

以下几类人适合去读他的源码,当然也适合来看看我的源码阅读的文章

1. 源码爱好者
2. 学习爱好者
3. 希望能学到东西的人
4. V同学的粉丝
……

在我的源码阅读的文章里面,我会一步一步的手摸手教你怎么去拆分阅读以及调试源码

Where

在哪里学的话,这个大家可以视实际情况而定

When

什么时候学的也取决于你的最佳学习时间,每个人的最佳的专注和学习时间不一样

具体的话视个人情况而定

How

那么我们就到了最关键的一点

怎么去读

没有度过源码的同学请放心

跟着V同学走,手摸手,包你药到命除

额不不不,是药到病除

3依赖

刚刚,我们把仓库的地址克隆下来了,那么接下来我们就安装一下依赖吧

进入到对应的仓库地址

输入一下命令

npm i 

或者

yarn

4测试

测试非常的重要,他可以让我们非常清晰的了解

一个框架的功能以及作者写这个测试的意图,所以我们看源码,可以先看看测试

我这边用的是 vscode

找到 package.json 文件,点击调试进入测试

有人说了,我用的不是vscode怎么办呢

其实也简单的

首先还是先问问百度,你是用的编译器是否有对应的测试插件

没有的话,可以在编译器的控制台输入测试中的命令

npm run test

或者

yarn test

即可运行对应的测试,这个是看全部代码的方式

具体通过测试看源码的案例,可以看我的这一篇笔记

5准备

今天我们只看核心代码

所以我们进入example 这个 JS 文件里面去

这个案例非常的简单,一共就17行代码

运行第四行作者给我们的命令

node example

我们发现没有反应,那么这是怎么一回事呢

我们来看一下注释

You have to run this file two times the first time

翻译过来就是第一次必须运行此文件两次

嘿,我运行过的别的程序都只需要运行一次,就你要运行两次,你搞特殊是吗‍

那么我们仔细来想想,要运行两次呢?

我们在来看看注释

This is because it never reports updates on the first run

翻译过来就是

这是因为它不会在第一次运行时报告更新

我们带着第一次为什么不会更新的问题来看源码

对于vscode进行node调试

我把过程放在以下gif图里面,大家可以进行参考

6阅读

首先我们在example里面打上断点

然后进入调试

我们这时候发现,断点进来了

我们点击调试的↓按钮

我们发现我们进到了index.js文件里面

所以这个就是他的核心文件

我们进入到了183行

第一部分:实例化对象

在往下走,我们进入到了第一部分

我们传入的参数会被option接到

然后对拿到的对象进行数据清洗,只保留需要的数据

如果没有需要的数据,就给他抛出个错误

接下来把需要的数据挂载到实例对象身上

检查更新时间是否符合规范

知识点:process.env 是 Node.js 中的一个环境对象。其中保存着系统的环境的变量信息。

通过获取process检查是否禁用更新

知识点:isCi的作用是如果当前环境是持续集成服务器,则返回true

判断是否在Npm脚本中通知

判断一下你是否禁用更新了

知识点:ConfigStore的作用是轻松加载和保留配置,而无需考虑在哪里以及如何

知识点:Chalk的作用是让你的终端更美观好看,具体在Vue-release这篇文章中有提到过

如果你没禁用的话,帮你把包名通过ConfigStore进行持久化存储,顺便把最后一次检查的时间更新成现在

第二部分:检查更新

接下来我们顺着代码的路径,走到了中间这一行

进去的第一目光我们的卡姿兰大眼睛就可以看到好几个判断

第一个判断的大概意思是

如果你没有本地存储或者禁用更新的情况下,那么就不执行了,我们就说拜拜了

接下来,他拿到我们的之前存进去的update对象来更新

关键点

这里有一个关键点,就是我们之前埋下的坑

他第一次为什么不执行

因为这里第一次的时候,我们没有执行过check.js这个文件

所以我们这里的这个update是空的

这里在埋下一个点,为什么updata是空的导致他只执行一次呢,这个后文会讲到

我们接着往下看

知识点:spawn => 详情请参考spawn

这里通过spawn开启一个子进程,运行check.js,然后把options作为调用check.js的命令行参数

check.js文件

接下来我们就进入到了check.js文件里面

const options = JSON.parse(process.argv[2]);

这一段代码,意思是把我们刚才通过控制台传的option参数拿过来

知识点:latestVersion => 获取最新版本的 npm 包

拿过来之后新建一个实例 ,然后去拿到对应的包名、最新版本、当前版本、版本差别的信息

拿到信息之后,更新一下最后一次检查更新对应的时间

在顺便把信息塞到持久化存储当中的update里面、

然后关闭spawn打开的子进程,返回原来的函数里面

第三部分

当拿到最新版本的信息之后,他会把对应的实例对象返回出去

返回到了example.js文件里面

返回到了example之后去执行notify

虽然说,之前的update被存进去了,但是在notify的时候没有被读出来

所以就导致之前的update因为是空的,在最开始的时候,进不去notify的函数,就被return掉了

这就是为什么第一次执行的时候,什么都不返回的原因了

知识点:is-installed-globally:检查您的软件包是否已全局安装

知识点:is-yarn-global:检查您的yarn包是否已全局安装

接下来他会检查你是不是全局安装了,全局是不是用的yarn安装的

接下来就是控制你的控制台,在你的控制台上输入一些安装命令

知识点:boxen:在终端中创建框

完成之后,通过boxen构建一个框框,然后用template去显示更新信息

7总结

  1. 我们用了5w1h分析法,在看源码之前进行了分析思考
  2. 我们学会了怎么去通过编译器,去调试测试用例
  3. 我们知道了看源码前应该做哪些准备
  4. 我们知道了可以带着问题去看源码,可以提高你的阅读效率
  5. 我们知道了检查更新npm文件的全部流程
  6. 我们知道了process.env 是 Node.js 中的一个环境对象,里面保存着系统的环境的变量信息
  7. ConfigStore可以进行持久化存储
  8. Chalk可以让你的终端更好看
  9. spawn可以生成一个子进程去执行命令
  10. is-installed-globally可以检查你的软件包是否已全局安装
  11. is-yarn-global可以检查你全局安装的是否是通过yarn安装的
  12. 在终端中画框框可以用 boxen
  13. isCi的作用可以判断当前环境是持续集成服务器
  14. latestVersion可以获取最新版本的 npm 包
  15. 最主要的是,我们学会了怎么样去从一个啥也不是的小白,去学习,去拆分源码,解构源码,理解作者的思路与想法,我们可以把步子迈的小一点,一小步一小步的去走,步子太大了容易摔倒,把它掰开了揉碎了,慢慢消化吸收理解,成为自己的东西!加油,奥利给!

本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/mg8WH8HbCMN4rLNm7Y6Pxg

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237279次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8114次阅读
 目录