精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現一個簡易的 Npm Install 你會了嗎?

開發 前端
現在寫代碼我們一般不會全部自己實現,更多是基于第三方的包來進行開發,這體現在目錄上就是 src 和 node_modules 目錄。

 [[400477]]

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光zxg。轉載本文請聯系神光的編程秘籍公眾號。

現在寫代碼我們一般不會全部自己實現,更多是基于第三方的包來進行開發,這體現在目錄上就是 src 和 node_modules 目錄。

src 和 node_modules(第三方包) 的比例不同項目不一樣。

運行時查找第三方包的方式也不一樣:

  • 在 node 環境里面,運行時就支持 node_modules 的查找。所以只需要部署 src 部分,然后安裝相關的依賴。

  • 在瀏覽器環境里面不支持 node_modules,需要把它們打包成瀏覽器支持的形式。

跨端環境下,它是上面哪一種呢?

都不是,不同跨端引擎的實現會有不同,跨端引擎會實現 require,可以運行時查找模塊(內置的和第三方的),但是不是 node 的查找方式,是自己的一套。

和 node 環境下的模塊查找類似,但是目錄結構不一樣,所以需要自己實現 xxx install。

思路分析

npm 是有自己的 registry server 來支持 release 的包的下載,下載時是從 registry server 上下載。我們自己實現的話沒必要實現這一套,直接用 git clone 從 gitlab 上下載源碼即可。

依賴分析

要實現下載就要先確定哪些要下載,確定依賴的方式和打包工具不同:

  • 打包工具通過 AST 分析文件內容確定依賴關系,進行打包
  • 依賴安裝工具通過用戶聲明的依賴文件 (package.json / bundle.json)來確定依賴關系,進行安裝

這里我們把包的描述文件叫做 bundle.json,其中聲明依賴的包:

  1.     "name""xxx"
  2.     "dependencies": { 
  3.         "yyyy""aaaa/bbbb#release/1111" 
  4.     } 

通過分析項目根目錄的 bundle.json 作為入口,下載每一個依賴,分析 bundle.json,然后繼續下載每一個依賴項,遞歸這個過程。這就是依賴分析的過程。

這樣依賴分析的過程中進行包的下載,依賴分析結束,包的下載也就結束了。這是一種可行的思路。

但是這種思路存在問題,比如:版本沖突怎么辦?循環依賴怎么辦?

解決版本沖突

版本沖突是多個包依賴了同一個包,但是依賴的版本不同,這時候就要選擇一個版本來安裝,我們可以簡單的把規則定為使用高版本的那個。

解決循環依賴

包之間是可能有循環依賴的(這也是為什么叫做依賴圖,而不是依賴樹),這種問題的解決方式就是記錄下處理過的包,如果同個版本的包被分析過,那么久不再進行分析,直接拿緩存。

這種思路是解決循環依賴問題的通用思路。

我們解決了版本沖突和循環依賴的問題,還有沒有別的問題?

版本沖突時會下載版本最高的包,但是這時候之前的低版本的包已經下載過了,那么就多了沒必要的下載,能不能把這部分冗余下載去掉。

依賴分析和下載分離

多下載了一些低版本的包的原因是我們在依賴分析的過程中進行了下載,那么能不能依賴分析的時候只下載 bundle.json 來做分析,分析完確定了依賴圖之后再去批量下載依賴?

從 gitlab 上只下載 bundle.json 這一個文件需要通過 ssh 協議來下載,略微復雜,我們可以用一種更簡單的思路來實現:

  1. git clone --depth=1 --branch=bb xxx 

加上 --depth 以后 git clone 只會下載單個 commit,速度會很快,雖然比不上只下載 bundle.json,但是也是可用的(我試過下載全部 commit 要 20s 的時候,下載單個 commit 只要 1s)。

這樣我們在依賴分析的時候只下載一個 commit 到臨時目錄,分析依賴、解決沖突,確定了依賴圖之后,再去批量下載,這時候用 git clone 下載全部的 commit。最后要把臨時目錄刪除。

這樣,通過分離依賴分析和下載,我們去掉了沒必要的一些低版本包的下載。下載速度會得到一些提升。

全局緩存

當本地有多個項目的時候,每個項目都是獨立下載自己的依賴包的,這樣對于一些公用的包會存在重復下載,解決方式是全局緩存。

