微前端 模块联邦技术

目录

介绍 

基本使用 

演示用法

初始化配置文件

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.mzph.cn/news/208637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发爬虫用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 信号,我们用…

用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实战 —— 开发微信小程序的调试技巧

手机真机调试微信小程序 开发版和体验版的小程序&#xff0c;域名没有备案时想调试接口访问效果&#xff0c;可以按下述方式操作&#xff1a; 在手机上点右上方三个点&#xff0c;点击“开发调试”&#xff0c;开启调试模式&#xff0c;即可真机访问接口&#xff08;跳过域名校…

【Vue3从入门到项目实现】RuoYi-Vue3若依框架前端学习——动态路由与菜单栏

菜单栏 若依框架的侧边栏组件通常由菜单项和子菜单组成。 登录后&#xff0c;会获取用户拥有的路由菜单 {"msg": "操作成功","code": 200,"data": [{"name": "System","path": "/system",…

git操作:使用vscode集成

git操作方式 其实git操作一般有三种方式 分别是终端命令行,开发工具集成,专业的git可视化工具 我前面几章说的都是git的命令行操作,今天这篇文章主要是针对开发工具vscode集成git操作进行演示 说明一下,这里之所以选择vscode,是因为本人用的就是vscode,每个开发工具基本都有…

spark链接hive时踩的坑

使用spark操作hive&#xff0c;使用metastore连接hive&#xff0c;获取hive的数据库时&#xff0c;当我们在spark中创建数据库的时候&#xff0c;创建成功。 同时hive中也可以看到这个数据库&#xff0c;建表插入数据也没有问题&#xff0c;但是当我们去查询数据库中的数据时&a…

IDEA 出现问题:Idea-操作多次commit,如何合并为一个并push解决方案

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

Python---继承

1、什么是继承 我们接下来来聊聊Python代码中的“继承”&#xff1a;类是用来描述现实世界中同一组事务的共有特性的抽象模型&#xff0c;但是类也有上下级和范围之分&#xff0c;比如&#xff1a;生物 > 动物 > 哺乳动物 > 灵长型动物 > 人类 > 黄种人 从哲学…

通过rc.local开机自启执行nohup命令运行Flask,nohup.out中没有Flask请求响应日志

需求 通过修改/etc/rc.d/rc.local&#xff0c;实现开机自启Flask服务&#xff0c;CentOS 7.9。rc.local参考链接1&#xff0c;参考链接2。 问题 在/etc/rc.d/rc.local中添加 /home/python/face_jiance/kaijiziqi.sh 在/home/python/face_jiance/kaijiziqi.sh中写 nohup /…