qiankun 微前端实战
大型前端项目拆成多个独立部署的子应用,主应用统一调度。qiankun 是蚂蚁开源的微前端框架,本文从主应用配置到子应用接入,讲清 qiankun 的核心用法。
一、微前端解决什么问题
单体前端项目代码量几十万行,多团队协作冲突多、构建慢、技术栈难统一。微前端把应用拆成多个独立部署的子应用,主应用负责布局和路由,子应用各自迭代。
| 方案 | 技术栈隔离 | 部署独立 | 成本 |
|---|---|---|---|
| iframe | 完全隔离 | 是 | 体验差 |
| 模块联邦 | 是 | 是 | 配置复杂 |
| qiankun | 是 | 是 | 中等,生态成熟 |
二、安装与主应用配置
npm install qiankun
// 主应用 main.js
import { registerMicroApps, start } from 'qiankun';
// 注册子应用
registerMicroApps([
{
name: 'app-vue', // 子应用名称
entry: '//localhost:8081', // 子应用入口
container: '#subapp-viewport', // 子应用挂载的容器
activeRule: '/vue', // 路由匹配规则
},
{
name: 'app-react',
entry: '//localhost:8082',
container: '#subapp-viewport',
activeRule: '/react',
},
]);
// 启动
start();
<!-- 主应用 HTML -->
<div id="subapp-viewport"></div>
注意:子应用需要导出三个生命周期函数:bootstrap、mount、unmount。qiankun 在切换时自动调用。
三、子应用改造
// Vue 子应用 main.js
import Vue from 'vue';
import App from './App.vue';
let instance = null;
// 独立运行时直接挂载
if (!window.__POWERED_BY_QIANKUN__) {
instance = new Vue({ render: h => h(App) }).$mount('#app');
}
// qiankun 生命周期导出
export async function bootstrap() {
console.log('子应用初始化');
}
export async function mount(props) {
instance = new Vue({ render: h => h(App) }).$mount('#app');
}
export async function unmount() {
instance.$destroy();
instance = null;
}
四、样式隔离
// 主应用 start 时开启样式隔离
start({
sandbox: {
experimentalStyleIsolation: true, // 实验性样式隔离
},
});
// 或者使用严格模式
start({
sandbox: true, // JS 沙箱 + 样式隔离
});
qiankun 的样式隔离基于 Shadow DOM 或 CSS Scoping,避免子应用之间样式互相污染。
五、主子应用通信
// 主应用:通过 initGlobalState 传递全局状态
import { initGlobalState } from 'qiankun';
const actions = initGlobalState({
user: '小明',
token: 'abc123',
});
// 子应用里获取
export async function mount(props) {
props.onGlobalStateChange((state) => {
console.log('收到全局状态:', state);
});
}
六、部署要点
# 子应用打包后部署到独立的 CDN 或服务器
# 确保子应用入口 HTML 可跨域访问(CORS)
# 子应用 vue.config.js 配置跨域
module.exports = {
devServer: {
port: 8081,
headers: {
'Access-Control-Allow-Origin': '*',
},
},
};
七、总结
qiankun 微前端的核心三步:主应用注册子应用并启动、子应用导出三个生命周期、开启样式隔离和沙箱。适合多团队协作的大型项目。记住:子应用独立开发独立部署,主应用负责调度和布局,样式和 JS 都做隔离避免冲突。