webpack5 聯(lián)邦模塊介紹詳解
本文主要介紹webpack 5 的新特性之一 "module federation"(聯(lián)邦模塊),涉及聯(lián)邦模塊特性、使用方法、適用范圍。
特性
webpack 5引入聯(lián)邦模式是為了 更好的共享代碼 。 在此之前,我們共享代碼一般用npm發(fā)包來解決。 npm發(fā)包需要經(jīng)歷構(gòu)建,發(fā)布,引用三階段,而聯(lián)邦模塊可以 直接引用其他應(yīng)用代碼 ,實(shí)現(xiàn)熱插拔效果。對(duì)比npm的方式更加簡(jiǎn)潔、快速、方便。
使用方法
- 引入遠(yuǎn)程js
- webpack配置
- 模塊使用
引入遠(yuǎn)程JS
假設(shè)我們有app1,app2兩個(gè)應(yīng)用,端口分別為3001,3002。 app1應(yīng)用要想引用app2里面的js,直接用script標(biāo)簽即可。
例如app1應(yīng)用里面index.html引入app2應(yīng)用remoteEntry.js
<head> <script src="http://localhost:3002/remoteEntry.js"></script> </head>
webpack配置
app1的webpack配置:
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin"); module.exports = { //.... plugins: [ new ModuleFederationPlugin({ name: "app1", library: { type: "var", name: "app1" }, remotes: { app2: "app2", }, shared: ["react", "react-dom"], }), ], };
對(duì)于app2的webpack配置如下
plugins: [ new ModuleFederationPlugin({ name: "app2", library: { type: "var", name: "app2" }, filename: "remoteEntry.js", exposes: { "./Button": "./src/Button", }, shared: ["react", "react-dom"], }) ],
可以看到app1和app2的配置基本相同,除了app2 多了filename和exposes以外。
參數(shù)解釋
- name 應(yīng)用名,全局唯一,不可沖突。
- library 。UMD標(biāo)準(zhǔn)導(dǎo)出,和name保持一致即可。
- remotes 聲明需要引用的遠(yuǎn)程應(yīng)用。如上圖app1配置了需要的遠(yuǎn)程應(yīng)用app2.
- filename 遠(yuǎn)程應(yīng)用時(shí)被其他應(yīng)用引入的js文件名稱。對(duì)應(yīng)上面的 remoteEntry.js
- exposes 遠(yuǎn)程應(yīng)用暴露出的模塊名。
- shared 依賴的包。
- 如果配置了這個(gè)屬性。webpack在加載的時(shí)候會(huì)先判斷本地應(yīng)用是否存在對(duì)應(yīng)的包,如果不存在,則加載遠(yuǎn)程應(yīng)用的依賴包。
- 以app2來說,因?yàn)樗且粋€(gè)遠(yuǎn)程應(yīng)用,配置了["react", "react-dom"] ,而它被app1所消費(fèi),所以webpack會(huì)先查找app1是否存在這兩個(gè)包,如果不存在就使用app2自帶包。 app1里面同樣申明了這兩個(gè)參數(shù),因?yàn)閍pp1是本地應(yīng)用,所以會(huì)直接用app1的依賴。
模塊使用
對(duì)于app1/App.js代碼使用app2的組件,代碼如下:
import React from "react"; const RemoteButton = React.lazy(() => import("app2/Button")); const App = () => ( <div> <h1>Basic Host-Remote</h1> <h2>App 1</h2> <React.Suspense fallback="Loading Button"> <RemoteButton /> </React.Suspense> </div> ); export default App;
具體這一行
const RemoteButton = React.lazy(() => import("app2/Button"));
使用方式為:import('遠(yuǎn)程應(yīng)用名/暴露的模塊名'),對(duì)應(yīng)webpack配置里面的name和expose。使用方式和引入一個(gè)普通異步組件無差別。
適用范圍
由于share這個(gè)屬性的存在,所以本地應(yīng)用和遠(yuǎn)程應(yīng)用的技術(shù)棧和版本必須兼容,統(tǒng)一用同一套。比如js用react,css用sass等。
聯(lián)邦模塊和微前端的關(guān)系:因?yàn)閑xpose這個(gè)屬性即可以暴露單個(gè)組件,也可以把整個(gè)應(yīng)用暴露出去。同時(shí)由于share屬性存在,技術(shù)棧必須一致。所以加上路由,可以用來實(shí)現(xiàn)single-spa這種模式的微前端。
使用場(chǎng)景:新建專門的組件應(yīng)用服務(wù)來管理所有組件和應(yīng)用,其他業(yè)務(wù)層只需要根據(jù)自己業(yè)務(wù)所需載入對(duì)應(yīng)的組件和功能模塊即可。模塊管理統(tǒng)一管理,代碼質(zhì)量高,搭建速度快。特別適用矩陣app,或者可視化頁面搭建等場(chǎng)景。
例子的 github地址
到此這篇關(guān)于webpack5 聯(lián)邦模塊介紹詳解的文章就介紹到這了,更多相關(guān)webpack5 聯(lián)邦模塊 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript 不用reverse實(shí)現(xiàn)字符串反轉(zhuǎn)的代碼
javascript 不用reverse實(shí)現(xiàn)字符串反轉(zhuǎn)的代碼,需要的朋友可以參考下。2010-03-03Bootstrap打造一個(gè)左側(cè)折疊菜單的系統(tǒng)模板(二)
這篇文章主要介紹了Bootstrap打造一個(gè)左側(cè)折疊菜單的系統(tǒng)模板(二)的相關(guān)資料,需要的朋友可以參考下2016-05-05前端HTTP發(fā)POST請(qǐng)求攜帶參數(shù)與后端接口接收參數(shù)的實(shí)現(xiàn)
近期在學(xué)習(xí)的時(shí)候,碰到一個(gè)關(guān)于post的小問題,故拿出來分享一下,下面這篇文章主要給大家介紹了關(guān)于前端HTTP發(fā)POST請(qǐng)求攜帶參數(shù)與后端接口接收參數(shù)的相關(guān)資料,需要的朋友可以參考下2022-10-10使用layui的router來進(jìn)行傳參的實(shí)現(xiàn)方法
今天小編就為大家分享一篇使用layui的router來進(jìn)行傳參的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JavaScript控制圖片加載完成后調(diào)用回調(diào)函數(shù)的方法
這篇文章主要介紹了JavaScript控制圖片加載完成后調(diào)用回調(diào)函數(shù)的方法,實(shí)例分析了javascript回調(diào)函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03js實(shí)現(xiàn)滾動(dòng)條自動(dòng)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)滾動(dòng)條自動(dòng)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12canvas實(shí)現(xiàn)環(huán)形進(jìn)度條效果
本文主要介紹了canvas實(shí)現(xiàn)環(huán)形進(jìn)度條效果的實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03javascript function調(diào)用時(shí)的參數(shù)檢測(cè)常用辦法
js中并不直接支持類似c#的方法重載,所以只能變相的來解決,示意代碼:(利用了內(nèi)置屬性arguments)2010-02-02