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

微前端框架是怎么導入加載子應用的

開發 前端
微前端似乎是最近一個很火的話題,我們也即將使用在生產環境中,接下來會更新一系列微前端源碼分析、手寫微前端文章。

微前端似乎是最近一個很火的話題,我們也即將使用在生產環境中,接下來會更新一系列微前端源碼分析、手寫微前端文章

廢話不多說,直接參考目前的微前端框架注冊子應用模塊代碼

下面代碼,我指定的entry,就是子應用的訪問入口地址

微前端到底是怎么回事呢?  我畫了一張圖

我們今天不談其他的實現技術細節,坑點,就談整體架構,這張圖就能完全解釋清楚

那么registerMicroApps,到底做了什么呢?

源碼解析下,只看重要部分今天:

lifeCycles是我們自己傳入的生命周期函數(這里先不解釋),跟react這種框架一樣,微前端針對每個子應用,也封裝了一些生命周期,如果你是小白,那我就用最簡單的話告訴你,生命周期鉤子,其實在框架源碼就是一個函數編寫調用順序而已(有的分異步和同步)

apps就是我們傳入的數組,子應用集合

代碼里做了一些防重復注冊、數據處理等

看源碼,不要全部都看,那樣很費時間,而且你也得不到利益最大化,只看最精髓、重要部分

無論上面做了上面子應用去重、數據處理,我只要盯著每個子應用,即app這個對象即可

看到了loadApp這個方法,我們可以大概猜測到,是通過這個方法加載

下面__rest是對數據進行處理

loadApp這個函數有大概300行,挑最重點地方看

registerApplication是single-spa的方法,我們這里通過loadApp這個方法,對數據進行處理

上面這個函數,應該是整個微前端框架最復雜的地方,它最終會返回一個函數,當成函數傳遞給single-spa這個庫的registerApplication方法使用

它的內部是switch case邏輯,然后返回一個數組

這是一個邏輯判斷 

  1. case 0:  
  2.           entry = app.entry, appappName = app.name;  
  3.           _b = configuration.singular, singular = _b === void 0 ? false : _b, _c = configuration.sandbox, sandbox = _c === void 0 ? true : _c, importEntryOpts = __rest(configuration, ["singular", "sandbox"]); 
  4.  return [4  
  5. /*yield*/  
  6.           , importEntry(entry, importEntryOpts)]; 

重點來了

會通過importEntry 去加載entry(子應用地址)

  

上面代碼里最重要的,如果我們entry傳入字符串,那么就會使用這個函數去加載HTML內容(其實微前端的所有子應用加載,都是把dom節點加載渲染到基座的index.html文件中的一個div標簽內)

importHTML這個函數,就是我們今晚最重要的一個點

傳入url地址,發起fetch請求(此時由于域名或者端口不一樣,會出現跨域,所有子應用的熱更新開發模式下,webpack配置要做以下處理,部署也要考慮這個問題)

整個importHTML函數好像很長很長,但是我們就看最重要的地方,一個框架(庫),流程線很長+版本迭代原因,需要兼容老的版本,所以很多源碼對于我們其實是無用的

整個函數,最后返回了一個對象,這里很明顯,通過fetch請求,獲取了對應子應用entry入口的資源文件后,轉換成了字符串

這里processTpl其實就是對這個子應用的dom模版(字符串格式)進行一個數據拼裝,其實也不是很復雜,由于時間關系,可以自己看看過程,重點看結果

