淺析了解實現微前端的3種模式(自組織Nginx路由分發、基座容器模式、模塊加載模式)、webpack5 Module Federation(模塊聯邦)是什么、基於模塊聯邦實現微前端的方案學習


一、什么是微前端?

  微前端將微服務理念擴展到前端開發,一般來講一個微服務架構中會有多個后端團隊開發不同的業務服務,而前端通常只有一個團隊,集中維護一個 SPA 單頁應用,隨着時間累加,前端團隊維護的 SPA 會隨着業務增長越來越大,變得難以維護(項目啟動耗時、CI\CD 耗時等);

  微前端可以幫助我們像后端一樣將 SPA 應用按照業務拆分為多個可獨立維護部署的應用,這樣一方面我們可以實現,哪個業務改變就近更新哪個業務的前端;又可以幫助搭建從前端到后端單一業務領域的團隊。

  可以理解為微前端是一種將多個可獨立交付的小型前端應用聚合為一個整體的架構風格。

  那么什么樣的產品適合微前端呢:(1)大型前端項目;(2)多個項目間跨應用模塊共享;(3)有拆分出多個獨立的子系統,獨立部署維護的需求。

  實現微前端落地方案常見的有以下三種形式:(1)自組織模式 - 主要通過 Nginx 路由分發;(2)容器模式 - 主要通過 qiankun 模式;(3)模塊加載模式 - 這一塊不太懂,所以需要研究一下。

  微前端現有的落地方案可以分為三類:自組織模式、基座容器模式以及模塊加載模式。

與基座模式相比,模塊加載模式沒有中心容器,這就意味着,我們可以將任意一個微應用當作項目入口,整個項目的微應用與微應用之間相互串聯,打破項目的固定加載模式,徹底釋放項目的靈活機動性,這樣的模式,也被稱為去中心化模式。

  其實這個方案在微前端的架構理念中早已提及,但直到 2020 年 10 月 Webpack 5 正式發布之后才被真正落地應用。因為 Webpack 5 帶來了一個全新特性:Module Federation,這是我們使用模塊加載模式實現微前端架構的核心特性。

二、webpack5 模塊聯邦 module Federation 介紹

  webpack5 新增 Module Federation(模塊聯邦)功能,他可以幫助將多個獨立的構建組成一個應用程序,不同的構建可以獨立的開發與部署。借助模塊聯邦我們可以一定程度的實現微前端

  在官方文檔中,關於 Module Federation 的動機中,有這樣一段介紹:

多個獨立的構建可以組成一個應用程序,這些獨立的構建之間不應該存在依賴關系,因此可以單獨開發和部署它們。

  這通常被稱作微前端,但並不僅限於此。

  Module Federation 中文直譯為“模塊聯邦”,為了方便我們這里簡稱為 mf。如果你去 Webpack 官方文檔中查看,最多可以從前面的“動機”中看到模糊的解釋,而對於“模塊聯邦”准確的定義,其實並沒有給出。

  但是,根據 “動機”的描述,不難看出,mf 實際想要做的事,便是把多個無相互依賴、單獨部署的應用合並為一個。通俗點講,mf 提供了能在當前應用中加載其他應用的能力。所以,在 mf 中,如果一個模塊想要載入其他模塊,就需要一個“引入”的動作;同樣如果想讓其他模塊使用,就需要一個“導出”的動作。

  對此,可以引出下面兩個概念。

  • expose:導出應用,被其他應用導入。

  • remote:引入其他應用。

一個模塊既可以導出給其他模塊使用,又可以導入一個其他模塊,這與“基座模式”完全不同。要知道,無論是 single-spa 還是 qiankun,加載不同模塊,都需要有一個容器中心來承載;而在 mf 中,沒有且也不需要容器中心。

  鑒於 mf 的能力,我們完全可以實現一個去中心化的應用部署群:多個微應用單獨部署在各自的服務器中,而每個微應用都可以引用其他應用,也能被其他應用導入使用,即每個應用都可以導出又導入,也就沒有了容器中心的概念。

三、Module Federation 如何使用

1、模塊聯邦能干什么?

  模塊聯邦提供了可以在當前應用中遠程加載其他服務器上應用的能力,使用 module Federation 可以實現一個去中心化的應用部署群,每個應用都單獨部署,每個應用都可以引用其他應用,也能被其他應用所引用(js 級別)

  借助第三方工具可實現跨技術棧開發 (react + vue 2)

  可以用來實現前端項目平滑迭代(舊項目是一個應用,新項目是一個應用,兩者之間通過遠程連接,這樣我們可以逐漸豐富 新項目來替換舊項目的內容)

  又可以幫助搭建從前端到后端單一業務領域的團隊

2、什么是本地模塊與遠程模塊,什么是 host \ remote?

  host:消費其他 remote 的 webpack 構建(即使用遠程模塊的應用)

  remote: 被 host 消費的 webpack 構建(即提供可用的模塊給其他應用使用)

  host 與 remote 是相對的,一個應用既可以是 host 有可以是 remote,因此 模塊聯邦實現的微前端又是去中心化的

  本地模塊即為我們本地開發時當前項目內的模塊

  遠程模塊不屬於當前構建,它是在運行時被加載進來的 remote 應用提供的模塊

3、模塊聯邦的負面影響

  運行時加載遠程模塊等邏輯,可能導致一定的性能問題

  本地開發需要開啟多個端口的服務,比較麻煩

  按需加載第三方依賴比較難實現

  比起傳統 spa 項目結構上有些復雜

  迭代時的版本控制需要更多關注

4、此外還會有一些疑難雜症需要解決,具體可以看這篇文章:《webpack 5 模塊聯邦實現微前端疑難問題解決 - https://blog.csdn.net/mjzhang1993/article/details/115871597》

5、關於具體如何使用,可以看這篇文章:《如何使用webpack5的模塊聯邦特性落地微前端 - https://blog.csdn.net/tc1124692/article/details/120413803》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM