qiankun集成vue2+webpack
大约 37 分钟
qiankun 集成 vue2+webpack
使用 qiankun 集成 vue2+webpack 项目
基座项目
基座项目可见qiankun 示例
子应用改造
子应用不需要额外安装任何其他依赖即可接入 qiankun 主应用
配置环境变量
配置环境变量,是子应用既可以单独运行又可以接入主应用
.env
NODE_ENV=development
VUE_APP_BASE_URL=/
.env.micro
NODE_ENV=development
VUE_APP_BASE_URL=/app1
.env.buildMicro
NODE_ENV=development
VUE_APP_BASE_URL=/app1
然后在 package.json 中配置启动脚本
{
"scripts": {
"dev": "vue-cli-service serve",
"dev:micro": "vue-cli-service serve --mode micro",
"build": "vue-cli-service build --mode micro",
"test:unit": "vue-cli-service test:unit",
"lint": "vue-cli-service lint",
"svg": "vsvg -s ./src/icons/svg -t ./src/icons/components --ext ts --es6"
}
}
入口文件改造
需要在入口文件中导出 bootstrap
、mount
、unmount
三个生命周期钩子,以供主应用在适当的时机调用
let app: null | Vue = null;
interface IProps {
[key: string]: any;
container?: HTMLElement;
}
export const render = (props: IProps = {}) => {
if ((window as any).__POWERED_BY_QIANKUN__) {
__webpack_public_path__ = (window as any)
.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
const { container } = props;
app = new Vue({
router,
render: (h) => h(App),
}).$mount(container ? container.querySelector('#app')! : '#app');
};
if (!(window as any).__POWERED_BY_QIANKUN__) {
console.log('并不是qiankun渲染');
render();
}
export async function bootstrap() {
console.log('app bootstraped');
}
export async function mount(props: any) {
console.log(props);
props.onGlobalStateChange((state: any) => {
console.log('子应用接收的参数', state);
}, true);
render(props);
}
export async function unmount(props: any) {
if (app) {
app.$destroy();
app = null;
}
console.log(props);
}
export async function update(props: any) {
console.log('update props', props);
}
路由改造
vue2 作为子项目时需要将 mode 配置成history
,并将 base 换成配置好的环境变量
const createRouter = () =>
new VueRouter({
scrollBehavior: (to, from, savedPosition) => {
if (savedPosition) {
return savedPosition;
} else {
return { x: 0, y: 0 };
}
},
base: process.env.VUE_APP_BASE_URL,
routes: routers,
mode: 'history',
});
修改打包配置
除了导出的生命周期,还要在打包配置中修改
// vue.config.js
const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
const path = require('path');
module.exports = defineConfig({
lintOnSave: false,
publicPath: process.env.VUE_APP_BASE_URL,
configureWebpack: {
resolve: {
extensions: ['.js', '.ts', '.vue', '.json']
},
output: {
library: `${packageName}`,
libraryTarget: 'umd',
}
},
});
注册子应用
子应用配置完成后,到基座应用中去注册
const apps: RegistrableApp<any>[] = [
{
name: 'app1',
entry: 'http://localhost:8081/app1',
container: '#microApp',
activeRule: '/app1',
},
];
registerMicroApps(apps);
start();
如果出现跨域问题参考qiankun 集成子项目跨域问题
子应用增加功能
在子应用中添加随意内容,并测试嵌入后是否正常显示