微前端总结
项目初始化
创建三个项目:一个主应用,两个微应用。
# 创建主应用
npm create vite@latest main-app -- --template vue
# 创建微应用一
npm create vite@latest micro-app-vue1 -- --template vue
# 创建微应用二
npm create vite@latest micro-app-vue2 -- --template vue
最终目录结构:
micro-front/
├── main-app/ # 主应用(基座)
├── micro-app-vue1/ # 微应用1
├── micro-app-vue2/ # 微应用2
└── README.md第一步:主应用配置 qiankun
安装依赖
cd main-app
npm install qiankun vue-router@4qiankun 注册与启动
修改 src/main.js:
import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router'
import { registerMicroApps, start } from 'qiankun'
import App from './App.vue'
const app = createApp(App)
const router = createRouter({
history: createWebHistory('/'),
routes: [
{ path: '/', redirect: '/app1' },
{ path: '/:pathMatch(.*)*', component: () => import('./views/NotFound.vue') }
]
})
app.use(router)
app.mount('#app')
// 微应用配置
const microApps = [
{
name: 'micro-app-vue1',
entry: '//localhost:7100', // 开发环境入口
activeRule: '/app1', // 激活规则:路径以 /app1 开头时激活
container: '#micro-container' // 挂载容器
},
{
name: 'micro-app-vue2',
entry: '//localhost:7101',
activeRule: '/app2',
container: '#micro-container'
}
]
// 注册微应用
registerMicroApps(microApps, {
beforeLoad: [app => console.log('before load', app.name)],
beforeMount: [app => console.log('before mount', app.name)],
afterMount: [app => console.log('after mount', app.name)],
afterUnmount: [app => console.log('after unmount', app.name)]
})
// 启动 qiankun
start({
sandbox: {
strictStyleIsolation: false,
experimentalStyleIsolation: true // 开启实验性样式隔离,兼容性更佳
},
prefetch: 'all' // 预加载微应用静态资源
})添加主应用布局
修改 src/App.vue:
<template>
<div id="main-app">
<header class="main-header">
<div class="logo">
<h1>微前端主应用</h1>
</div>
<nav class="nav">
<router-link to="/app1">应用一</router-link>
<router-link to="/app2">应用二</router-link>
</nav>
</header>
<!-- qiankun 挂载容器 -->
<div id="micro-container" class="micro-container"></div>
</div>
</template>
<style scoped>
.main-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
background: #2c3e50;
color: white;
}
.nav {
display: flex;
gap: 20px;
}
.nav a {
color: white;
text-decoration: none;
}
.nav a.router-link-exact-active {
color: #42b983;
font-weight: bold;
}
.micro-container {
padding: 20px;
}
</style>Vite 配置
修改 vite.config.js:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
server: {
port: 7099, // 主应用端口,避免和微应用冲突
cors: true // 开启跨域,允许加载微应用资源
}
})本地运行验证
三个终端分别启动:
# 终端一:主应用
cd main-app && npm install && npm run dev
# 访问 http://localhost:7099
# 终端二:微应用一
cd micro-app-vue1 && npm install && npm run dev
# 监听 http://localhost:7100
# 终端三:微应用二
cd micro-app-vue2 && npm install && npm run dev
# 监听 http://localhost:7101微前端总结
http://localhost:8090/archives/wei-qian-duan-zong-jie