微前端 模塊聯邦技術

目錄

介紹?

基本使用?

演示用法

初始化配置文件

remote?項目

host 項目?


為什么講這個呢,很多人覺得他不是微前端,也有人定義它也是微前端,看怎么理解了,我覺得他是一個去中心化技術,它可以讓多個獨立構建的應用之間,動態的調用彼此的模塊。這種運行機制,可以讓我們輕松的拆分應用,真正做到跨應用的模塊共享。

他是跟webpack5強耦合的,是基于webpack5內置插件的 無須安裝

介紹?

模塊聯邦(Module Federation)是一種在前端應用中實現模塊共享和跨應用程序共享的技術。它是由 webpack/lib/container/ModuleFederationPlugin 提供支持的。

模塊聯邦允許將應用程序拆分成多個獨立的模塊,這些模塊可以獨立開發、部署和維護。每個模塊可以由不同的團隊開發,并且可以在不同的應用程序中共享使用。這種方式可以提高開發效率,減少重復代碼,并且使得應用程序更加靈活和可擴展。

webpack/lib/container/ModuleFederationPlugin 是 webpack 的一個插件,它提供了實現模塊聯邦的功能。通過使用該插件,我們可以將應用程序的不同模塊打包成獨立的 bundle,并且可以在其他應用程序中動態加載和使用這些模塊。

使用模塊聯邦技術,我們可以實現以下應用場景:

  1. 微前端架構:將一個大型應用程序拆分成多個小型的子應用程序,每個子應用程序可以獨立開發和部署,然后通過模塊聯邦技術將它們組合在一起。這樣可以提高團隊的獨立性和開發效率。

  2. 插件化架構:將應用程序的不同功能模塊打包成獨立的插件,然后可以在其他應用程序中動態加載和使用這些插件。這樣可以實現應用程序的可擴展性和靈活性。

  3. 跨應用程序共享:不同的應用程序可以通過模塊聯邦技術共享使用彼此的模塊。這樣可以避免重復開發相同的功能,提高代碼的復用性和維護性。

總結來說,模塊聯邦技術通過 webpack/lib/container/ModuleFederationPlugin 插件提供了一種在前端應用程序中實現模塊共享和跨應用程序共享的方式。它可以提高開發效率,減少重復代碼,并且使得應用程序更加靈活和可擴展。

基本使用?

要使用 webpack/lib/container/ModuleFederationPlugin 插件實現模塊聯邦,你需要按照以下步驟進行設置:

  1. 在你的主應用程序(host application)的 webpack 配置文件中,引入?webpack/lib/container/ModuleFederationPlugin?插件。

  2. 在插件的配置中,指定需要共享的模塊名稱和對應的遠程入口文件。遠程入口文件是包含共享模塊的子應用程序(remote application)的打包文件。

  3. 在子應用程序的 webpack 配置文件中,同樣引入?webpack/lib/container/ModuleFederationPlugin?插件。

  4. 在子應用程序的插件配置中,指定需要共享的模塊名稱和對應的本地入口文件。本地入口文件是子應用程序的打包文件。

  5. 在主應用程序的代碼中,使用?import()?動態加載遠程模塊。這樣可以在運行時從子應用程序中加載共享模塊。

內部原理:?當你使用 webpack/lib/container/ModuleFederationPlugin 插件時,它會在構建過程中生成一個 manifest 文件。這個 manifest 文件包含了模塊的映射關系和加載邏輯。

在主應用程序中,當你使用?import()?動態加載遠程模塊時,webpack 會根據 manifest 文件中的映射關系,找到對應的子應用程序,并從子應用程序中加載所需的模塊。

注意事項:

  • 確保主應用程序和子應用程序的 webpack 配置文件中都正確配置了?webpack/lib/container/ModuleFederationPlugin?插件。

  • 確保主應用程序和子應用程序的模塊名稱和入口文件配置一致,這樣才能正確地共享和加載模塊。

  • 注意版本兼容性,確保 webpack 和相關插件的版本與?webpack/lib/container/ModuleFederationPlugin?插件兼容。

  • 在使用模塊聯邦時,要注意處理好模塊的版本管理和依賴關系,以避免沖突和錯誤。

演示用法

構建兩個項目一個host一個remote

場景就是host項目想使用remote項目的list模塊,

初始化配置文件

下載依賴

pnpm init -y
pnpm i webpack webpack-cli webpack-dev-server html-webpack-plugin -D

