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 相关文章推荐
一个JavaScript继承的实现
Oct 24 Javascript
DOM_window对象属性之--clipboardData对象操作代码
Feb 03 Javascript
window.navigate 与 window.location.href 的使用区别介绍
Sep 21 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
TinyMCE汉化及本地上传图片功能实例详解
May 31 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
vue-router路由参数刷新消失的问题解决方法
Jun 17 Javascript
React 项目迁移 Webpack Babel7的实现
Sep 12 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
解决Vue router-link绑定事件不生效的问题
Jul 22 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安装为Apache DSO
2006/10/09 PHP
基于empty函数的判断详解
2013/06/17 PHP
Smarty保留变量用法分析
2016/05/23 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
简单谈谈python中的lambda表达式
2018/01/19 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
python pandas 时间日期的处理实现
2019/07/30 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
啤酒节策划方案
2014/05/28 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
《学会看病》教学反思
2016/02/17 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
Redis全局ID生成器的实现
2022/06/05 Redis