如果想要主应用具备线上动态的微应用管理能力,最简单的方案是动态加载 Script,大致的示例如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- 主导航设计,这里可以根据后端数据动态渲染导航 -->
<div id="nav">
<button onclick="handleClick('x')">x 应用</button>
<button onclick="handleClick('y')">y 应用</button>
</div>
<!-- 内容区设计 -->
<div class="container">
<!-- 微应用渲染的插槽 -->
<div id="micro-app-slot"></div>
</div>
<!-- 微应用 x:提供 window.xMount 和 window.xUnmount 全局函数-->
<script defer src="http://xxx/x.js"></script>
<!-- 微应用 y:提供 window.yMount 和 window.yUnmount 全局函数-->
<script defer src="http://yyy/y.js"></script>
<script>
function handleClick(type) {
switch (type) {
case "x":
// 告诉微应用需要挂载在 #micro-app-slot 元素上
window.xMount("#micro-app-slot");
window.yUnmount();
case "y":
window.yMount("#micro-app-slot");
window.xUnmount();
default:
break;
}
}
</script>
</body>
</html>
实际业务中,微应用应该维护在后端,通过接口获取
同时启动主应用和微应用的服务,并通过访问主应用的 HTML 实现上述动图中的切换效果。动态 Script 的方案相对于 NPM 方案而言,具备如下优势:
- 主应用在线上运行时可以动态增加、删除和更新(升级或回滚)需要上架的微应用
- 微应用可以进行构建时性能优化,包括代码分割和静态资源分离处理
- 不需要额外对微应用进行库构建配置去适配 NPM 包的模块化加载方式
当然,动态 Script 方案和 NPM 包方案一样,会存在如下问题:
- 主应用和各个微应用的全局变量会产生属性冲突
- 主应用和各个微应用的 CSS 样式会产生冲突