面試官問:怎么自動檢測你使用的組件庫有更新

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12

本文來自V同學投稿的源碼共讀第六期筆記,寫得很有趣。現在已經進行到第十期了。你或許經常看見 npm 更新的提示

627ac23a03c8d10ac466b7208203750b.png
npm 更新提示

面試官可能也會問你,組件庫更新了,怎么讓使用組件的人都知道。本文分析這個提示的原理實現,很有趣。

1前言

Hello,大家好,這里是V同學

今天我們又來看源碼了

今天若川大大沒有寫源碼閱讀的掘金文章

正好,可以讓我們一試身手

考驗一下我們之前跟隨著川大的源碼所鍛煉的源碼閱讀能力

今天我們要看的是 update-notifier 的源碼

老樣子,在我們閱讀源碼之前,先分析一手,看看這個到底是干嘛用的吧

2分析

這個是我們本期源碼閱讀的代碼倉庫

大家可以先克隆下來,我們且慢慢分析

我們可以用5W1H分析法來試著去分析一下

5w1h

那么什么是5w1h呢,簡單來說就是從

  • 原因(Why)

  • 對象(What)

  • 地點(Where)

  • 時間(When)

  • 人員(Who)

  • 方法(How)

這六個緯度去思考

那我們就一個一個來

What

首先,我們要來看看本期源碼是什么

通過度娘,我們可以大致的了解到,我們本期要看的源碼

似乎是一個和更新有關的工具,可以更新你的npm包和cli應用程序

db8079407642807b2d53c11525ff6a47.png

我們在看一下倉庫的readme

e6b44eafc88da9552c19cf0089109ea5.png

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

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 文件,點擊調試進入測試ac9dc96941eb032f1047aa0da7ec36c5.png

有人說了,我用的不是vscode怎么辦呢

其實也簡單的

首先還是先問問百度,你是用的編譯器是否有對應的測試插件

沒有的話,可以在編譯器的控制臺輸入測試中的命令

npm?run?test或者yarn?test

即可運行對應的測試,這個是看全部代碼的方式

具體通過測試看源碼的案例,可以看我的這一篇筆記

5準備

今天我們只看核心代碼

所以我們進入example 這個 JS 文件里面去

這個案例非常的簡單,一共就17行代碼

c0e63bcc26da69c82684b24c47df76ac.png

運行第四行作者給我們的命令

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圖里面,大家可以進行參考

ae2f393fe3a25b56ba2b785279344d8c.gif

6閱讀

首先我們在example里面打上斷點

af2407b5d4b34dbe7fd1ac3d7fd4f65c.png

然后進入調試

我們這時候發現,斷點進來了

72e6350cb4a5d39cacda551827170101.png

我們點擊調試的↓按鈕

我們發現我們進到了index.js文件里面

所以這個就是他的核心文件

1b802755762a33f1ff9d4741b7f205e2.png

我們進入到了183行

第一部分:實例化對象

在往下走,我們進入到了第一部分

d914e4be064214ed7104cc27689c921a.png

我們傳入的參數會被option接到

然后對拿到的對象進行數據清洗,只保留需要的數據

如果沒有需要的數據,就給他拋出個錯誤

74a72b67b058380e7cd74eb6804b8d55.png

接下來把需要的數據掛載到實例對象身上

檢查更新時間是否符合規范

知識點:process.env 是 Node.js 中的一個環境對象。其中保存著系統的環境的變量信息。

通過獲取process檢查是否禁用更新

知識點:isCi的作用是如果當前環境是持續集成服務器,則返回true

判斷是否在Npm腳本中通知

40439f06129e8435441c988629ed3d45.png

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

知識點:ConfigStore的作用是輕松加載和保留配置,而無需考慮在哪里以及如何

知識點:Chalk的作用是讓你的終端更美觀好看,具體在Vue-release這篇文章中有提到過

如果你沒禁用的話,幫你把包名通過ConfigStore進行持久化存儲,順便把最后一次檢查的時間更新成現在

第二部分:檢查更新

接下來我們順著代碼的路徑,走到了中間這一行

1aedca8e41fbc3c222cb3f522b0c9e19.png

進去的第一目光我們的卡姿蘭大眼睛就可以看到好幾個判斷

