0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

微前端父子應(yīng)用及兄弟應(yīng)用間組件或方法共享方案

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-24 14:44 ? 次閱讀

背景

我們的很多web應(yīng)用在持續(xù)迭代中功能越來越復(fù)雜,參與的人員、團隊不斷增多,導(dǎo)致項目出現(xiàn)難以維護的問題,這種情況PC端尤其常見,微前端為我們提供了一種高效管理復(fù)雜應(yīng)用的方案。但是在使用微前端的過程中,通常會有一些公共方法或公共組件,本文將對如何實現(xiàn)父子應(yīng)用以及兄弟應(yīng)用之間進行方法及組件共享提出幾種解決方案以及其各自優(yōu)缺點及適用場景

模塊聯(lián)邦(Module Federation)

webpack5引入了模塊聯(lián)邦,可以讓不同的應(yīng)用共享模塊。具體步驟如下:

Remote(提供者模塊)

    // webpack.config.js
    module.exports = {
        // 其他配置...
        plugins: [
            new ModuleFederationPlugin({
            name: 'component_app',
            filename: 'remoteEntry.js',
            exposes: {
                './Button': './src/Button.jsx',
                './Dialog': './src/Dialog.jsx',
                './Logo': './src/Logo.jsx',
                './ToolTip': './src/ToolTip.jsx',
            },
            shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
            }),
        ],
    };

作為提供方,component 將自己的 Button、Dialog等組件暴露出去,同時將 react 和 react-dom 這兩個依賴共享出去。

host(使用者模塊)

    // webpack.config.js
    module.exports = {
        entry: './index.js',
        // ...
        plugins: [
            new ModuleFederationPlugin({
            name: 'main_app',
            //遠程訪問地址入口 
            remotes: {
                'component-app': 'component_app@http://www.ttokpm.com/images/chaijie_default.png/remoteEntry.js',
            },
            shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
            })
        ],
    };

作為消費者的 main 應(yīng)用需要定義需要消費的應(yīng)用的名稱以及地址,同時 main 應(yīng)用也將自己的 react 和 react-dom 這兩個依賴共享出去。

通過以上方式可以實現(xiàn)不同應(yīng)用之間共享公共方法和組件,雖然vite本身不支持模塊聯(lián)邦,但是我們可以使用vite-plugin-federation這個插件。
優(yōu)點

代碼共享:不同的微應(yīng)用可以共享相同的依賴庫,減少重復(fù)下載和加載,提高性能。

獨立部署:各個微應(yīng)用可以獨立開發(fā)、測試和部署,減少了團隊之間的耦合,提高了開發(fā)效率。

動態(tài)加載:可以在運行時動態(tài)加載模塊,按需加載,減少初始加載時間。

版本控制:支持不同版本的模塊共存,解決了版本沖突的問題。

團隊協(xié)作:各個團隊可以獨立開發(fā)自己的模塊,減少了對中央倉庫的依賴,提高了協(xié)作效率。

缺點

對于webpack5以下的應(yīng)用不支持

復(fù)雜性增加:配置和管理模塊聯(lián)邦需要一定的學(xué)習(xí)成本和經(jīng)驗,增加了項目的復(fù)雜性。

調(diào)試?yán)щy:由于模塊是動態(tài)加載的,調(diào)試和追蹤問題可能會變得更加困難。

性能開銷:雖然減少了初始加載時間,但動態(tài)加載模塊可能會在運行時引入額外的性能開銷。

依賴管理:需要仔細管理共享依賴的版本,避免潛在的兼容性問題。

安全性:動態(tài)加載外部模塊可能會引入安全風(fēng)險,需要額外的安全措施來防止惡意代碼注入。

NPM包

將共享組件打包成一個 NPM 包,然后在父子應(yīng)用中分別安裝和使用。

創(chuàng)建共享組件/方法庫

import React from 'react';
const SharedComponent = () => 

Shared Component

; export default SharedComponent;

發(fā)布到NPM

npm publish

在父應(yīng)用和子應(yīng)用中安裝

npm install shared-component-library

在應(yīng)用中使用

 import SharedComponent from 'shared-component-library';

 function App() {
 return ;
 }

 export default App;

