精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

婷婷精品视频| 日产福利视频在线观看| 国内精品伊人久久久久影院对白| 免费av一区二区| 午夜性福利视频| av中文字幕在线观看第一页| 久久久久久久久免费| 国产在线拍揄自揄视频不卡99| 色老板免费视频| 精品福利网址导航| 5月丁香婷婷综合| 国产91porn| 国产剧情在线观看| 国产高清不卡一区二区| 国产福利视频一区| 黄页网站免费观看| 日韩高清欧美| 亚洲精品美女久久久| 午夜大片在线观看| 成人日韩精品| 精品毛片网大全| 日日噜噜噜夜夜爽爽| 国产在线视频你懂得| 高清久久久久久| 国产在线视频一区| 黄色网址中文字幕| 国产精品女主播一区二区三区| 日韩色av导航| 国产成人无码精品久久二区三| 一区二区亚洲视频| 制服丝袜亚洲色图| 午夜在线观看av| 性欧美又大又长又硬| 亚洲一区二区三区自拍| 国产成年人在线观看| 99re在线视频| 久久久精品日韩欧美| 国产视频一区二区三区四区| 国产精品伦一区二区三区| 免费观看日韩av| 欧洲精品在线视频| 亚洲图片在线视频| 中文在线不卡| 2019av中文字幕| 日韩av在线播放观看| 一区在线播放| 欧美激情视频一区二区三区不卡| 国产精品 欧美激情| 欧美电影《轻佻寡妇》| 中文字幕欧美精品在线| 丁香激情五月少妇| 欧美精品一区二区三区中文字幕| 国产视频久久久久| 亚洲精品理论片| 欧美女优在线视频| 亚洲色图国产精品| 久久国产柳州莫菁门| 精品国产中文字幕第一页| 亚洲视频免费一区| 久久视频精品在线观看| 日韩国产欧美一区二区| 久久影院在线观看| 妺妺窝人体色www聚色窝仙踪| 91精品在线观看国产| 美女av一区二区三区 | 成熟丰满熟妇高潮xxxxx视频| 亚洲七七久久综合桃花剧情介绍| 亚洲精品国产高清久久伦理二区| 粉嫩av一区二区三区天美传媒 | 亚洲欧美日韩综合aⅴ视频| 影音先锋欧美在线| 午夜影院免费在线| 午夜私人影院久久久久| 久久久精品在线视频| 欧美123区| 91精品国产一区二区三区蜜臀| 国产性生活一级片| 亚洲精品a区| 国产丝袜一区视频在线观看| 中文字幕在线观看免费高清| 99久久99热这里只有精品| 欧美大片免费看| 日本高清不卡码| 精品一区二区三区免费播放| av日韩中文字幕| 你懂的视频在线| 成人免费在线播放视频| 亚洲国产成人精品无码区99| 欧美18—19sex性hd| 欧美高清精品3d| 超碰caoprom| 99精品全国免费观看视频软件| 久久综合伊人77777尤物| 日本系列第一页| 日本欧美加勒比视频| av一本久道久久波多野结衣| 久草在现在线| 一区二区视频免费在线观看| 国产精品秘入口18禁麻豆免会员| 日韩av电影资源网| 亚洲成人中文字幕| 免费看一级黄色| 国产亚洲毛片在线| 亚洲精品欧美日韩| 久热av在线| 亚洲第一主播视频| 国产精品区在线| 欧美亚洲色图校园春色| 久久精品视频99| 国偷自拍第113页| 国产精品正在播放| 久久精品国产一区二区三区日韩 | 亚洲综合免费观看高清完整版 | 久久久亚洲精品无码| 四虎国产精品免费久久5151| 亚洲美女视频网| 欧美日韩国产精品综合| 蜜桃在线一区二区三区| 欧美成人第一区| freexxx性亚洲精品| 91精品国产色综合久久不卡电影| 久久av无码精品人妻系列试探| 欧美精品福利| 91精品视频免费观看| 高清美女视频一区| 欧美网站在线观看| 91视频在线免费| 欧美精品自拍| 91精品在线观| 久久黄色美女电影| 欧美视频三区在线播放| 波多野结衣办公室33分钟| 在线看片日韩| 国产精品三区www17con| 色yeye免费人成网站在线观看| 欧美麻豆精品久久久久久| 精品一区二区三区蜜桃在线| 久久精品官网| 欧美资源一区| 欧美无毛视频| 亚洲小视频在线| 无码人妻丰满熟妇奶水区码| 久久久午夜精品| 无遮挡又爽又刺激的视频 | 国产大陆精品国产| 免费观看黄色大片| 韩国一区二区三区视频| 欧美成人午夜激情| 精品国产av一区二区| 亚洲黄色小视频| 亚洲成人av免费观看| 九色网友自拍视频手机在线| 午夜天堂影视香蕉久久| xxxx黄色片| 另类av一区二区| 日韩av电影免费在线| yw.尤物在线精品视频| 正在播放国产一区| 国产一区二区网站| 尤物av一区二区| 国产综合内射日韩久| 99精品99| 日本一区二区高清视频| 欧美jizz18| 久久国产天堂福利天堂| 黄色www视频| 狠狠躁天天躁日日躁欧美| 国产真实乱人偷精品人妻| 男男视频亚洲欧美| 300部国产真实乱| 国产成人在线中文字幕| 日本一区二区在线播放| 二区三区在线播放| 日韩亚洲欧美综合| 日本熟女一区二区| 国产欧美精品国产国产专区| 亚洲综合在线一区二区| 最新国产拍偷乱拍精品 | 青青国产在线| 欧美日韩电影在线| 久久久久久国产精品视频| 久久影院视频免费| 精品久久久99| 亚洲日本欧美| 亚洲视频sss| 久久男人av| 国产精品网红直播| 美女精品导航| 在线精品国产成人综合| 高潮一区二区三区乱码| 欧美视频一二三区| 日本熟妇色xxxxx日本免费看| 欧美国产一区视频在线观看| 性生交大片免费看l| 免费看欧美女人艹b| 国产又粗又猛又爽又黄的网站 | 日本女人高潮视频| 欧美日韩大片免费观看| 国产欧美日韩最新| 夜鲁夜鲁夜鲁视频在线播放| 久久久91精品| 国产午夜在线观看| 精品日韩一区二区三区| 自拍偷拍福利视频| 精品久久久久久久久久久久久| 手机免费观看av| av成人老司机| 麻豆精品国产传媒| 奇米在线7777在线精品| 国产h视频在线播放| 一区二区三区四区在线观看国产日韩| 久久99精品久久久久久三级 | 欧美一区二区三区免费视频| 成人av网站在线播放| 亚洲图片一区二区| 9999热视频| 中文字幕欧美国产| 免费在线观看成年人视频| 国产成人欧美日韩在线电影| 色综合色综合色综合色综合| 鲁大师影院一区二区三区| 免费人成在线观看视频播放| 亚洲综合五月| 欧美 日韩 国产 在线观看| 欧美精品第一区| 久久精品中文字幕一区二区三区| 综合激情久久| 成人在线视频福利| 欧美爱爱视频| 国产精品对白刺激| 欧美极品免费| 国产999精品久久久| 在线免费三级电影网站| 97视频在线观看网址| 日本动漫理论片在线观看网站 | 亚洲三级欧美| 91精品国产沙发| 国产精品电影| 欧美高清不卡在线| 久久香蕉一区| 欧美精品videos性欧美| 欧洲在线视频| 久久久综合av| 国产在线天堂www网在线观看| 欧美国产日本高清在线 | 久热国产在线| 九九热最新视频//这里只有精品| 久久久久久国产精品免费无遮挡| 日韩在线不卡视频| 日本视频在线观看| www国产精品视频| av大片在线| 久久久久久久久久久人体| xxx在线免费观看| 亚洲 日韩 国产第一| 欧洲一区精品| 国产成人在线亚洲欧美| www.26天天久久天堂| 成人免费视频网| 日本精品在线观看| 国产精品一区二区三区观看 | 亚洲欧美久久234| 99精品在线| 国产一二三区在线播放| 亚洲青涩在线| 少妇黄色一级片| 精品午夜久久福利影院 | 日本一区免费视频| 免费成人深夜夜行网站| 亚洲午夜在线电影| √资源天堂中文在线| 欧美日韩一区二区三区四区| 国产欧美第一页| 亚洲级视频在线观看免费1级| 精品视频二区| 久久久精品视频成人| 91av久久| 国产精品夜间视频香蕉| 在线综合色站| 热re99久久精品国产99热| 久久精品国内一区二区三区水蜜桃| 精品视频在线观看一区二区| 国产精品久久久久久久久久妞妞| 中文字幕欧美人妻精品一区| 韩国v欧美v日本v亚洲v| 国产一级二级在线观看| 国产精品久久影院| 日本熟伦人妇xxxx| 欧美日本国产一区| 性xxxx视频| 另类少妇人与禽zozz0性伦| 女人高潮被爽到呻吟在线观看 | av免费在线播放网站| 韩国av一区二区三区| 免费毛片视频网站| 亚洲精品乱码久久久久久久久| 久久99国产综合精品免费| 91精品国产手机| 国产黄色在线| 97免费视频在线播放| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 在线亚洲伦理| 成年人网站av| 日本一区二区视频在线| 中文字幕日韩一级| 欧美一区二区三级| 风间由美一区| 欧美影院在线播放| 超碰成人免费| 在线丝袜欧美日韩制服| 巨乳诱惑日韩免费av| 中文字幕人妻一区| 亚洲欧美韩国综合色| 97人妻精品视频一区| 日韩av影视在线| 欧美1—12sexvideos| 成人午夜在线视频一区| 欧美一区二区三区激情视频| 免费无码不卡视频在线观看| 国产成人一区在线| 亚洲欧美另类日本| 欧美午夜理伦三级在线观看| 亚洲AV成人无码一二三区在线| 欧美另类高清videos| 99综合久久| 亚洲在线播放电影| 秋霞电影网一区二区| 中文字幕丰满乱子伦无码专区| 亚洲成人一区二区| 亚洲第一天堂在线观看| 美女黄色丝袜一区| 麻豆国产精品| 可以免费看的黄色网址| 免费高清视频精品| 欧美一区二区三区粗大| 在线观看国产91| 国产精品99999| 国产精品午夜视频| 日韩成人影院| 午夜免费看毛片| 中文字幕中文字幕一区| 亚洲性生活大片| 日韩亚洲成人av在线| 亚洲日日夜夜| 天堂av在线中文| 国产成人精品免费| 精品无码人妻一区二区三区| 精品成人一区二区三区四区| 超碰在线cao| 免费精品视频一区| 日本va欧美va精品| 任我爽在线视频| 91精品免费观看| 欧洲中文在线| 免费看成人午夜电影| 日韩精品午夜视频| 亚洲精品卡一卡二| 精品日本一线二线三线不卡| segui88久久综合9999| 精品蜜桃一区二区三区| 久久不射网站| 亚洲a∨无码无在线观看| 这里是久久伊人| 国产精品探花在线| 蜜桃av噜噜一区二区三| 美女免费视频一区| 久久久国产精华液| 精品视频在线观看日韩| 国产韩日精品| 狠狠精品干练久久久无码中文字幕| 成人免费毛片嘿嘿连载视频| 久久草视频在线| 这里只有视频精品| 99精品国产一区二区三区2021| 91视频 -- 69xx| 成人欧美一区二区三区视频网页| 亚洲精品综合久久| 国产精品69av| 欧美~级网站不卡| 人妻在线日韩免费视频| 欧美日韩免费在线视频| 黑人玩欧美人三根一起进| 秋霞在线观看一区二区三区| 国产美女一区二区| 国产一级片毛片| 久久精品一偷一偷国产| 精品欧美午夜寂寞影院| www午夜视频| 精品毛片三在线观看| 3d玉蒲团在线观看| 日本一区二区三区四区高清视频| 国模无码大尺度一区二区三区| 日韩精品久久久久久久| 日韩在线一区二区三区免费视频| 精品久久ai| 女人高潮一级片| 日本韩国精品在线| а√天堂8资源在线| 在线视频不卡一区二区| 久久精品综合网|