remote?項目

index.js

import("./bootstrap");

?bootstrap.js

import { addList } from "./list";
let app = document.getElementById("app");
app.innerHTML = "<h2>remote</h2>";
addList();

異步加載

異步加載是一種優化技術,它可以在需要的時候動態地加載代碼,而不是在頁面加載時一次性加載所有的代碼。這樣可以提高頁面的加載速度和性能。

例子中,通過在入口文件中引入一個代碼文件來實現異步加載的方式是使用了動態導入(Dynamic Import)的語法。動態導入是ES6中的一個特性,它允許在運行時根據需要動態地加載模塊。

在你的例子中,入口文件(main.js)通過使用import("./bootstrap")語法來動態地加載一個名為bootstrap的代碼文件。這樣,當執行到這行代碼時,瀏覽器會開始異步加載bootstrap.js文件,并在加載完成后執行其中的邏輯。

具體實現的原理是,當瀏覽器遇到動態導入語句時,會發起一個異步請求去加載指定的模塊文件。一旦模塊文件加載完成,瀏覽器會執行其中的代碼。這樣可以實現按需加載,提高頁面的加載速度和性能。

需要注意的是,動態導入返回的是一個Promise對象,你可以使用then方法來處理加載完成后的邏輯,或者使用async/await語法來等待加載完成。

總結起來,通過在入口文件中使用動態導入語法,可以實現異步加載代碼文件的邏輯,從而提高頁面的加載速度和性能。

?

remote 項目的webpack 配置

const { Configuration } = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin"); //webpack5內置
/*** @type {Configuration} //配置智能提示*/
const config = {mode: "none", //none 開發模式  production 生產模式entry: "./index.js", //入口文件output: {//  輸出文件filename: "bundle.js", //輸出文件名},devServer: {// 本地服務器port: 9002, //remote 9002},//  開發插件plugins: [//html插件new HtmlWebpackPlugin({template: "./index.html",}),//     遠程模塊插件new ModuleFederationPlugin({name: "remote", //name必填filename: "remoteEntry.js", //filename必填 生成的文件名exposes: {"./addList": "./list.js", //暴露的模塊},}),],
};
module.exports = config;

host 項目?

host 項目的webpack 配置文件

const { Configuration } = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
/*** @type {Configuration} //配置智能提示*/
const config = {mode: "none", //none 開發模式  production 生產模式entry: "./index.js", //入口文件output: {//  輸出文件filename: "bundle.js", //輸出文件名},devServer: {// 本地服務器port: 9003, //remote 9002},//  開發插件plugins: [//html插件new HtmlWebpackPlugin({template: "./index.html",}),//  遠程項目插件new ModuleFederationPlugin({name: "host", //name必填filename: "hostEntry.js", //filename必填 生成的文件名//對應關系remote對應的remote項目ModuleFederationPlugin的name 后面url對應的port以及對應ModuleFederationPlugin的filenameremotes: {remote: "remote@http://localhost:9002/remoteEntry.js", //引入模塊},}),],
};
module.exports = config;

host項目使用模塊 因為模塊是異步加載的

webpack/lib/container/ModuleFederationPlugin 插件通常與異步加載(dynamic import)一起使用。

模塊聯邦的核心思想是將應用程序拆分成多個獨立的模塊,并在需要時動態加載這些模塊。這種動態加載的方式可以帶來以下好處:

  1. 減少初始加載時間:通過異步加載,可以將應用程序的初始加載時間減少到最小。只有在需要時才會加載特定的模塊,而不是一次性加載所有模塊。這可以提高應用程序的性能和用戶體驗。

  2. 按需加載:異步加載允許根據用戶的操作和需求,按需加載特定的模塊。這樣可以避免加載不必要的模塊,減少資源的浪費。

  3. 模塊獨立性:通過異步加載,每個模塊可以獨立開發、部署和維護。這樣不同的團隊可以并行開發不同的模塊,而不會相互干擾。同時,模塊之間的依賴關系也可以更加靈活地管理。

  4. 動態更新:異步加載使得模塊聯邦可以實現動態更新。當一個模塊發生變化時,只需要重新加載該模塊,而不需要重新加載整個應用程序。這可以提高開發效率和部署靈活性。

因此,為了實現模塊聯邦的上述好處,webpack/lib/container/ModuleFederationPlugin 插件通常與異步加載一起使用。通過異步加載,可以按需加載模塊,提高性能、靈活性和開發效率。