優(yōu)點
1. 模塊化管理:通過npm包管理公共組件,可以實現(xiàn)模塊化開發(fā),便于維護和更新。
2. 版本控制:npm包自帶版本控制功能,可以方便地進行版本管理,確保不同微應(yīng)用使用兼容的組件版本。
3. 依賴管理:npm包可以自動管理依賴關(guān)系,減少手動處理依賴的復(fù)雜性。
4. 復(fù)用性高:公共組件封裝成npm包后,可以在多個微應(yīng)用中復(fù)用,減少重復(fù)開發(fā),提高開發(fā)效率。
5. 社區(qū)支持:npm生態(tài)系統(tǒng)龐大,很多問題可以通過社區(qū)資源解決,減少開發(fā)難度。

缺點
1. 發(fā)布和更新成本:每次更新公共組件都需要重新發(fā)布npm包,并在各個微應(yīng)用中更新依賴,增加了一定的工作量。
2. 版本兼容性問題:不同微應(yīng)用可能對同一組件有不同的版本需求,處理版本兼容性問題可能會比較復(fù)雜。
3. 性能開銷:由于npm包需要通過網(wǎng)絡(luò)下載和安裝,可能會增加構(gòu)建時間和初始加載時間。
4. 調(diào)試復(fù)雜性:npm包作為獨立模塊,調(diào)試時可能需要額外的配置和步驟,增加了調(diào)試的復(fù)雜性。
5. 安全性問題:使用第三方npm包時,需要注意其安全性,防止引入潛在的安全漏洞。

使用 CDN

將共享組件打包并上傳到 CDN,然后在父子應(yīng)用中通過 URL 引入。

打包共享組件:

npm run build

上傳到 CDN。

在應(yīng)用中引入:


// 假設(shè)共享組件暴露為全局變量 SharedComponent
function App() {
  return ;
}
export default App;

優(yōu)點

性能提升:

快速加載:CDN 服務(wù)器分布在全球各地,用戶可以從最近的服務(wù)器獲取資源,從而減少加載時間。

緩存機制:CDN 提供了強大的緩存機制,可以減少服務(wù)器的負載,提高響應(yīng)速度。

帶寬優(yōu)化:

減輕服務(wù)器壓力:通過將靜態(tài)資源托管在 CDN 上,可以減輕原始服務(wù)器的帶寬壓力。

分布式傳輸:CDN 可以將流量分散到多個節(jié)點,避免單點瓶頸。

高可用性:

冗余備份:CDN 通常有多個備份節(jié)點,即使某個節(jié)點出現(xiàn)故障,其他節(jié)點也能繼續(xù)提供服務(wù)。

自動故障切換:CDN 能夠自動檢測并切換到可用的節(jié)點,確保服務(wù)的連續(xù)性。

版本管理:

統(tǒng)一管理:通過 CDN 可以統(tǒng)一管理公共組件的版本,確保所有微應(yīng)用使用相同的組件版本,減少兼容性問題。

缺點

安全性問題:依賴第三方:使用第三方 CDN 服務(wù)可能會帶來安全隱患,特別是如果 CDN 提供商遭到攻擊或出現(xiàn)故障。

緩存一致性:

緩存更新延遲:CDN 的緩存機制可能導(dǎo)致更新的資源不能及時傳播到所有節(jié)點,造成版本不一致的問題。

緩存失效:需要手動管理緩存失效策略,否則可能會導(dǎo)致舊版本資源被長期緩存。

依賴性:

網(wǎng)絡(luò)依賴:如果用戶的網(wǎng)絡(luò)環(huán)境較差,可能會影響到通過 CDN 獲取資源的速度和穩(wěn)定性。

服務(wù)依賴:過度依賴 CDN 可能會導(dǎo)致在 CDN 服務(wù)出現(xiàn)問題時,整個應(yīng)用的可用性受到影響。

使用 iframe

如果組件之間的交互較少,可以考慮使用 iframe 嵌入子應(yīng)用。
在父應(yīng)用中嵌入 iframe:


優(yōu)點

隔離性強:iframe 提供了一個獨立的瀏覽上下文,能夠有效隔離不同微應(yīng)用之間的樣式和腳本,避免相互干擾。

