微前端的技術(shù)拆分方式

1.路由分發(fā)式旁仿。通過HTTP服務(wù)器的反向代理功能,將請求路由到對應(yīng)的應(yīng)用上

路由分發(fā)式微前端,即通過路由將不同的業(yè)務(wù)分發(fā)到不同的獨立前端應(yīng)用上锯厢,每當(dāng)用戶從A應(yīng)用轉(zhuǎn)換到B應(yīng)用的時候皮官,往往需要刷新一下頁面、重新加載資源文件

2.前端容器化实辑。將iframe作為容器來容納其他前端應(yīng)用

3.微應(yīng)用捺氢。通過軟件工程的方式,在部署構(gòu)建環(huán)境中剪撬,把多個獨立的應(yīng)用組合成一個單體應(yīng)用

微應(yīng)用化是指摄乒,在開發(fā)時應(yīng)用都是以單一、微小應(yīng)用的形式存在的残黑,而在運行時則通過構(gòu)建系統(tǒng)合并這些應(yīng)用馍佑,組合成一個新的應(yīng)用

微應(yīng)用化與前端微服務(wù)化架構(gòu)類似,他們在開發(fā)時都是獨立應(yīng)用梨水,在構(gòu)建時又可以按照需求單獨加載

如果以微前端的單獨開發(fā)挤茄、單獨部署、運行時聚合的基本思想來看冰木,微應(yīng)用化就是微前端的一種實踐穷劈。只是使用微應(yīng)用化意味著我們只能使用唯一的一種前端框架

除了限制開發(fā)人員使用同一個框架,它還有一些缺點:

所有應(yīng)用的依賴需要統(tǒng)一踊沸,一旦依賴版本不一致歇终,可能會帶來其他問題

高度依賴于持續(xù)集成,每個子應(yīng)用在提交的時候逼龟,都會重新構(gòu)建出整個應(yīng)用评凝,一旦一個子應(yīng)用出錯,系統(tǒng)就會出錯

微應(yīng)用化的形式是腺律,在構(gòu)建時以單體應(yīng)用的形式構(gòu)建奕短;在運行時,以應(yīng)用模塊的形式存在匀钧。從原理上說翎碑,我們做的只是從多個項目中復(fù)制出代碼,然后合并到一個項目中

microapps

? app-routing.module.ts

? reports.module.ts

? ...

dashboard

? dashboard.module.ts

? ...

reports

? reports.module.ts

? ...

settings

? settings.module.ts

? ...

除了主的app模塊之斯,還包含了dashboard日杈、settings、reports三個模塊佑刷。在微應(yīng)用化里莉擒,上述應(yīng)用便是最后構(gòu)建過程中的應(yīng)用。在構(gòu)建之前這些模塊是以獨立App的形式存在的瘫絮,可以獨立的開發(fā)運行涨冀。而主的App模塊下的功能,則可以變成主工程麦萤。這時鹿鳖,一共會有四個代碼倉庫

主代碼庫扁眯,只包含一個空白的框架式代碼,它是一個單獨的應(yīng)用栓辜,可以獨立構(gòu)建,構(gòu)建完成則成為包含另外三個應(yīng)用的完整工程

dashboard應(yīng)用垛孔,在構(gòu)建時復(fù)制對應(yīng)模塊藕甩、目錄的代碼到主工程

4.前端微服務(wù)化。在不同的框架之上設(shè)計通信和加載機(jī)制周荐,以在一個頁面內(nèi)加載對應(yīng)的應(yīng)用

每個前端應(yīng)用都是完全獨立(技術(shù)棧狭莱、開發(fā)、部署概作、構(gòu)建獨立)

采用這種方式意味著腋妙,一個頁面上同時存在兩個及以上的前端應(yīng)用在運行

在加載應(yīng)用時的事件綁定及應(yīng)用入口

在卸載應(yīng)用時的事件解綁

目前都采用基座化的方式來加載其他應(yīng)用,基座化方式可以支持加載不同的前端框架讯榕,以及在基座工程上綁定業(yè)務(wù)邏輯

整體的工作流程:

主工程在運行的時候骤素,會去服務(wù)器獲取最新的應(yīng)用配置

主工程在獲取配置后,將逐一創(chuàng)建應(yīng)用愚屁,并為應(yīng)用綁定生命周期

當(dāng)主工程監(jiān)測到路由變化的時候济竹,將尋找是否有對應(yīng)的路由匹配到應(yīng)用

當(dāng)匹配到對應(yīng)的應(yīng)用時,則加載相應(yīng)的應(yīng)用

基座包含以下功能:

管理其他子應(yīng)用

負(fù)責(zé)應(yīng)用間的通信

設(shè)計路由的響應(yīng)機(jī)制

支持嵌入常規(guī)及iframe模式

Single-SPA自稱是一個JavaScript的原框架霎槐,他可以用于構(gòu)建可共存的微前端應(yīng)用送浊,每個前端應(yīng)用都可以用自己的框架編寫。它能實現(xiàn)如下內(nèi)容:

在同一頁面上使用多個框架而不用刷新頁面

使用新的框架編寫前端代碼丘跌,而無需重寫現(xiàn)有的應(yīng)用程序

延時加載前端應(yīng)用和代碼袭景,用于改善初始加載時間

缺點:

系統(tǒng)構(gòu)建復(fù)雜,應(yīng)用需要集成在一起進(jìn)行構(gòu)建

不支持不同應(yīng)用的部署分離

代碼結(jié)構(gòu)復(fù)雜

有額外的大量學(xué)習(xí)成本

5.微件化闭树。開發(fā)一個新的構(gòu)建系統(tǒng)耸棒,將部分業(yè)務(wù)功能構(gòu)建成一個獨立的chunk代碼,使用時只需要遠(yuǎn)程加載即可