這里的思想,是redux的中間件源碼思想,將數據進行了一層包裝,高可用使用 

  1. function processTpl(tpl, baseURI) {  
  2. var scripts = [];  
  3. var styles = [];  
  4. var entry = null 
  5. var template = tpl  
  6. /*  
  7.   remove html comment first  
  8.   */  
  9.   .replace(HTML_COMMENT_REGEX, '').replace(LINK_TAG_REGEX, function (match) {  
  10. /*  
  11.     change the css link  
  12.     */  
  13. var styleType = !!match.match(STYLE_TYPE_REGEX);  
  14. if (styleType) {  
  15. var styleHref = match.match(STYLE_HREF_REGEX);  
  16. var styleIgnore = match.match(LINK_IGNORE_REGEX);  
  17. if (styleHref) {  
  18. var href = styleHref && styleHref[2];  
  19. var newHref = href 
  20. if (href && !hasProtocol(href)) {  
  21.           newHref = getEntirePath(href, baseURI);  
  22.         }  
  23. if (styleIgnore) {  
  24. return genIgnoreAssetReplaceSymbol(newHref);  
  25.         }  
  26.         styles.push(newHref);  
  27. return genLinkReplaceSymbol(newHref);  
  28.       }  
  29.     }  
  30. var preloadOrPrefetchType = match.match(LINK_PRELOAD_OR_PREFETCH_REGEX) && match.match(LINK_HREF_REGEX);  
  31. if (preloadOrPrefetchType) {  
  32. var _match$matchmatch = match.match(LINK_HREF_REGEX),  
  33.           _match$match2 = (0, _slicedToArray2["default"])(_match$match, 3),  
  34.           linkHref = _match$match2[2];  
  35. return genLinkReplaceSymbol(linkHref, true);  
  36.     }  
  37. return match;  
  38.   }).replace(STYLE_TAG_REGEX, function (match) {  
  39. if (STYLE_IGNORE_REGEX.test(match)) {  
  40. return genIgnoreAssetReplaceSymbol('style file');  
  41.     }  
  42. return match;  
  43.   }).replace(ALL_SCRIPT_REGEX, function (match) {  
  44. var scriptIgnore = match.match(SCRIPT_IGNORE_REGEX); // in order to keep the exec order of all javascripts  
  45. // if it is a external script  
  46. if (SCRIPT_TAG_REGEX.test(match) && match.match(SCRIPT_SRC_REGEX)) {  
  47. /* 
  48.       collect scripts and replace the ref  
  49.       */  
  50. var matchmatchedScriptEntry = match.match(SCRIPT_ENTRY_REGEX);  
  51. var matchmatchedScriptSrcMatch = match.match(SCRIPT_SRC_REGEX);  
  52. var matchedScriptSrc = matchedScriptSrcMatch && matchedScriptSrcMatch[2];  
  53. if (entry && matchedScriptEntry) {  
  54. throw new SyntaxError('You should not set multiply entry script!');  
  55.       } else {  
  56. // append the domain while the script not have an protocol prefix  
  57. if (matchedScriptSrc && !hasProtocol(matchedScriptSrc)) {  
  58.           matchedScriptSrc = getEntirePath(matchedScriptSrc, baseURI);  
  59.         }  
  60.         entryentry = entry || matchedScriptEntry && matchedScriptSrc;  
  61.       }  
  62. if (scriptIgnore) {  
  63. return genIgnoreAssetReplaceSymbol(matchedScriptSrc || 'js file');  
  64.       }  
  65. if (matchedScriptSrc) {  
  66. var asyncScript = !!match.match(SCRIPT_ASYNC_REGEX);  
  67.         scripts.push(asyncScript ? {  
  68.           async: true,  
  69.           src: matchedScriptSrc  
  70.         } : matchedScriptSrc);  
  71. return genScriptReplaceSymbol(matchedScriptSrc, asyncScript);  
  72.       }  
  73. return match;  
  74.     } else {  
  75. if (scriptIgnore) {  
  76. return genIgnoreAssetReplaceSymbol('js file');  
  77.       } // if it is an inline script  
  78. var code = (0, _utils.getInlineCode)(match); // remove script blocks when all of these lines are comments.  
  79. var isPureCommentBlock = code.split(/[\r\n]+/).every(function (line) {  
  80. return !line.trim() || line.trim().startsWith('//');  
  81.       });  
  82. if (!isPureCommentBlock) { 
  83.          scripts.push(match);  
  84.       }  
  85. return inlineScriptReplaceSymbol;  
  86.     }  
  87.   });  
  88.   scriptsscripts = scripts.filter(function (script) {  
  89. // filter empty script  
  90. return !!script;  
  91.   });  
  92. return {  
  93.     template: template,  
  94.     scripts: scripts,  
  95.     styles: styles,  
  96. // set the last script as entry if have not set  
  97.     entry: entry || scripts[scripts.length - 1]  
  98.   };  

最終返回了一個對象,此時已經不是一個純html的字符串了,而是一個對象,而且腳本樣式都分離了

這個是框架幫我們處理的,必須要設置一個入口js文件 

  1. // set the last script as entry if have not set 

下面是真正的single-spa源碼,注冊子應用,用apps這個數組去收集所有的子應用(數組每一項已經擁有了腳本、html、css樣式的內容)

此時我們只要根據我們之前編寫的activeRule和監聽前端路由變化去控制展示子應用即可,原理如下:(今天不做過多講解這塊) 

  1. window.addEventListener('hashchange', reroute);  
  2. window.addEventListener('popstate', reroute);  
  3. // 攔截所有注冊的事件,以便確保這里的事件總是第一個執行  
  4. const originalAddEventListener = window.addEventListener;  
  5. const originalRemoveEventListener = window.removeEventListener;  
  6. window.addEventListener = function (eventName, handler, args) {  
  7.     if (eventName && HIJACK_EVENTS_NAME.test(eventName) && typeof handler === 'function') {  
  8.         EVENTS_POOL[eventName].indexOf(handler) === -1 && EVENTS_POOL[eventName].push(handler); 
  9.     }  
  10.     return originalAddEventListener.apply(this, arguments);  
  11. };  
  12. window.removeEventListener = function (eventName, handler) {  
  13.     if (eventName && HIJACK_EVENTS_NAME.test(eventName) && typeof handler === 'function') {  
  14.         let eventList = EVENTS_POOL[eventName];  
  15.         eventList.indexOf(handler) > -1 && (EVENTS_POOL[eventName] = eventList.filter(fn => fn !== handler));  
  16.     }  
  17.     return originalRemoveEventListener.apply(this, arguments);  
  18. }; 

也是redux的中間件思想,劫持了事件,然后進行派發,優先調用微前端框架的路由事件,然后進行過濾展示子應用: 

  1. export function getAppsToLoad() {  
  2.     return APPS.filter(notSkipped).filter(withoutLoadError).filter(isntLoaded).filter(shouldBeActive);  

整個微前端的觸發流程

 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-04-21 19:20:53

前端 容器應用

2022-09-07 21:31:19

微前端架構iframe

2023-11-03 08:04:47

Web微前端框架

2023-11-22 19:10:42

前端父應用文案

2020-10-18 07:37:24

微前端框架前端

2021-12-24 16:59:14

前端Web框架

2022-02-13 23:00:48

前端微前端qiankun

2022-10-20 15:43:39

htmxDjango技術棧

2022-10-17 15:21:18

2018-11-01 14:12:03

前端架構Javascript

2022-02-23 15:33:19

前端框架開發Web

2017-01-05 11:26:22

騰訊云微信小程序

2024-04-07 08:56:25

JavaScriptweb應用開發工具

2022-08-30 19:11:12

Docker虛擬化技術

2022-03-14 15:26:59

Hi3516Ark子系統鴻蒙

2021-06-26 07:40:21

前端自動化測試Jest

2013-10-24 10:40:23

前端框架

2023-02-20 08:41:08

SignaluseState()

2024-07-16 11:26:35

微前端代碼JS

2023-04-28 07:44:44

MyBatis查詢SQL
點贊
收藏

51CTO技術棧公眾號

久久精品在线免费观看| 波多野结衣在线网址| 国产www在线| 精品视频一区二区三区在线观看| 久久伊99综合婷婷久久伊| 欧美大胆在线视频| 久久综合九色欧美狠狠| 丝袜 亚洲 另类 欧美 重口| 亚洲承认视频| 93久久精品日日躁夜夜躁欧美| 久久精品中文字幕免费mv| 又色又爽又高潮免费视频国产| 好男人在线视频www| 你懂的国产精品永久在线| 欧美视频第二页| 日韩精品另类天天更新| 国产精品久久久久久久久久久久久久久久久 | 天天舔天天干天天操| 婷婷丁香综合| 欧美日韩情趣电影| 午夜一区二区三视频在线观看| 国产一级免费视频| 亚州av日韩av| 欧美性xxxx极品hd欧美风情| 成人欧美一区二区三区视频xxx| 顶级黑人搡bbw搡bbbb搡| 日韩欧美2区| 国产精品久久久久一区二区三区| 国产精品pans私拍| caopor在线| 国内高清免费在线视频| 欧美不卡高清| 国产一区二区免费| 日本 片 成人 在线| 香蕉视频网站在线观看| 国产一区二区免费在线| 久久999免费视频| 精品国产aⅴ一区二区三区东京热| 伊人在我在线看导航| 国产不卡视频在线播放| 97精品久久久| 欧洲性xxxx| 国产亚洲高清一区| 性做久久久久久久免费看| 久久另类ts人妖一区二区| 国产黄网在线观看| 国产精品久久观看| 伊是香蕉大人久久| 香蕉视频xxx| 爱看av在线| 一区二区三区产品免费精品久久75| 动漫一区二区在线| 国产www免费观看| 亚洲一区日韩| 日韩中文字幕精品| 国产乱淫av麻豆国产免费| a一区二区三区亚洲| 午夜精品一区二区三区电影天堂 | 中文字幕免费一区二区| 欧美r级在线观看| 免费看又黄又无码的网站| 国产小视频免费在线观看| 国模无码大尺度一区二区三区| 欧美国产日韩xxxxx| 受虐m奴xxx在线观看| 99热这里有精品| 欧美一区二区三区不卡| 狠狠爱免费视频| 91精品国产91久久久久久青草| 国产精品入口麻豆九色| 一区二区视频在线播放| 免费观看黄色av| 免费人成网站在线观看欧美高清| 欧美精品videosex牲欧美| 手机毛片在线观看| 99久久www免费| 久久香蕉国产线看观看av| 成年人网站免费看| 日韩中文字幕视频网| 欧美午夜一区二区| 国产最新免费视频| 黄色的视频在线观看| 天天综合天天做天天综合| 福利网在线观看| 国产裸舞福利在线视频合集| 国产精品美女一区二区三区| ijzzijzzij亚洲大全| 国产综合视频一区二区三区免费| 国产mv日韩mv欧美| 黄色一区三区| 性一交一乱一乱一视频| 久久精品国产亚洲a| 国产盗摄xxxx视频xxx69| 中文字幕乱码在线观看| 天堂va蜜桃一区二区三区| 久久全国免费视频| 欧产日产国产v| 亚洲91中文字幕无线码三区| 国产性猛交xxxx免费看久久| 欧美一级片在线视频| 亚洲经典视频在线观看| 欧美精品xxx| 国产一区二区视频网站| 国产一区二区网址| 免费看成人午夜电影| www.久久ai| 亚洲人成7777| 亚洲美女自拍偷拍| 亚洲美女炮图| 欧美性jizz18性欧美| 日韩精品在线播放视频| 久久99国产精一区二区三区| 亚洲精品国产精品乱码不99按摩 | 久久99精品波多结衣一区| 欧美日韩国产成人精品| 美女扒开尿口让男人操亚洲视频网站| 日韩三级免费看| 在线看片成人| 97视频在线看| 国产三级三级在线观看| 国产精品自产自拍| av成人午夜| 蜜桃视频久久一区免费观看入口| 日本一区二区三区视频视频| 亚洲精品欧美精品| 麻豆视频在线观看免费网站| 国产精品成人一区二区三区夜夜夜| 亚洲 国产 欧美一区| 欧美videos另类精品| 午夜婷婷国产麻豆精品| 成人性生交视频免费观看| 欧美专区视频| 日韩中文字幕久久| 青青艹在线观看| 极品少妇xxxx精品少妇| 色女孩综合网| 天天免费亚洲黑人免费| 亚洲精品成人久久| 国产精品成人国产乱| 香蕉久久国产| 国产精品一区二区三区在线| 天堂在线视频网站| 亚洲综合在线视频| 亚洲制服中文字幕| 久久国产精品成人免费观看的软件| 久久天天躁夜夜躁狠狠躁2022| 国产精品欧美综合| 中文字幕欧美激情| 国产女主播av| 秋霞伦理一区| 欧美日韩电影在线播放| 国产精久久一区二区三区| 久久精品欧美一区| 成人欧美一区二区三区黑人孕妇| 国产黄色片免费| 亚洲美女免费在线| 国产午夜福利视频在线观看| 夜色77av精品影院| 美女少妇精品视频| 精品女同一区二区三区| 久久久精品蜜桃| 日本www.色| 豆花视频一区二区| 北条麻妃一区二区三区中文字幕 | 99热免费精品| 国产精品青草久久久久福利99| h片在线免费看| 亚洲精品乱码久久久久久黑人| 女性女同性aⅴ免费观女性恋| 美国一区二区| 欧美另类交人妖| 亚洲伦理在线观看| 天天影视色香欲综合网老头| av在线网站观看| 美日韩一级片在线观看| 中国一级黄色录像| 欧美激情15p| 欧美精品亚州精品| 欧洲av在线播放| 色88888久久久久久影院按摩 | 成人一区二区视频| 亚洲国产精品视频一区| 在线欧美激情| 亚洲**2019国产| 成人精品一区二区三区免费| 亚洲国产美国国产综合一区二区| 黄色手机在线视频| 首页亚洲中字| 国产在线视频2019最新视频| 加勒比一区二区三区在线| 欧美日韩视频在线观看一区二区三区| 午夜激情福利网| 91亚洲男人天堂| www.久久91| 国产日韩欧美一区二区三区在线观看| 91中文字精品一区二区| 国产婷婷视频在线| 欧美日韩国产电影| 国产主播在线观看| 国产精品视频一区二区三区不卡| 亚洲成人激情小说| 欧美1区视频| 欧美连裤袜在线视频| 涩涩网在线视频| 久久精品国产清自在天天线 | 欧美三级午夜理伦三级老人| 外国成人在线视频| 91九色视频在线观看| 日韩一级二级| 8x拔播拔播x8国产精品| 欧美一级特黄aaaaaa大片在线观看| 日韩欧美精品在线观看| 中文字幕影音先锋| 国产精品日韩成人| 波多野结衣av在线观看| 成人动漫中文字幕| 北条麻妃在线视频观看| 91精品国产福利在线观看麻豆| 久久久久久亚洲精品不卡4k岛国| 久久视频免费| 成人xxxxx| 999国产精品亚洲77777| www国产精品com| 九色在线视频蝌蚪| 亚洲精品电影在线| 国产成人无码www免费视频播放| 欧美精品色一区二区三区| 动漫性做爰视频| 国产精品日韩精品欧美在线| 国产在线观看h| 91美女精品福利| 91精品无人成人www| 亚洲一区二区三区四区五区午夜 | 涩涩视频在线播放| 久久久中文字幕| 欧美aaaaaaa| 久久69精品久久久久久国产越南| 免费在线看a| 在线观看日韩av| аⅴ资源新版在线天堂| 国产一区二区三区三区在线观看 | 久久久免费观看| 超碰在线资源| 久久久久国产视频| 男人添女人下部高潮视频在线观看| 久久视频免费在线播放| 免费看a在线观看| 欧美成人免费全部| av免费网站在线| 欧美高清视频在线播放| 麻豆av在线免费观看| 欧美激情极品视频| 成人国产电影在线观看| 亚洲毛片在线看| 99国产精品久久久久久久成人| 欧美精品在线一区二区三区| 97人妻精品一区二区三区动漫| 一区二区三区在线免费视频| 国产极品国产极品| 一区二区三区蜜桃网| xxxx 国产| 欧美日韩性视频| 日本在线一级片| 一区二区三区欧美日韩| 国产精品成人免费一区二区视频| 岛国av午夜精品| 国产99久久久久久免费看| 欧美日韩久久久一区| 国产精品特级毛片一区二区三区| 欧美一区二区免费| 五月婷婷丁香六月| 欧美精品久久一区二区三区| 国产伦理吴梦梦伦理| 日韩精品一区二区三区四区 | 欧美丰满嫩嫩电影| 亚洲第一色视频| 亚洲精品在线视频| 午夜老司机福利| 日韩av在线一区二区| 精品人妻无码一区二区三区蜜桃一 | 成人搞黄视频| 国产在线精品一区免费香蕉| 日韩精品视频中文字幕| 久久国产精品精品国产色婷婷| 国产免费av一区二区三区| 国产伦精品一区二区三区四区视频 | 欧美性生活一区| 亚洲av无码一区二区三区性色 | 欧美黑人欧美精品刺激| 国产精品一二三四| 免费在线观看成年人视频| 国产精品亲子乱子伦xxxx裸| 国产一级视频在线播放| 欧美日韩一区二区在线观看| www.av在线.com| 亚洲天堂第二页| 色资源在线观看| 亚洲精品720p| 免费超碰在线| 欧美亚洲一区在线| 乡村艳史在线观看| 成人午夜在线视频一区| 亚州国产精品| 中文精品无码中文字幕无码专区| 午夜片欧美伦| 国产免费一区二区三区视频| 国产一区二区三区久久悠悠色av| 亚洲av无码成人精品国产| 亚洲欧美日本韩国| 一级黄色在线视频| 精品国产一区二区亚洲人成毛片| 成人黄色免费视频| 在线成人激情视频| av2020不卡| 2020久久国产精品| 成人免费91| 偷拍视频一区二区| 一区二区福利| 日韩成人av影院| 自拍视频在线观看一区二区| 免费高清在线观看电视| 色视频欧美一区二区三区| 国产77777| 欧美国产视频日韩| 国产一区 二区| 在线观看欧美一区| 免费av成人在线| 午夜时刻免费入口| 欧美三级xxx| 婷婷综合激情网| 久久频这里精品99香蕉| 91精品啪在线观看国产手机| 精品国产免费一区二区三区| 亚洲人metart人体| 奇米视频7777| 波多野结衣中文字幕一区| 麻豆亚洲av成人无码久久精品| 亚洲成人激情综合网| www五月婷婷| 欧美美女操人视频| 一区二区三区国产好| 神马午夜伦理影院| 国产精品一区二区x88av| 九九精品视频免费| 8v天堂国产在线一区二区| 黄色av小说在线观看| 欧美日韩福利在线观看| 试看120秒一区二区三区| 国产成人在线小视频| 粉嫩一区二区三区在线看| 久久网中文字幕| 色先锋资源久久综合| 国产精品高潮呻吟久久久| 日韩小视频在线| **国产精品| 黄色特一级视频| 久久中文精品| 丰满少妇高潮一区二区| 在线观看中文字幕不卡| 亚洲精品视频专区| 久久久久久中文字幕| 人人香蕉久久| 国产一级不卡毛片| 综合在线观看色| 性一交一乱一色一视频麻豆| 久久久久久国产精品| 色愁久久久久久| 男女污污的视频| 亚洲免费观看高清完整| 国产1区在线观看| 国产成人免费av| 亚洲精品在线观看91| 人妻av一区二区| 亚洲精品老司机| 天天躁日日躁狠狠躁伊人| 国产精品高清网站| 欧美一区综合| 动漫精品一区二区三区| 欧美精品在线观看播放| av在线理伦电影| 亚洲精品在线观看免费| 成人免费视频caoporn| 精品国产乱子伦| 久久天天躁夜夜躁狠狠躁2022| 女同久久另类99精品国产| 男人插女人下面免费视频| 亚洲视频在线一区| 亚洲av成人无码网天堂| 国产欧美日韩丝袜精品一区| 国一区二区在线观看| 三级网站免费看| 色综合一区二区| av片在线观看网站| 欧美精品与人动性物交免费看| 国产一区二区福利视频| 国产成人精品777777| 色综合久久久久久中文网| 精品国产精品国产偷麻豆| 大j8黑人w巨大888a片| 国产精品久久久久毛片软件|