1. 介绍#
借鉴了 WebComponent 的思想,通过 CustomElement 结合自定义的 ShadowDom,将微前端封装成一个类 WebComponent 组件,从而实现微前端的组件化渲染。并且由于自定义 ShadowDom 的隔离特性,micro-app 不需要像 single-spa 和 qiankun 一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改 webpack 配置,是目前市面上接入微前端成本最低的方案。官网
2. 接入 micro-app#
2-1. 基座应用#
1. 安装依赖#
npm i @micro-zoe/micro-app --save
2. 引入#
// main.js
import microApp from '@micro-zoe/micro-app'
microApp.start()
3. 分配子应用路由#
const routes = [
...{
path: '/micro-app/:page*',
name: 'Microapp',
component: () => import('../views/Microapp.vue'),
},
]
4. 潜入微应用#
// views/Microapp.vue
<template>
<div>
<h1>子应用</h1>
<!--
name(必传):应用名称,每个`name`都对应一个应用,必须以字母开头,且不可以带有 `.`、`#` 等特殊符号
url(必传):页面html的地址
baseroute(可选):基座应用分配给子应用的基础路由,
-->
<micro-app
name="app1"
url="http://localhost:8082/ "
baseroute="/micro-app"
></micro-app>
</div>
</template>
baseroute: 当路由条件不满足:基座应用是 history 路由,子应用是 hash 路由时, 需要向子应用下发 baseroute, 此时就需要传 baseroute
2-2. 子应用: 路由设置#
1. 设置基础路由#
如果基座应用是 history 路由,子应用是 hash 路由,不需要设置基础路由,这一步可以省略
const router = new VueRouter({
mode: 'history',
base: window.__MICRO_APP_BASE_ROUTE__ || '/',
routes,
})
- 设置基础路由,子应用可以通过 window.MICRO_APP_BASE_ROUTE获取基座下发的 baseroute,如果基座没有设置 baseroute 属性,则此值默认为空字符串
- 关于主子应用路由的其他情况,后面紧接着会讲
2. 子应用跨域调试#
在 webpack-dev-server 的 headers 中设置跨域支持
// vue.config.js
module.exports = {
devServer: {
headers: {
'Access-Control-Allow-Origin': '*',
},
},
}
3. 子应用的路由设置#
路由类型约束#
- 基座是 hash 路由,子应用也必须是 hash 路由
- 基座是 history 路由,子应用可以是 hash 或 history 路由
注意#
-
如果基座是 history 路由,子应用是 hash 路由,不需要设置基础路由 baseroute
-
vue-router 在 hash 模式下不支持通过 base 设置基础路由,需要创建一个空的路由页面,将其它路由作为它的 children
TIP
综上建议:基座路由统一使用 history