微前端 模块联邦技术

news2024/11/26 14:34:24

目录

介绍 

基本使用 

演示用法

初始化配置文件

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的filename
      remotes: {
        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.coloradmin.cn/o/1296442.html

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

相关文章

pytorch的二次索引矩阵无法赋值问题

最近在研究中发现torch一个问题&#xff0c;即torch的二次索引的矩阵无法赋值。 具体来说&#xff0c;给定相同的初始常数矩阵a和iou_target矩阵, 以及另一iou矩阵&#xff0c;直接赋值是没问题的。 然而&#xff0c;当对iou_target矩阵进行二次索引时&#xff0c;即idx矩阵和…

基于AIS数据的船舶密度计算与规律研究

参考文献&#xff1a;[1]陈晓. 基于AIS数据的船舶密度计算与规律研究[D].大连海事大学,2021.DOI:10.26989/d.cnki.gdlhu.2020.001129. 谢谢姐姐的文章&#xff01; 网格化AIS数据 网格化 AIS 数据是处理和分析船舶轨迹数据的一种有效方法&#xff0c;特别是当涉及到密度计算和…

驾驭苹果的人工智慧模式:克服反击与应对挑战

苹果一年一度的秋季「春晚」时间越来越近&#xff0c;但在大模型浪潮下&#xff0c;苹果何时推出自己的「苹果GPT」成了另一个关注的话题。 毕竟&#xff0c;前有华为&#xff0c;后有小米&#xff0c;在中国手机厂商争相将大模型装进移动终端的同时&#xff0c;苹果却依旧对A…

Java Spring + SpringMVC + MyBatis(SSM)期末作业项目

本系统是一个图书管理系统&#xff0c;比较适合当作期末作业主要技术栈如下&#xff1a; - 数据库&#xff1a;MySQL - 开发工具&#xff1a;IDEA - 数据连接池&#xff1a;Druid - Web容器&#xff1a;Apache Tomcat - 项目管理工具&#xff1a;Maven - 版本控制工具&#xf…

ElementUI 时间选择器如何限定选择时间

DatePicker 日期选择器 | Element Plus 我们如何限定我们的选择时间呢&#xff0c;比如限定选择时间为今天之前&#xff0c;或者今天之后的时间&#xff1f; 我们可以使用官方提供的disabled-date来实现 我们通过这个属性 做一个回调函数&#xff0c;在里面比较我们想要限定的时…

CSS——标准流、浮动、Flex布局

1、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 2、浮动 作用&#xff1a;让块元素水平排列 属性名&#xff1a;float 属性值&#xff1a; left&#xff1a;…

spark链接hive时踩的坑

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

泽攸科技二维材料转移台的应用场景及优势

随着二维材料的广泛研究和各种潜在应用的开发&#xff0c;对于二维材料样品的精密操控与转移的需求日益增加。特别是一些新型二维材料的制备和器件集成制备中&#xff0c;需要在显微镜下对样品进行观察与定位&#xff0c;并能够在微米甚至纳米量级上精确移動和转移样品。 传统…

Navicat 技术指引 | 适用于 GaussDB 分布式的备份/还原功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

(六) python观察者设计模式

6.1行为型模式简介 观察者设计模式是最简单的行为型模式之一,所以我们先简单了解一下行为型模式 创建型模式的工作原理是基于对象的创建机制的。由于这些模式隔离了对象的创建细 节&#xff0c;所以使得代码能够与要创建的对象的类型相互独立。结构型模式用于设计对象和类的结…

BGP综合

1、使用PreVal策略&#xff0c;确保R4通过R2到达192.168.10.0/24。 2、使用AS_Path策略&#xff0c;确保R4迪过R3到达192.168.11.0/24。 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24。 4、使用Local Preference策略&#xff0c;确保R1通过R2到达192.168.1.0…

IntelliJ idea卡顿解决,我遇到的比较管用的方案

Setttings> Build, Execution,Deployment>Debugger> Data Views> Java 取消 Enable "toString()" object view; Speed up debugging in IntelliJ Yesterday, I observed painfully slow debugging in IntelliJ. Every step over or step in took almost…

近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https,导致服务端302强制跳转到http也没反应

关于Chrome更新http强制跳转到https解决方法 近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https&#xff0c;导致服务端302强制跳转到http也没反应一、F12检查加载的Response Headers中有没有Non-Authoritative-Reason二、找了资料后得到解决方案&#xff1a;三、找…

在阿里云国际上构建共享虚拟主机业务

我们需要3个ECS实例&#xff0c;1个RDS MySQL实例和2个域名。我将使用该域作为我的主域和辅助域。sarathy.infosarathy.site 以下架构图左侧所示的两个 ECS 实例将托管我们的主网站。一个ECS实例用于部署WHMCS&#xff0c;另一个实例用于部署WordPress。WordPress 和 WHMCS 都…

pytorch-mask-rcnn 官方

This is a Pytorch implementation 实现 of Mask R-CNN that is in large parts based on Matterports Mask_RCNN. Matterports repository is an implementation on Keras and TensorFlow. The following parts of the README are excerpts 摘录 from the Matterport README. …

Amazon CodeWhisperer 提供新的人工智能驱动型代码修复、IaC 支持以及与 Visual Studio 的集成...

Amazon CodeWhisperer 的人工智能&#xff08;AI&#xff09;驱动型代码修复和基础设施即代码&#xff08;IaC&#xff09;支持已正式推出。Amazon CodeWhisperer 是一款用于 IDE 和命令行的人工智能驱动型生产力工具&#xff0c;现已在 Visual Studio 中推出&#xff0c;提供预…

C# WPF上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是工业生产重要的环节。不管是定位、测量、检测还是识别&#xff0c;图像处理在工业生产中扮演重要的角色。而c#由于自身快速开发的特点&a…

12.8 作业

1&#xff0c; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#…

持续集成和持续交付

引言 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一种面向开发和运维团队的解决方案&#xff0c;CI/CD 主要针对在集成新代码时所引发的问题&#xff08;亦称&#xff1a;“集成地狱”&#…

【后端学前端学习记录】第一天 css动画 内凹导航栏

1、学习信息 css动画 内凹导航栏_哔哩哔哩_bilibili 随便找的的视频&#xff0c;主要原因是在公司不方便有声音 2、源码 最终源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title…