【**團隊掘金原文:
為什麼需要學習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");通過以上配置,我們對mf有了乙個初步的認識,即如果要使用mf,需要配置好幾個重要的屬性:const modulefederationplugin = require("webpack/lib/container/modulefederationplugin");
module.exports =,
filename: 'emp.js',
remotes: ,
shared: ["react", "react-dom","react-router-dom"]
})]}
欄位名型別
含義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 ...