持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
前言
前面介绍了我们的微前端需要解决的基础问题,接下来我们介绍一下微前端用的比较多的一些框架:single-spa、qiankun、飞冰
single-spa
single-spa是一款与框架无关的微前端解决方案
生命周期
registerApplication => load applications => bootstrapped => mounted => unmounted => unloaded
其中bootstrap、mount、unmount必须由我们导出,否则会报错
registerApplication
首先注册微应用:registerApplication
registerApplication(
'app1',
() => import('src/app1/main.js'),
(location) => location.pathname.startsWith('/app1'),
{ some: 'value' }
);
注意:这里的入口文件只能是js,像Vue和React都有入口文件main.js,刚好可以进行微应用注册
bootstrap
bootstrap只会被执行一次,执行时机是第一次挂载应用
export async function bootstrap(props) {...}
mount
这个阶段将会创建DOM节点,监听DOM事件,激活路由
export async function mount(props) {...}
unmount
卸载事件
export async function unmount(props) {...}
微前端本身是一个多页面多项目应用,多页面应用的缺点在于切换很慢,资源重复加载;而single-spa首次将多页应用以单页方式进行切换,优化了用户体验,也启发了后来的框架
qiankun
qiankun以single-spa为基础,主要增加了以下功能:
- 实现了js沙箱以及微应用和主应用的样式隔离,样式的隔离还可以选择严格模式即shadow DOM,天然的样式隔离
- 增加了html入口文件的解析
registerMicroApps([
{
name:'sub-vue',
entry:'//localhost:8080',
container:"#app1",
activeRule:'/vue',
},
{
name:'sub-vue2',
entry:'//localhost:8081',
container:"#app2",
activeRule:'/vue2'
}
])
- 提供了通信方案:onGlobalStateChange实现主应用与微应用、微应用之间的通信 主应用初始化全局状态同时监听statechange:
import { initGlobalState, MicroAppStateActions } from 'qiankun';
const actions= initGlobalState(state);
actions.onGlobalStateChange((state, prev) => {
console.log(state, prev);
});
此时微应用同样也可以监听statechange和设置state,但必须在mount中设置:
export async function mount(props) {
props.onGlobalStateChange((state,prev)=>{})
props.setGlobalState({init:1})
}
使用qiankun的时候需要注意必须创建一个public-path.js文件,否则所有的静态资源都不能正常获取到
if (window.__POWERED_BY_QIANKUN__) {
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
但是qiankun依然有没有解决的问题
- 如果不是用严格沙盒模式,主应用与子应用定义全局样式时会产生样式污染
- 版本管理、应用部署、公共依赖这几块没有提出很好的解决方案,需要我们自己去实现,一般公共依赖我们可以在主应用维护,然后进行打包发布
飞冰
基于 React 的研发解决方案 与上面的不同,飞冰是限定框架的
飞冰微前端解决方案:icestark
飞冰如何接入?
-
安装依赖:build-plugin-icestark,然后添加配置项
-
主应用入口改造,定义路由,引入微应用的js地址(umd包),css地址
-
子应用改造,子应用需要打umd包,以便于主应用去引入
总结
本文简要介绍了三大微前端框架的使用,这三个微前端框架是目前的主流框架,当然还有一些使用web-components实现的微前端框架,但是那一类目前还不成熟,如果感兴趣的可以自己去研究一下;