ef3a9b7b70f548f8bf0fb708e44f8d9f.pngd4972e36a055d7572f8f050e8f47c3a3.png

第一個判斷的大概意思是

如果你沒有本地存儲或者禁用更新的情況下,那么就不執行了,我們就說拜拜了

接下來,他拿到我們的之前存進去的update對象來更新

關鍵點

這里有一個關鍵點,就是我們之前埋下的坑

他第一次為什么不執行

因為這里第一次的時候,我們沒有執行過check.js這個文件

所以我們這里的這個update是空的

這里在埋下一個點,為什么updata是空的導致他只執行一次呢,這個后文會講到

我們接著往下看

ae0d0de2ea17b07cc066a34fffb4956e.png

知識點:spawn => 詳情請參考spawn

這里通過spawn開啟一個子進程,運行check.js,然后把options作為調用check.js的命令行參數

check.js文件

接下來我們就進入到了check.js文件里面

0b2306e0bf859faf6d8be42997913429.png
const?options?=?JSON.parse(process.argv[2]);

這一段代碼,意思是把我們剛才通過控制臺傳的option參數拿過來

知識點:latestVersion => 獲取最新版本的 npm 包

拿過來之后新建一個實例 ,然后去拿到對應的包名、最新版本、當前版本、版本差別的信息

拿到信息之后,更新一下最后一次檢查更新對應的時間

在順便把信息塞到持久化存儲當中的update里面、

然后關閉spawn打開的子進程,返回原來的函數里面

第三部分

當拿到最新版本的信息之后,他會把對應的實例對象返回出去

返回到了example.js文件里面

返回到了example之后去執行notify

a374f35c6b6a0e9e5d501703e6c6d70f.png

雖然說,之前的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. 最主要的是,我們學會了怎么樣去從一個啥也不是的小白,去學習,去拆分源碼,解構源碼,理解作者的思路與想法,我們可以把步子邁的小一點,一小步一小步的去走,步子太大了容易摔倒,把它掰開了揉碎了,慢慢消化吸收理解,成為自己的東西!加油,奧利給!


最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進群。

推薦閱讀

1個月,200+人,一起讀了4周源碼
我歷時3年才寫了10余篇源碼文章,但收獲了100w+閱讀

老姚淺談:怎么學JavaScript?

我在阿里招前端,該怎么幫你(可進面試群)

8cbb462cd8bd74839fef62661b4ac5cc.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動

e8171b484ac0bd13cd890dda5443274d.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。歡迎分享、收藏、點贊、在看我的公眾號文章~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275280.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式完整備忘錄

小言:這不是設計模式講解型博文,以下將設計模式的概述、類圖,代碼示例,總結分每篇博文單獨展示,現將其歸類,便于以后翻閱,設計模式也不是一兩個月學完了就能完全領悟,它只告訴我們幾…

使用Microsoft Web Application Stress Tool對web進行壓力測試

你的Web服務器和應用到底能夠支持多少并發用戶訪問?在出現大量并發請求的情況下,軟件會出現問題嗎?這些問題靠通常的測試手段是無法解答的。本文介紹 了Microsoft為這個目的而提供的免費工具WAS及其用法。另外,本文介紹了一種Web應…

2021前端高頻面試題整理,附答案

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12若川視野原意是若川的前端視野。但太長了就留下了四個字,不知道的以為關注的不是技術公眾號。今天分享一篇慕課網精英講師河畔一角的好文章~廢話不多說,…

OO第二單元作業小結

總結性博客作業 第一次作業 (1)從多線程的協同和同步控制方面,分析和總結自己三次作業的設計策略。 第一次作業為單電梯傻瓜調度,可以采用生產者——消費者模型,是一個有一個生產者(標準輸入電梯請求),一個…

dribbble加速vpn_關于Dribbble設計的幾點思考

dribbble加速vpn重點 (Top highlight)I’d like to start with the following quote from Paul Adam’s “The Dribbbilisation of Design,” a powerful read that examines the superficiality of modern product design portfolios, often containing Dribbble posts that l…

JS Compress and Decompress

