webpack5 联邦模块介绍详解


Posted in Javascript onJuly 08, 2020

本文主要介绍webpack 5 的新特性之一 "module federation"(联邦模块),涉及联邦模块特性、使用方法、适用范围。

特性

webpack 5引入联邦模式是为了 更好的共享代码 。 在此之前,我们共享代码一般用npm发包来解决。 npm发包需要经历构建,发布,引用三阶段,而联邦模块可以 直接引用其他应用代码 ,实现热插拔效果。对比npm的方式更加简洁、快速、方便。

使用方法

  • 引入远程js
  • webpack配置
  • 模块使用

引入远程JS

假设我们有app1,app2两个应用,端口分别为3001,3002。 app1应用要想引用app2里面的js,直接用script标签即可。

例如app1应用里面index.html引入app2应用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"],
  }),
 ],
};

对于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以外。

参数解释

  • name 应用名,全局唯一,不可冲突。
  • library 。UMD标准导出,和name保持一致即可。
  • remotes 声明需要引用的远程应用。如上图app1配置了需要的远程应用app2.
  • filename 远程应用时被其他应用引入的js文件名称。对应上面的 remoteEntry.js
  • exposes 远程应用暴露出的模块名。
  • shared 依赖的包。
    • 如果配置了这个属性。webpack在加载的时候会先判断本地应用是否存在对应的包,如果不存在,则加载远程应用的依赖包。
    • 以app2来说,因为它是一个远程应用,配置了["react", "react-dom"] ,而它被app1所消费,所以webpack会先查找app1是否存在这两个包,如果不存在就使用app2自带包。 app1里面同样申明了这两个参数,因为app1是本地应用,所以会直接用app1的依赖。

模块使用

对于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('远程应用名/暴露的模块名'),对应webpack配置里面的name和expose。使用方式和引入一个普通异步组件无差别。

适用范围

由于share这个属性的存在,所以本地应用和远程应用的技术栈和版本必须兼容,统一用同一套。比如js用react,css用sass等。

联邦模块和微前端的关系:因为expose这个属性即可以暴露单个组件,也可以把整个应用暴露出去。同时由于share属性存在,技术栈必须一致。所以加上路由,可以用来实现single-spa这种模式的微前端。

使用场景:新建专门的组件应用服务来管理所有组件和应用,其他业务层只需要根据自己业务所需载入对应的组件和功能模块即可。模块管理统一管理,代码质量高,搭建速度快。特别适用矩阵app,或者可视化页面搭建等场景。

webpack5 联邦模块介绍详解

例子的 github地址

到此这篇关于webpack5 联邦模块介绍详解的文章就介绍到这了,更多相关webpack5 联邦模块 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
Mar 09 Javascript
理解JavaScript的caller,callee,call,apply
Apr 28 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
js克隆对象、数组的常用方法介绍
Sep 26 Javascript
jquery插件开发之实现google+圈子选择功能
Mar 10 Javascript
JavaScript中的toDateString()方法使用详解
Jun 12 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
Oct 25 Javascript
JavaScript仿微博发布信息案例
Nov 16 Javascript
vue学习笔记之v-if和v-show的区别
Sep 20 Javascript
vue-cli中使用高德地图的方法示例
Mar 28 Javascript
微信小程序保存图片到相册权限设置
Apr 09 Javascript
一百多行代码实现react拖拽hooks
Mar 23 Javascript
实例讲解React 组件
Jul 07 #Javascript
JavaScript eval()函数定义及使用方法详解
Jul 07 #Javascript
详解React 元素渲染
Jul 07 #Javascript
JS数据类型判断的几种常用方法
Jul 07 #Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 #Javascript
jQuery 实现扁平式小清新导航
Jul 07 #jQuery
vue@cli3项目模板怎么使用public目录下的静态文件
Jul 07 #Javascript
You might like
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[20:30]职业巡回赛回顾
2018/08/09 DOTA
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
《难忘的泼水节》教学反思
2014/02/27 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
个人授权委托书
2014/09/15 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
导游词之井冈山
2019/11/20 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
解决golang在import自己的包报错的问题
2021/04/29 Golang
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android