安全性高:由于 iframe 的隔離特性,能夠防止跨站腳本攻擊(XSS)和其他安全問題。

兼容性好:iframe 是瀏覽器原生支持的技術(shù),兼容性較好,能夠在大多數(shù)現(xiàn)代瀏覽器中正常工作。

獨立部署:各個微應(yīng)用可以獨立部署和更新,不需要擔(dān)心對其他應(yīng)用的影響。

缺點

性能問題:iframe 會增加頁面的加載時間和內(nèi)存消耗,尤其是在嵌套多個 iframe 的情況下。

通信復(fù)雜:iframe 與父頁面之間的通信需要通過 postMessage 等機制實現(xiàn),增加了開發(fā)的復(fù)雜性。

SEO 不友好:搜索引擎對 iframe 內(nèi)容的抓取和索引支持較差,可能影響 SEO 效果。

樣式和布局問題:iframe 的內(nèi)容與父頁面的樣式和布局是獨立的,可能需要額外的工作來確保一致性。

調(diào)試?yán)щy:iframe 內(nèi)部的調(diào)試相對復(fù)雜,尤其是在跨域的情況下,調(diào)試工具的使用會受到限制。

總結(jié)

不同的方案有各自的特點,需要根據(jù)具體的應(yīng)用場景和需求進行權(quán)衡。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1253

    瀏覽量

    69057
  • 前端
    +關(guān)注

    關(guān)注

    1

    文章

    184

    瀏覽量

    17689
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    495

    瀏覽量

    17731