<html><head><title>JavaScript字符串之壓縮與還原</title><meta http-equiv"Content-Type"content"text/html; charsetutf-8"/><script type"text/javascript"><!--/** * 壓縮 */functionCompress(strN…

尤雨溪推薦神器 ni ,能替代 npm/yarn/pnpm ?簡單好用!源碼揭秘!

1. 前言大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12想學源碼&#xff0c;極力推薦之前我寫的《學習源碼整體架構系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、…

如何了解自己的認知偏差_了解吸引力偏差

如何了解自己的認知偏差Let me introduce you the attractiveness bias theory known as cognitive bias.讓我向您介紹稱為認知偏差的吸引力偏差理論。 Think about a person with outstanding fashion. It will draw our attention, and maybe encourage us to interact with…

隱馬爾可夫模型(HMM)及Viterbi算法

HMM簡介 對于算法愛好者來說&#xff0c;隱馬爾可夫模型的大名那是如雷貫耳。那么&#xff0c;這個模型到底長什么樣&#xff1f;具體的原理又是什么呢&#xff1f;有什么具體的應用場景呢&#xff1f;本文將會解答這些疑惑。  本文將通過具體形象的例子來引入該模型&#xf…

尤大直播分享:vue3生態進展和展望

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12前言10月23日&#xff0c;參加了前端早早聊組織的【vue生態專場】&#xff0c;準備寫一波分享方便大家學習。早上有4個話題&#xff1a;volar開發&#xff0c;搭建平臺組件開發…

利用Python查看微信共同好友

思路 首先通過itchat這個微信個人號接口掃碼登錄個人微信網頁版&#xff0c;獲取可以識別好友身份的數據。這里是需要分別登錄兩人微信的&#xff0c;拿到兩人各自的好友信息存到列表中。 這樣一來&#xff0c;查共同好友就轉化成了查兩個列表中相同元素的問題。獲取到共同好友…

女生適合學ux嗎_UX設計色彩心理學,理論與可訪問性

女生適合學ux嗎Colour is an interesting topic, which I feel is often overlooked and sometimes under-appreciated. One of the first things I was taught was the power of colour, how it can have an impact on human emotion, and that there should be purpose behin…

初學者也能看懂的 Vue2 源碼中那些實用的基礎工具函數

1. 前言大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12想學源碼&#xff0c;極力推薦之前我寫的《學習源碼整體架構系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、…

清除浮動mini版

1&#xff09; 清除浮動mini版(簡約而不簡單).clr:after { content:"";display:table;clear:both;}.clr{zoom:1;} 轉載于:https://www.cnblogs.com/jinbiao/archive/2011/09/26/2191170.html

Fiddler 十分鐘最全使用介紹

Wireshark 、HTTPWatch、Fiddler的介紹 Firebug雖然可以抓包&#xff0c;但是對于分析http請求的詳細信息&#xff0c;不夠強大。模擬http請求的功能也不夠&#xff0c;且firebug常常是需要“無刷新修改”&#xff0c;如果刷新了頁面&#xff0c;所有的修改都不會保存。Wiresha…

視覺測試_視覺設計流行測驗

視覺測試重點 (Top highlight)I often discuss the topic of improving visual design skills with junior and mid-level designers. While there are a number of design principles the designers should learn and practice, one important skill that is not often consid…

如何給開源項目提過 PR 呢?其實很簡單

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12源碼共讀群里有小伙伴聊到如何給開源項目提PR&#xff0c;所以今天分享這篇文章。你有給開源的庫或者框架提過 PR 嗎&#xff1f;如果沒有&#xff0c;那么今天的文章會教你怎么…

一次回母校教前端的經歷

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12已進行了三個月&#xff0c;很多小伙伴都表示收獲頗豐。分享一篇武大畢業的耀耀大佬的文章。有些時候會受限于環境影響&#xff0c;特別是在校大學生。所以要融入到積極上進的環…

設計插畫工具_5個強大的設計師插畫工具

設計插畫工具As Product Designers, most likely, we have come across illustrative work. Visual design is one important element in enhancing the user experience. As many gravitate toward attractive looking products, designers are also adapting to the changing…

如何才能更合理地分配項目獎金?

項目獎金通常情況下都是屬于基本工資之外的一種績效獎勵&#xff0c;也就是說&#xff0c;它在員工的薪酬中&#xff0c;是屬于浮動的那一部分收入&#xff0c;而不是一種固定收入。基于這樣一種認知&#xff0c;跟大家討論下如何才能更合理地進行項目獎金的分配&#xff1f; 首…