//對應關系remote對應的remote項目的name addlist 對應的是key 
import('remote/addList').then(({ addList }) => {let app = document.querySelector('#app');app.innerHTML = `<h3>Host</h3>
`;addList()
})

打完包觀察一下

其實就是一個cdn引入為什么這么做呢?

在之前我們十個項目共用一個模塊 會發到npm 例如1.0.0 這個模塊要改動 1.0.1,那每一個項目都要去重新install 一下 很繁瑣,而模塊聯邦是cdn 引入 無需 重新安裝每次就是最新的

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【力扣100】9.和為k的子數組

添加鏈接描述 class Solution:def subarraySum(self, nums: List[int], k: int) -> int:# 思路是從第一個元素開始遍歷&#xff0c;加到爆&#xff0c;就把指針向前移一位result0for i in range(len(nums)):# 如果爆了&#xff0c;就向后移一位if i!len(nums)-1:ji1sumnums…

高并發爬蟲用Python語言適合嗎?

不管你用什么語言沒在進行高并發前&#xff0c;有幾點是需要考慮清楚的&#xff0c;&#xff1b;例如&#xff1a;數據集大小&#xff0c;算法、是否有時間和性能方面的制約&#xff0c;是否存在共享狀態&#xff0c;如何調試&#xff08;這里指的是日志、跟蹤策略&#xff09;…

C#云LIS系統源碼 B/S架構,SaaS模式,可擴展性強

基于B/S架構的云LIS檢驗系統源碼&#xff0c;整個系統的運行基于WEB層面&#xff0c;只需要在對應的工作臺安裝一個瀏覽器軟件有外網即可訪問。全套系統采用云部署模式&#xff0c;部署一套可支持多家醫院檢驗科共同使用。 采用.Net Core新的技術框架、DEV報表、前端js封裝、分…

騰訊云CentOS8 jenkins war安裝jenkins步驟文檔

騰訊云CentOS8 jenkins war安裝jenkins步驟文檔 一、安裝jdk 1.1 上傳jdk-11.0.20_linux-x64_bin.tar.gz 1.2 解壓jdk安裝包文件 tar -zxvf jdk*.tar.gz 1.3 在/usr/local 目錄下創建java目錄 cd /usr/local mkdir java 1.4 切到java目錄&#xff0c;把jdk解壓文件改名為jd…

【抽象策略模式】實踐

前言 剛果商城&#xff0c;用戶登錄 Or 注冊 發送郵箱驗證碼場景&#xff0c;使用抽象策略模式實現 什么是抽象策略模式 抽象策略模式是一種行為型設計模式&#xff0c;它允許定義一系列算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以互相替換。這使得客戶端代碼…

Java_LinkedList鏈表詳解

目錄 前言 ArrayList的缺陷 鏈表 鏈表的概念及結構 鏈表的種類 1.單向或雙向 2.帶頭或不帶頭 3.循環或不循環 LinkedList的使用 什么是LinkedList LinkedList的使用 LinkedList的構造 LinkedList的其他常用方法介紹 LinkedList的遍歷 ArrayList和LinkedList的…

OpenCL學習筆記(四)手動編譯開發庫(ubuntu+gcc+rk3588)

前言 筆者本次使用的是RK3588的開發板&#xff0c;內部燒寫的是ubuntu20.04&#xff0c;gcc版本是9 本文檔簡單記錄下編譯的過程&#xff0c;有需要的小伙伴可以參考下 一、安裝所需軟件 1.安裝git&#xff0c;教程比較多&#xff0c;不再重復 2.安裝cmake&#xff0c;教程…

UWB的matlab仿真源碼

作品詳細文章與下載鏈接 第一部分:TR-UWB信號的產生和調制 簡介 該實踐涉及使用 MATLAB 生成和調制 TR-UWB 信號。超寬帶信號是一類在頻譜中具有寬帶而不是窄帶的信號信號&#xff0c;具有時間寬度的脈沖產生它。在本次實踐中,MATLAB 程序是開發用于生成基帶 TR-UWB 信號,我們用…

在Windows電腦上獲取硬盤ID的方法

如果你想在Windows電腦上獲取硬盤的ID&#xff0c;可以使用DiskPart命令。以下是具體步驟&#xff1a; 打開命令提示符 按下Win鍵R&#xff0c;輸入cmd&#xff0c;然后回車&#xff0c;即可打開命令提示符。 輸入diskpart并回車 在命令提示符中輸入diskpart&#xff0c;然后…