分析完依賴進行下載每一個依賴包的時候,首先查找全局有沒有這個包,如果有的話,直接復制過來,拉取下最新代碼。如果沒有的話,先下載到全局,然后復制到本地目錄。

通過多了一層全局緩存,我們實現了跨項目的依賴包復用。

代碼實現

為了思路更清晰,下面會寫偽代碼

依賴分析

依賴分析會遞歸處理 bundle.json,分析依賴并下載到臨時目錄,記錄分析出的依賴。會解決版本沖突、循環依賴問題。

  1. const allDeps = {}; 
  2. function installDeps(projectDir) { 
  3.     const bundleJsonPath = path.resolve(projectDir, 'bundle.json'); 
  4.     const bundleInfo = JSON.parse(fs.readFileSync(bundleJsonPath)); 
  5.      
  6.     const bundleDeps = bundleInfo.dependencies; 
  7.     for (let depName in bundleDeps) { 
  8.         if(allDeps[depName]) { 
  9.             if (allDeps[depName] 和 bundleDeps[depName] 分支和版本一樣) { 
  10.                 continue;// 跳過安裝 
  11.             } 
  12.             if (allDeps[depName] 和 bundleDeps[depName] 分支和版本不一樣){ 
  13.                 if (bundleDeps[depName] 版本 < allDeps[depName] 版本 ) { 
  14.                     continue
  15.                 } else { 
  16.                     // 記錄下版本沖突 
  17.                     allDeps[depName].conflit = true
  18.                 } 
  19.             
  20.             } 
  21.         } 
  22.         childProcess.exec(`git clone --depth=1 ${臨時目錄/depName}`); 
  23.         allDeps[depName] = { 
  24.             name: depName 
  25.             url: xxx 
  26.             branch: xxx 
  27.             version: xxx 
  28.         } 
  29.         installDeps(`${臨時目錄/depName}`); 
  30.     }     

下載

下載會基于上面分析出的 allDeps 批量下載依賴,首先下載到全局緩存目錄,然后復制到本地。

  1. function batchInstall(allDeps) { 
  2.     allDeps.forEach(dep => { 
  3.         const 全局目錄 = path.resolve(os.homedir(), '.xxx'); 
  4.         if (全局目錄/dep.name 存在) { 
  5.             // 復制到本地 
  6.             childProcess.exec(`cp 全局目錄/dep.name 本地目錄/dep.name`); 
  7.         } else { 
  8.             // 下載到全局 
  9.             childProcess.exec(`git clone --depth=1 ${全局目錄/dep.name}`); 
  10.              // 復制到本地 
  11.             childProcess.exec(`cp 全局目錄/dep.name 本地目錄/dep.name`); 
  12.         } 
  13.     }); 

這樣,我們就完成了依賴的分析和下載,實現了全局緩存。

總結

我們首先梳理了不同環境(瀏覽器、node、跨端引擎)對于第三方包的處理方式不同,瀏覽器需要打包,node 是運行時查找,跨端引擎也是運行時查找,但是用自己實現的一套機制。

然后明確了打包工具確定依賴的方式是 AST 分析,而依賴下載工具則是基于包描述文件 bundl.json(package.json) 來分析。然后我們實現了遞歸的依賴分析,解決了版本沖突、循環依賴問題。

為了減少沒必要的下載,我們做了依賴分析和下載的分離,依賴分析階段只下載單個 commit,后續批量下載的時候才全部下載。下載方式沒有實現 registry 的那套,而是直接從 gitlab 來 git clone。

為了避免多個項目的公共依賴的重復下載,我們實現了全局緩存,先下載到全局目錄,然后再復制到本地。

npm install、yarn install 的實現流程細節會更多一些,但是整體流程類似。希望這篇文章能幫你梳理清楚思路:不同環境是怎么處理第三方包的,xxx install 的依賴分析和下載的流程是什么樣的。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2022-09-19 08:01:45

數據庫SQLitePostgreSQL

2023-03-26 22:02:53

APMPR監控

2021-09-03 05:03:58

模塊命令項目

2023-09-19 08:03:50

rebase?merge

2023-04-27 08:42:50

效果

2021-10-04 09:29:41

對象池線程池

2024-06-21 08:15:25

2024-06-19 09:47:21

2022-02-08 09:09:45

智能指針C++

2024-04-01 08:13:59

排行榜MySQL持久化

2023-07-10 07:17:29

無效化空窗口

2022-06-16 07:50:35

數據結構鏈表

2025-04-01 03:25:00

2024-03-12 08:37:32

asyncawaitJavaScript

2023-12-07 12:29:49

Nginx負載均衡策略

2023-11-27 07:33:55

2022-04-26 10:47:53

分配權限vuejs

2024-07-29 10:35:44

KubernetesCSI存儲

2024-11-28 10:32:32

2022-04-26 08:10:33

MySQL存儲InnoDB
點贊
收藏

51CTO技術棧公眾號

成人午夜在线观看| 日韩大片免费观看视频播放| 亚洲一区综合| 亚洲无码精品国产| 欧美精品国产| 日韩高清中文字幕| 色播五月激情五月| 成年人视频免费在线播放| 91片黄在线观看| 国产精品va在线播放| 午夜激情福利网| 欧洲亚洲一区二区三区| 欧美精品日韩一本| 无码人妻少妇伦在线电影| 欧洲视频在线免费观看| 久久99久久99| 欧美一级淫片丝袜脚交| 成人免费精品动漫网站| 伊人久久大香线蕉| 欧美一区二区三区公司| 午夜视频在线瓜伦| 欧美大片黄色| 国产精品嫩草影院av蜜臀| ts人妖另类在线| 中文字幕在线观看免费| 亚洲经典在线看| 久久精品青青大伊人av| 一卡二卡三卡四卡| 精品国产鲁一鲁****| 日本精品一级二级| 欧美又粗又长又爽做受| 91青青在线视频| 91一区二区三区在线观看| 91免费精品国偷自产在线| 五月天激情四射| 国产专区一区| 色天天综合狠狠色| 成人性生交大免费看| 中文字幕区一区二区三| 欧美精品日韩综合在线| 中文字幕欧美人妻精品一区| av小说在线播放| 亚洲人成网站在线| 色综合影院在线观看| 狠狠综合久久av一区二区| 麻豆成人av在线| 日本精品性网站在线观看| 日韩特黄一级片| 国产一区二区三区自拍| 久久这里只有精品99| 国产不卡在线观看视频| 精品一区三区| 亚洲精品日韩欧美| 国产xxxxxxxxx| 狼人精品一区二区三区在线| 精品卡一卡二卡三卡四在线| 色婷婷综合在线观看| 日韩三级成人| 欧美日韩另类国产亚洲欧美一级| 欧美 日韩精品| www.com.cn成人| 欧美日韩美女在线| 精品无码国模私拍视频| 成全电影大全在线观看| 午夜私人影院久久久久| 国产av熟女一区二区三区| bestiality新另类大全| 亚洲人成人一区二区在线观看 | 国产一区二区三区毛片| 亚洲av综合一区二区| 一本色道久久综合亚洲精品酒店| 亚洲精品美女久久| 欧美无人区码suv| 欧洲vs亚洲vs国产| 亚洲欧美日韩中文视频| 欧洲美一区二区三区亚洲| 教室别恋欧美无删减版| 一个人看的www久久| 老司机福利在线观看| 久久在线视频| 久久精品免费播放| 久久久精品人妻一区二区三区四| 伊人久久大香线蕉精品组织观看| 欧美xxxx14xxxxx性爽| 欧美日韩在线视频免费| 在线成人欧美| 日本国产高清不卡| 中文字幕日韩经典| 经典三级在线一区| av一本久道久久波多野结衣| 天天操天天干天天操| 91性感美女视频| 欧美亚洲爱爱另类综合| 日本精品在线| 天天操天天综合网| 国产精品人人妻人人爽人人牛| 黑人一区二区三区| 欧美大片日本大片免费观看| 国产一级免费片| 国产99亚洲| 久久亚洲春色中文字幕| 懂色av.com| 免费日本视频一区| 97影院在线午夜| 少妇人妻偷人精品一区二区| 国产精品亲子伦对白| 欧洲精品在线播放| 福利一区视频| 亚洲国产精品成人av| 国产美女永久免费无遮挡| 女人香蕉久久**毛片精品| 欧美孕妇性xx| 亚洲a视频在线观看| 国产色爱av资源综合区| 国产精品无码免费专区午夜| 另类中文字幕国产精品| 日韩免费在线观看| 九一在线免费观看| 日韩网站在线| 亚洲一区二区免费| www.国产精品.com| 亚洲第一主播视频| 国产一区二区在线观看免费视频| 欧美aaaaa级| 久久99精品久久久久久琪琪| 少妇无套内谢久久久久| 成人精品一区二区三区四区| 正在播放91九色| 性欧美xxx69hd高清| 欧美一级黄色片| 精品日韩在线视频| 亚久久调教视频| 国产精品传媒毛片三区| 黄视频网站在线看| 日本高清视频一区二区| 亚洲成人福利视频| 国产欧美三级电影| 欧美片一区二区三区| 成人黄色片在线观看| 不卡一二三区首页| 大桥未久一区二区三区| 六月婷婷综合| 亚洲美女视频网| 久久成人在线观看| 久久国产剧场电影| 色噜噜色狠狠狠狠狠综合色一| 99热99re6国产在线播放| 欧美日韩国产综合一区二区| 成人网站免费观看| 中文字幕免费一区二区| 国产精自产拍久久久久久| 四虎影院在线域名免费观看| 亚洲国产日韩综合久久精品| 中文字幕一区二区在线观看视频 | 国产精品xxxx| 国产黄a三级三级三级av在线看 | 91碰在线视频| 欧美又粗又长又爽做受| 亚洲一区二区电影| 欧美激情国产精品| 亚洲高清在线观看视频| 亚洲欧美日韩中文字幕一区二区三区 | 日韩欧美猛交xxxxx无码| 婷婷激情成人| 日韩在线视频二区| 中文字幕一区二区久久人妻| 久久日韩粉嫩一区二区三区| 日本在线视频www| 伊人春色精品| 国产成人高潮免费观看精品| 美女欧美视频在线观看免费 | 久久国内精品自在自线400部| 欧美一区二区三区四区五区六区 | 国产精品毛片大码女人| 久久久久久三级| 国产一区二区三区日韩精品| 国产精品亚洲美女av网站| 成人性生交大片免费看午夜| 91福利资源站| 国产99在线 | 亚洲| 免费成人在线网站| 中文字幕av日韩精品| 亚洲精品黑牛一区二区三区| 久久99久久亚洲国产| 亚洲国产www| 五月综合激情日本mⅴ| 国产精品麻豆入口| 亚欧美中日韩视频| 这里只有精品66| 日本一区影院| 欧美极品欧美精品欧美视频 | 国产精品久久久久免费| 超级白嫩亚洲国产第一| 亚洲乱亚洲乱妇无码| 香蕉污视频在线观看| 国产欧美日韩一区二区三区在线观看| 欧美三级午夜理伦三级富婆| 亚洲精品小说| 国产高清一区视频| 日韩伦理精品| 日韩专区在线播放| 亚洲成熟女性毛茸茸| 色成年激情久久综合| 免费黄色国产视频| 懂色av一区二区夜夜嗨| 欧美精品色婷婷五月综合| 欧美日韩激情在线一区二区三区| 国产精品视频久久久久| 成人av影院在线观看| 亚洲欧美在线一区二区| 亚洲无码久久久久| 亚欧色一区w666天堂| 99久久精品免费视频| 激情文学综合丁香| 日韩欧美一区二| 日本黄色精品| 国产伦精品一区二区三区高清版 | 你懂的国产在线| 国产精品久久久久久久久免费相片 | 亚洲一区影音先锋| 91网站免费视频| 国产成人av影院| 国产成人手机视频| 亚洲欧洲日本mm| 一区二区精品国产| 国产成人澳门| 成人免费视频a| 345成人影院| 久久亚洲精品国产亚洲老地址| 头脑特工队2免费完整版在线观看| 欧美三级韩国三级日本一级| 国产一级黄色av| 国产欧美精品日韩区二区麻豆天美| 日本网站在线看| 久久一区中文字幕| 日韩av三级在线| 欧美韩国一区| 亚洲一区三区电影在线观看| 亚洲成a人片77777在线播放 | 国产一区二区四区| 国产精品毛片久久| 欧美一区亚洲二区| 久久久免费人体| 国产精品高潮在线| 亚洲美女炮图| 久久久久国产一区二区三区| 国产成人l区| 中文字幕日韩精品在线| 浮生影视网在线观看免费| 亚洲国产精品热久久| 国产精品自偷自拍| 在线观看视频一区| 国产一级18片视频| 亚洲国产综合91精品麻豆| 男人在线观看视频| 国产人伦精品一区二区| 中文字幕丰满孑伦无码专区| 成人精品鲁一区一区二区| 黄色激情在线观看| 国产成人久久精品77777最新版本| 日本不卡一区二区在线观看| 日本欧美在线看| 国产精品久久久久9999小说| 日韩1区2区日韩1区2区| 国产成人精品无码播放| 亚洲综合不卡| 久久网站免费视频| 国产精品女主播一区二区三区| 99久久免费观看| 欧美黄色一区| 粉嫩av一区二区三区天美传媒| 999久久久免费精品国产| 午夜精品区一区二区三| 国产精品欧美三级在线观看| 日韩精品伦理第一区| 国产日产精品一区二区三区四区的观看方式 | 日本大香伊一区二区三区| 亚洲精品午夜国产va久久成人| 亚洲午夜精品一区二区三区他趣| 九九视频免费看| 亚洲高清免费观看| 久久精品www人人爽人人| 亚洲成av人片观看| 亚洲高清毛片一区二区| 色天使久久综合网天天| 最近中文字幕av| 色哟哟国产精品免费观看| 在线视频 中文字幕| 678五月天丁香亚洲综合网| 国产同性人妖ts口直男| 日韩精品一区二区三区蜜臀| 日本高清视频免费观看| 亚洲最新av在线| 黄网站免费在线观看| 欧美国产日韩中文字幕在线| 国产调教在线| 国产成人精品在线视频| 在线日韩三级| 国产精品9999久久久久仙踪林| 日韩av资源网| 视频一区二区精品| 日韩在线观看电影完整版高清免费悬疑悬疑 | 99久久综合国产精品二区| 成人日韩在线电影| 红杏视频成人| 亚洲欧美日产图| 亚洲网站视频| 毛片av免费在线观看| 狠狠色狠狠色综合系列| 亚洲v在线观看| 中文字幕免费在线观看视频一区| 波多野结衣不卡视频| 欧美日韩美女在线| 一二三区中文字幕| 亚洲激情在线观看| 91网在线播放| 久久久亚洲影院| 国产精品黄色片| 91久久久久久国产精品| 国产成人精品999在线观看| 日本xxxxx18| 久久激情一区| 亚洲国产综合av| 国产欧美在线观看一区| 精品少妇theporn| 欧美视频中文字幕| 日本韩国在线观看| 久久久成人精品| 成人精品国产亚洲| 精品一区二区三区视频日产| 日韩欧美字幕| 久久久久久久久久福利| 成人午夜免费av| 网站永久看片免费| 精品日本美女福利在线观看| 国产精品嫩草影院精东| 精品国产乱码久久久久久蜜臀| 麻豆电影在线播放| 日本人成精品视频在线| 一区二区三区高清在线观看| 亚洲精品乱码视频| 今天的高清视频免费播放成人| 污污的视频免费观看| 久久九九久久九九| 国产亚洲第一页| 欧美一区二区三区人| 成年人在线视频| 日本精品久久久久影院| 国产一区二区三区不卡av| 樱空桃在线播放| 久久成人羞羞网站| 国产一区二区三区精品在线| 偷窥少妇高潮呻吟av久久免费| 成人激情四射网| 亚洲视频视频在线| www.久久.com| 欧美系列一区| 久久精选视频| 乱码一区二区三区| 亚洲夂夂婷婷色拍ww47| 国产99对白在线播放| 精品国产拍在线观看| 成人性教育av免费网址| 日本不卡免费新一二三区| 亚洲制服av| 国产精品一区二区入口九绯色| 午夜视频久久久久久| 人妻一区二区三区| 国外成人性视频| 大奶在线精品| 日本男女交配视频| 国产成人福利片| 校园春色 亚洲| 亚洲国产中文字幕久久网| 超碰资源在线| 免费成人在线观看av| 久久性天堂网| 潮喷失禁大喷水aⅴ无码| 欧美日韩综合在线| 欧美a在线看| 成人精品一二区| 91久久黄色| free性中国hd国语露脸| 色婷婷精品久久二区二区蜜臂av | 欧洲av一区| 日韩av中文在线观看| 欧美一级片在线视频| 欧美一区二区美女| 51xtv成人影院| 韩国一区二区三区美女美女秀| 久久亚洲美女| 欧美h片在线观看| 91精品国产91久久综合桃花 | 国产亚洲精品福利| 91av久久久| 久久全球大尺度高清视频| 亚洲精品中文字幕99999| 人人爽人人av| 国产精品久久久久久久久免费樱桃 | 国产精品久久久久一区二区三区共|