收藏 人收藏

    評論

    相關(guān)推薦

    AFE5803高度集成的模擬前端(AFE)解決方案

    電子發(fā)燒友網(wǎng)站提供《AFE5803高度集成的模擬前端(AFE)解決方案.pdf》資料免費下載
    發(fā)表于 07-31 11:16 ?1次下載
    AFE5803高度集成的模擬<b class='flag-5'>前端</b>(AFE)解決<b class='flag-5'>方案</b>

    ble mesh的node角色與wifi STA模式無法共存怎么解決?

    ble mesh 的node角色與wifi STA模式無法共
    發(fā)表于 06-25 07:46

    鴻蒙OS開發(fā)實例:【應(yīng)用狀態(tài)變量共享

    平時在開發(fā)的過程中,我們會在應(yīng)用中共享數(shù)據(jù),在不同的頁面共享信息。雖然常用的共享信息,也可以通過不同頁面中組件
    的頭像 發(fā)表于 04-03 15:09 ?1080次閱讀
    鴻蒙OS開發(fā)實例:【應(yīng)用狀態(tài)變量<b class='flag-5'>共享</b>】

    鴻蒙OS開發(fā)實例:【工具類封裝-emitter組件通信】

    `MyEmitterUtil` 是一個針對 HarmonyOS 的事件驅(qū)動編程封裝類,主要用于組件的通信和數(shù)據(jù)傳遞。
    的頭像 發(fā)表于 03-27 22:13 ?483次閱讀

    鴻蒙開發(fā)學(xué)習(xí):【ets_frontend組件

    ets_frontend組件采用命令行交互方式,支持將JavaScript代碼轉(zhuǎn)換為方舟字節(jié)碼文件,使其能夠在方舟運行時上運行。支持Windows/Linux/MacOS平臺。方舟前端工具在linux平臺上可通過全量編譯指定編
    的頭像 發(fā)表于 03-10 19:58 ?213次閱讀
    鴻蒙開發(fā)學(xué)習(xí):【ets_frontend<b class='flag-5'>組件</b>】

    OpenHarmony父子組件單項同步使用:@Prop裝飾器

    @Prop裝飾的變量可以和父組件建立單向的同步關(guān)系。@Prop裝飾的變量是可變的,但是變化不會同步回其父組件。 說明: 從API version 9開始,該裝飾器支持在ArkTS卡片中使用。 概述
    的頭像 發(fā)表于 02-03 10:57 ?328次閱讀
    OpenHarmony<b class='flag-5'>父子</b><b class='flag-5'>組件</b>單項同步使用:@Prop裝飾器

    GNSS模塊引領(lǐng)共享出行新紀(jì)元:創(chuàng)新公司的技術(shù)創(chuàng)新之路

    共享出行服務(wù)正在成為城市交通中不可或缺的一環(huán),而全球?qū)Ш叫l(wèi)星系統(tǒng)(GNSS)模塊的應(yīng)用為這一領(lǐng)域注入了新的活力。創(chuàng)新公司通過其先進的GNSS技術(shù),為共享出行服務(wù)提供了更智能、高效的解決方案
    的頭像 發(fā)表于 01-24 18:14 ?686次閱讀

    基于陶瓷基板的系統(tǒng)T/R組件的焊接技術(shù)研究

    摘 要:陶瓷基板系統(tǒng) T/R 組件具有體積小、密度高、輕量化等特點,正在逐步取代傳統(tǒng)組裝磚式 T/R 組件。在系統(tǒng)封裝新技術(shù)路線的引領(lǐng)
    的頭像 發(fā)表于 01-07 11:24 ?1395次閱讀
    基于陶瓷基板的<b class='flag-5'>微</b>系統(tǒng)T/R<b class='flag-5'>組件</b>的焊接技術(shù)研究

    VISA共享組件怎么安裝

    VISA(Virtual Instrument Software Architecture)是一種通用的工業(yè)標(biāo)準(zhǔn),用于實現(xiàn)儀器的通信和控制。在實驗室和工業(yè)界中廣泛使用的VISA共享組件,能夠幫助
    的頭像 發(fā)表于 01-04 14:33 ?1031次閱讀

    如何實現(xiàn)一套linux進程通信的機制

    我們知道linux的進程的通信的組件有管道,消息隊列,socket, 信號量,共享內(nèi)存等。但是我們?nèi)绻约簩崿F(xiàn)一套進程通信的機制的話,要怎么做?了解android 開發(fā)的可能會知道
    的頭像 發(fā)表于 11-10 14:56 ?546次閱讀
    如何實現(xiàn)一套linux進程<b class='flag-5'>間</b>通信的機制

    進程通信方式總結(jié)

    進程通信(IPC): 進程通信的方式有很多,這里主要講到進程通信的六種方式,分別為:管道、FIFO、消息隊列、共享內(nèi)存、信號、信號量。 一、管道 管道的特點: 是一種半雙工的通信
    的頭像 發(fā)表于 11-09 09:25 ?615次閱讀
    進程<b class='flag-5'>間</b>通信方式總結(jié)

    慣性流控器件的制造方法

    在被動流控方法中,慣性流控因具有簡單、易于制造和高通量的特性而被認為是一種良好的過濾和分離方法。
    的頭像 發(fā)表于 11-02 09:09 ?454次閱讀
    慣性<b class='flag-5'>微</b>流控器件的<b class='flag-5'>微</b>制造<b class='flag-5'>方法</b>

    編程界的“兄弟”!前端和后端的區(qū)別是什么?

    前端,顧名思義,就是網(wǎng)站前頭的那塊。說得明白點,它負責(zé)讓用戶眼睛過得癮的部分,比如頁面布局、色彩搭配、文字排版,還有各種動畫效果。這些視覺盛宴,都是由瀏覽器演繹出來的。 前端就是網(wǎng)站的“美容師
    的頭像 發(fā)表于 10-12 16:10 ?449次閱讀

    常見的進程通信方式

    關(guān)系的進程間使用。進程的親緣關(guān)系,通常指父子進程關(guān)系。 有名管道: 有名管道也是,半雙工的通信方式,但是它允許無親緣關(guān)系進程的通信。 消息隊列:消息隊列是有消息的鏈表,存放在內(nèi)核中,并由消息隊列標(biāo)識符標(biāo)識。它克
    的頭像 發(fā)表于 10-08 15:48 ?1177次閱讀
    常見的進程<b class='flag-5'>間</b>通信方式

    【中秋國慶不斷更】OpenHarmony父子組件雙項同步使用:@Link裝飾器

    的數(shù)據(jù)源共享相同的值。 裝飾器使用規(guī)則說明 @Link變量裝飾器 說明 裝飾器參數(shù) 無 同步類型 雙向同步。父組件中@State, @StorageLink和@Link 和子組件@Link可以建立雙向數(shù)據(jù)
    發(fā)表于 09-27 16:17