在 Vue 3 项目中使用 乾坤(qiankun) 微前端框架,可以将多个独立的前端应用集成到一个主应用中,实现微前端架构。以下是详细的使用步骤和注意事项。
1. 什么是乾坤(qiankun)?
乾坤是一个基于 Single-SPA 的微前端解决方案,支持将多个独立的前端应用(如 Vue、React、Angular 等)集成到一个主应用中,实现应用的解耦和独立开发、部署。
2. 使用步骤
2.1 安装乾坤
在主应用和子应用中安装乾坤依赖:
npm install qiankun -S
2.2 配置主应用
主应用负责加载和管理子应用。
-
在主应用中注册子应用:
// main.js (主应用) import { registerMicroApps, start } from 'qiankun' // 注册子应用 registerMicroApps([ { name: 'vue3-app', // 子应用名称 entry: '//localhost:8081', // 子应用入口(开发环境为本地服务,生产环境为线上地址) container: '#subapp-container', // 子应用挂载的容器 activeRule: '/vue3', // 子应用的路由前缀 }, { name: 'react-app', entry: '//localhost:8082', container: '#subapp-container', activeRule: '/react', } ]) // 启动乾坤 start()
-
在主应用的模板中添加子应用容器:
<!-- App.vue --> <template> <div id="app"> <h1>主应用</h1> <div id="subapp-container"></div> <!-- 子应用挂载点 --> </div> </template>
-
配置主应用的路由:
确保主应用的路由不会与子应用的路由冲突。// router.js (主应用) import { createRouter, createWebHistory } from 'vue-router' const routes = [ { path: '/', component: () => import('@/views/Home.vue') }, { path: '/about', component: () => import('@/views/About.vue') } ] const router = createRouter({ history: createWebHistory(), routes }) export default router
2.3 配置子应用
子应用需要暴露生命周期钩子,以便主应用加载。
-
在子应用中导出生命周期钩子:
// main.js (子应用) import { createApp } from 'vue' import App from './App.vue' import router from './router' let instance = null function render(props = {}) { const { container } = props instance = createApp(App) instance.use(router) instance.mount(container ? container.querySelector('#app') : '#app') } // 独立运行时,直接渲染 if (!window.__POWERED_BY_QIANKUN__) { render() } // 导出生命周期钩子 export async function bootstrap() { console.log('子应用启动') } export async function mount(props) { console.log('子应用挂载') render(props) } export async function unmount() { console.log('子应用卸载') instance.unmount() instance = null }
-
配置子应用的打包工具:
修改子应用的vue.config.js
,使其支持乾坤:// vue.config.js (子应用) const { defineConfig } = require('@vue/cli-service') module.exports = defineConfig({ transpileDependencies: true, devServer: { port: 8081, // 确保端口与主应用配置一致 headers: { 'Access-Control-Allow-Origin': '*' // 允许跨域 } }, configureWebpack: { output: { library: 'vue3-app', // 子应用名称 libraryTarget: 'umd', // 将子应用打包为 umd 格式 } } })
2.4 运行项目
-
启动主应用和子应用:
- 主应用运行在
localhost:8080
- Vue 3 子应用运行在
localhost:8081
- React 子应用运行在
localhost:8082
- 主应用运行在
-
访问主应用的路由:
/vue3
加载 Vue 3 子应用/react
加载 React 子应用
3. 注意事项
-
路由冲突:
- 主应用和子应用的路由前缀需要明确区分,避免冲突。
- 子应用的路由需要基于主应用的路由前缀。
-
样式隔离:
- 使用
scoped
样式或 CSS Modules 避免样式污染。 - 乾坤默认支持 JS 沙箱,但不支持 CSS 隔离,可以通过
shadow DOM
或手动处理样式。
- 使用
-
通信机制:
- 使用
props
传递数据。 - 使用全局状态管理工具(如 Vuex、Pinia)或自定义事件通信。
- 使用
-
生产环境部署:
- 子应用的
entry
需要替换为生产环境的 CDN 地址。 - 确保主应用和子应用的跨域问题已解决。
- 子应用的
4. 示例代码
总结
通过乾坤,可以轻松实现 Vue 3 的微前端架构,将多个独立应用集成到一个主应用中。核心步骤包括:
- 在主应用中注册子应用。
- 在子应用中导出生命周期钩子。
- 配置路由和打包工具,确保主应用和子应用协同工作。
这种方法适用于大型项目,能够有效提升开发效率和可维护性。