Module Federation原理剖析

2022-07-09 10:48:13 字數 2603 閱讀 3901

【**團隊掘金原文:

為什麼需要學習webpack5 module federation原理呢?因為emp微前端方案正是基於該革命性功能進行的,具有歷史突破意義。通過本文,可以讓你深入學習webpack5 module federation原理,掌握emp微前端方案的底層基石,更好使用和應用emp微前端方案。

最近webpack5正式發布,其中推出了乙個非常令人激動的新功能,即今日的主角——module federation(以下簡稱為mf),下面將通過三個方面(what,how,where)來跟大家一起探索這個功能的奧秘。

module federation中文直譯為「模組聯邦」,而在webpack官方文件中,其實並未給出其真正含義,但給出了使用該功能的motivation, 即動機,原文如下

this is often known as micro-frontends, but is not limited to that.

翻譯成中文即

多個獨立的構建可以形成乙個應用程式。這些獨立的構建不會相互依賴,因此可以單獨開發和部署它們。

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

結合以上,不難看出,mf實際想要做的事,便是把多個無相互依賴、單獨部署的應用合併為乙個。通俗點講,即mf提供了能在當前應用中遠端載入其他伺服器上應用的能力。對此,可以引出下面兩個概念:

鑑於mf的能力,我們可以完全實現乙個去中心化的應用部署群:每個應用是單獨部署在各自的伺服器,每個應用都可以引用其他應用,也能被其他應用所引用,即每個應用可以充當host的角色,亦可以作為remote出現,無中心應用的概念。 

配置示例:

const htmlwebpackplugin = require("html-webpack-plugin");

const modulefederationplugin = require("webpack/lib/container/modulefederationplugin");

module.exports =,

filename: 'emp.js',

remotes: ,

shared: ["react", "react-dom","react-router-dom"]

})]}

通過以上配置,我們對mf有了乙個初步的認識,即如果要使用mf,需要配置好幾個重要的屬性:

欄位名型別

含義name

string

必傳值,即輸出的模組名,被遠端引用時路徑為$/$

library

object

宣告全域性變數的方式,name為umd的name

filename

string

構建輸出的檔名

remotes

object

遠端引用的應用名及其別名的對映,使用時以key值作為name

exposes

object

被遠端引用時可暴露的資源路徑及其別名

shared

object

與其他應用之間可以共享的第三方依賴,使你的**中不用重複載入同乙份依賴

讓我們看看構建後的**:

var modulemap =; });

},};var get = function

(module, getscope) )

);__webpack_require__.r =undefined;

return

getscope;

};var init = function

(sharescope, initscope)

可以看到,**中包括三個部分:

再看modulemap,返回對應元件前,先通過__webpack_require__.e載入了其對應的依賴,讓我們看看__webpack_require__.e做了什麼:

__webpack_require__.f ={};

//this file contains only the entry chunk.

//the chunk loading function for additional chunks

__webpack_require__.e = function

(chunkid) , ));

};__webpack_require__.f.consumes = function

(chunkid, promises)

};try

else

onfactory(promise);

} catch

(e)

});}}

通讀核心**之後,可以得到如下總結:

英雄也怕無用武之地,讓我們看看mf的應用場景有哪些:

樹鏈剖分原理

樹鏈剖分用一句話概括就是 把一棵樹剖分為若干條鏈,然後利用資料結構 樹狀陣列,sbt,splay,線段樹等等 去維護每一 條鏈,複雜度為o logn 那麼,樹鏈剖分的第一步當然是對樹進行輕重邊的劃分。定義size x 為以x為根的子樹節點個數,令v為u的兒子中size值最大的節點,那麼 u,v 就是...

border radius幾種寫法的原理剖析

border radius 40px border radius 40px 20px border radius 40px 20px border radius 40px 20px 10px 5px 今天主要是測試上面四種border radius的寫法。首先是第一種。這裡設定了乙個值,所以預設4個...

spark大資料 wordcount原理剖析

1 如下 package cn.spark.study.core import org.apache.spark.author yangchun description date created in 2020 05 04 15 41 object wordcountscala val pairs ...