每個業(yè)務(wù)團(tuán)隊編寫自己的業(yè)務(wù)代碼报辱,并將編譯好的代碼部署(上傳或者放置)到指定的服務(wù)器榆纽。在運行時,我們只需要加載相應(yīng)的業(yè)務(wù)模塊即可

如果存在第三方開發(fā)組件捏肢,就不得不考慮尋找如iframe這樣的隔離方案奈籽。微件化并不適合復(fù)雜的前端應(yīng)用。

對于傳統(tǒng)的多頁面應(yīng)用來說鸵赫,微件化是相當(dāng)容易實施的方案衣屏。在傳統(tǒng)的多頁面應(yīng)用結(jié)構(gòu)中,只需要編寫相應(yīng)的HTML辩棒、CSS狼忱、JavaScript膨疏,就可以在加載微件時創(chuàng)建相應(yīng)的組建和元素,再替換到相應(yīng)的DOM結(jié)點上钻弄,這種方式類似于WebComponents

6.應(yīng)用組件化佃却。借助于Web Components技術(shù),來構(gòu)建框架的前端應(yīng)用

對于不能從頭使用Web Components窘俺,有兩種方式可以結(jié)合Web Components來構(gòu)建微前端應(yīng)用

使用Web Components構(gòu)建獨立于框架的組件饲帅,并在對應(yīng)的框架中引入這些組件

在Web Components中引入現(xiàn)有的框架,類似于iframe的形式

方式 開發(fā)成本 維護(hù)成本 可行性 同一框架要求 實現(xiàn)難度 潛在風(fēng)險

路由分發(fā) 低 低 高 否 *

iframe 低 低 高 否 *

微服務(wù)化 高 低 中 否 **** 針對每個框架做定制及Hook

微件化 高 中 低 是 **** 正對構(gòu)建系統(tǒng)瘤泪,如webpack進(jìn)行hack

微應(yīng)用化 中 中 高 是 *** 統(tǒng)一不同應(yīng)用的構(gòu)建規(guī)范

WebComponents 高 低 高 否 ** 新技術(shù)灶泵,瀏覽器的兼容問題

js 隔離

一個子應(yīng)用從加載到運行,再到卸載对途,有可能會對全局產(chǎn)生一些污染赦邻。這些污染包括但不限于:添加、刪除实檀、修改全局變量(比如:window.$ = jQuery)惶洲、綁定全局事件(比如:window.addEventListener、修改原生方法或?qū)ο螅ū热纾篜romise)膳犹、修改原生方法或?qū)ο蟮脑玩湥ū热纾篨MLHttpRequest.prototype.open)湃鹊。而所有這些子應(yīng)用造成的影響都可能引起潛在的全局沖突。為此镣奋,我們需要在加載和卸載一個應(yīng)用的同時币呵,盡可能消除這種影響

硬隔離

簡單來說,就是在每個子應(yīng)用加載之前侨颈,都進(jìn)行一次 reload余赢,這樣可以保證每個子應(yīng)用在渲染時都是一個全新的環(huán)境,哪怕是上一個子應(yīng)用把 window 上的屬性改了個遍哈垢,也絲毫沒有影響

css 隔離

子應(yīng)用與子應(yīng)用之間的 css 隔離非常簡單妻柒,我們只需要在子應(yīng)用加載時,標(biāo)記該子應(yīng)用所有的 link 和 style 文件耘分。在子應(yīng)用卸載后举塔,同步卸載所有的 link 和 style 即可

子項目原本需要加載的公共部分(如vue、vuex求泰、vue-router央渣、ivew/element、私有npm包等)渴频,全部由主項目調(diào)度芽丹,配合webpack的externals功能通過外鏈的方式按需加載,一旦有一個子項目加載過卜朗,下一個子項目就不需要再加載拔第,這樣一來每個子項目的dist文件里就只有子項目自己的業(yè)務(wù)代碼(最終子項目包的體積縮小了80%咕村,只有幾十k),項目實際加載速度快了很多

umijs/qiankun

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚊俺,一起剝皮案震驚了整個濱河市懈涛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泳猬,老刑警劉巖批钠,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暂殖,居然都是意外死亡价匠,警方通過查閱死者的電腦和手機(jī)当纱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門呛每,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坡氯,你說我怎么就攤上這事晨横。” “怎么了箫柳?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵手形,是天一觀的道長。 經(jīng)常有香客問我悯恍,道長库糠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任涮毫,我火速辦了婚禮瞬欧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罢防。我一直安慰自己艘虎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布咒吐。 她就那樣靜靜地躺著野建,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恬叹。 梳的紋絲不亂的頭發(fā)上候生,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音绽昼,去河邊找鬼陶舞。 笑死,一個胖子當(dāng)著我的面吹牛绪励,可吹牛的內(nèi)容都是我干的肿孵。 我是一名探鬼主播唠粥,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼停做!你這毒婦竟也來了晤愧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蛉腌,失蹤者是張志新(化名)和其女友劉穎官份,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙丛,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡舅巷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了河咽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钠右。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忘蟹,靈堂內(nèi)的尸體忽然破棺而出飒房,到底是詐尸還是另有隱情,我是刑警寧澤媚值,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布狠毯,位于F島的核電站,受9級特大地震影響褥芒,放射性物質(zhì)發(fā)生泄漏嚼松。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一锰扶、第九天 我趴在偏房一處隱蔽的房頂上張望献酗。 院中可真熱鬧,春花似錦少辣、人聲如沸凌摄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锨亏。三九已至,卻和暖如春忙干,著一層夾襖步出監(jiān)牢的瞬間器予,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淑玫。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓危纫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橄唬。 傳聞我的和親對象是個殘疾皇子赎瞎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容