WordPress 注冊/重置密碼/更改密碼鉤子

wordpress在提供郵件提醒的地方都留了hook&#xff0c;方便讓開發者自定義。最新在添加第三方登錄時遇到虛擬郵箱發信問題&#xff0c;為了防止給指定郵件地址后綴發信&#xff0c;可以利用如下wordpress提供的鉤子來實現。 //https://www.wwttl.com/101.html //禁止用戶注冊時…

用23種設計模式打造一個cocos creator的游戲框架----(十)迭代器模式

1、模式標準 模式名稱&#xff1a;迭代器模式 模式分類&#xff1a;行為型 模式意圖&#xff1a;提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;且不需要暴露該對象的內部表示. 結構圖&#xff1a; ? 適用于&#xff1a; 1、當你需要遍歷一個復雜的數據結構…

promethesu告警規則配置,alertmanager通過webhook通知

文章目錄 前言一、promethesu告警二、告警配置編寫rule文件prometheus配置prometheus產生告警 三、告警通知prometheus 配置 alertmanageralertmanager 配置 webhook通知編寫接口接收 webhook 總結 前言 如果沒有學習過prometheus的基礎和監控的同學&#xff0c;可以先過一遍這…

融合科技,升級醫療體驗——醫院陪診服務的技術創新

隨著科技的迅猛發展&#xff0c;醫療服務領域也在積極借助技術手段提升患者體驗。本文將探討如何利用先進的技術代碼&#xff0c;將醫院陪診服務推向新的高度。 1. 醫療預約系統的實現 # 通過Python代碼實現醫療預約系統 class MedicalAppointment:def __init__(self, patie…

【Python】Numpy庫近50個常用函數詳解和示例,可作為工具手冊使用

本文以yolo系列代碼為基礎&#xff0c;在其中查找用到的numpy函數&#xff0c;包含近50個函數&#xff0c;本文花費多天&#xff0c;三萬多字&#xff0c;通過豐富的函數原理和示例對這些函數進行詳解。以幫助大家理解和使用。 目錄 np.array()運行示例 np.asarray()函數解析運…

unity 2d 入門 飛翔小鳥 場景延續(八)

1、新建c#腳本如下 代碼&#xff0c;在前方生成生成自身圖片并3s后銷毀自身&#xff0c;在碰撞物體后小鳥死亡后不刪除自身 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CopyScene : MonoBehaviour { //要復制的對象public…

Amazon CodeWhisperer 提供新的人工智能驅動型代碼修復、IaC 支持以及與 Visual Studio 的集成...

Amazon CodeWhisperer 的人工智能&#xff08;AI&#xff09;驅動型代碼修復和基礎設施即代碼&#xff08;IaC&#xff09;支持已正式推出。Amazon CodeWhisperer 是一款用于 IDE 和命令行的人工智能驅動型生產力工具&#xff0c;現已在 Visual Studio 中推出&#xff0c;提供預…

uniapp封裝websocket文件(app、h5兼容)

適合場景&#xff1a;只需要發送一次數據&#xff0c;服務器可以實時返回數據進行渲染。 socket文件 let isSocketClose false; // 是否關閉socket let reconnectCount 5; // 重連次數 // let heartbeatInterval ""; // 心跳定時器 let socketTask null; // web…

uniapp實戰 —— 開發微信小程序的調試技巧

手機真機調試微信小程序 開發版和體驗版的小程序&#xff0c;域名沒有備案時想調試接口訪問效果&#xff0c;可以按下述方式操作&#xff1a; 在手機上點右上方三個點&#xff0c;點擊“開發調試”&#xff0c;開啟調試模式&#xff0c;即可真機訪問接口&#xff08;跳過域名校…

《C++新經典設計模式》之第21章 解釋器模式

《C新經典設計模式》之第21章 解釋器模式 解釋器模式.cpp 解釋器模式.cpp #include <iostream> #include <map> #include <stack> #include <vector> #include <cstring> #include <memory> #include <set> #include <sstream&g…

【Vue3從入門到項目實現】RuoYi-Vue3若依框架前端學習——動態路由與菜單欄

菜單欄 若依框架的側邊欄組件通常由菜單項和子菜單組成。 登錄后&#xff0c;會獲取用戶擁有的路由菜單 {"msg": "操作成功","code": 200,"data": [{"name": "System","path": "/system",…