前端微服务框架乾坤(Qiankun)实战指南

前端微服务框架乾坤(Qiankun)实战指南

一、初识乾坤:为什么选择微前端?

在传统单体前端架构中,随着业务复杂度增加,代码臃肿、协作困难、部署效率低等问题愈发突出。微前端通过将项目拆分为多个独立自治的微应用,解决了这些问题:

  • 技术栈无关:支持 Vue、React、Angular 等框架混合开发
  • 独立部署:各团队可独立开发、测试、发布
  • 渐进升级:允许逐步重构旧系统
  • 动态加载:按需加载减少首屏耗时

乾坤(Qiankun) 是蚂蚁金服基于 Single-SPA 优化的微前端框架,提供开箱即用的基座能力,本文将从基础到实战带你掌握其核心用法。


二、环境搭建与基础配置

1. 主应用初始化

bash 复制代码
# 创建主应用(Vue 3)
vue create main-app
cd main-app
# 安装乾坤依赖
npm install qiankun --save

2. 主应用配置(main.js

javascript 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import { registerMicroApps, start } from 'qiankun'

const app = createApp(App)
app.mount('#app')

// 注册子应用
registerMicroApps([
  {
    name: 'vueApp', // 子应用名称
    entry: '//localhost:7100', // 子应用入口地址
    container: '#subapp-container', // 挂载节点
    activeRule: '/vue', // 触发路由规则
    props: { msg: '来自主应用的数据' } // 传递参数
  },
  {
    name: 'reactApp',
    entry: '//localhost:7101',
    container: '#subapp-container',
    activeRule: '/react'
  }
])

// 启动乾坤
start()

3. 主应用模板(App.vue

vue 复制代码
<template>
  <div id="app">
    <h1>主应用</h1>
    <nav>
      <router-link to="/vue">Vue 子应用</router-link>
      <router-link to="/react">React 子应用</router-link>
    </nav>
    <div id="subapp-container"></div>
  </div>
</template>

三、子应用开发与接入

1. Vue 子应用配置

(1)创建子应用
bash 复制代码
# 创建 Vue 子应用
vue create vue-app
cd vue-app
# 安装依赖
npm install qiankun --save
(2)修改 main.js
javascript 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import routes from './routes' // 自定义路由

let instance = null

function render(props = {}) {
  const { container, routerBase, msg } = props
  const app = createApp(App)
  
  // 动态配置路由
  const router = createRouter({
    history: createWebHistory(routerBase),
    routes: routes.map(route => ({
      ...route,
      path: `${routerBase}${route.path}` // 拼接基路径
    }))
  })
  
  app.use(router)
  app.mount(container ? container.querySelector('#app') : '#app')
  console.log('主应用传来的数据:', msg)
}

// 独立运行时直接渲染
if (!window.__POWERED_BY_QIANKUN__) {
  render()
}

// 导出生命周期函数
export async function bootstrap() {
  console.log('Vue 子应用启动')
}
export async function mount(props) {
  console.log('Vue 子应用挂载')
  render(props)
}
export async function unmount() {
  instance.unmount()
  instance = null
  console.log('Vue 子应用卸载')
}
(3)配置 vue.config.js
javascript 复制代码
const { name } = require('./package')

module.exports = {
  devServer: {
    port: 7100,
    headers: { 'Access-Control-Allow-Origin': '*' }
  },
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd',
      jsonpFunction: `webpackJsonp_${name}`
    }
  }
}

2. React 子应用配置

(1)创建子应用
bash 复制代码
# 创建 React 子应用
npx create-react-app react-app
cd react-app
# 安装依赖
npm install qiankun --save
(2)修改 src/index.js
javascript 复制代码
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'

let instance = null

function render(props) {
  const { container, routerBase } = props || {}
  ReactDOM.render(<App basename={routerBase} />, container ? container.querySelector('#root') : document.getElementById('root'))
}

// 独立运行时渲染
if (!window.__POWERED_BY_QIANKUN__) {
  render()
}

// 导出生命周期函数
export async function bootstrap() {
  console.log('React 子应用启动')
}
export async function mount(props) {
  console.log('React 子应用挂载')
  render(props)
}
export async function unmount() {
  ReactDOM.unmountComponentAtNode(instance.container.querySelector('#root'))
  console.log('React 子应用卸载')
}
(3)配置 craco.config.js(解决 Single-SPA 兼容性)
javascript 复制代码
const CracoAntDesignPlugin = require('craco-antd')

module.exports = {
  plugins: [
    {
      plugin: CracoAntDesignPlugin,
      options: {
        customizeTheme: {
          '@primary-color': '#1DA57A'
        }
      }
    }
  ]
}

四、核心特性解析

1. 沙箱机制与样式隔离

  • JS 沙箱:每个子应用运行在独立的沙箱环境中,避免全局变量污染
  • 样式隔离:建议使用 Scoped CSS 或 CSS Modules,乾坤默认不处理 CSS 隔离
css 复制代码
/* Vue 子应用示例 */
.button {
  background: #1da57a; /* 私有样式 */
}

2. 全局状态通信

javascript 复制代码
// 主应用定义全局状态
import { initGlobalState } from 'qiankun'

const state = { user: 'Admin' }
const actions = initGlobalState(state)

actions.onGlobalStateChange((newState, prev) => {
  console.log('状态变更:', newState)
})

// 子应用获取状态
const [user] = useState(() => qiankun.getGlobalState().user)

3. 动态路由与预加载

javascript 复制代码
// 主应用配置预加载
registerMicroApps([{
  name: 'vueApp',
  preLoad: true // 预加载子应用
}])

五、完整工作流程演示

  1. 启动主应用 :访问 http://localhost:8080,显示导航菜单
  2. 加载子应用
    • 点击 "Vue 子应用" → 加载 http://localhost:7100 的 Vue 应用
    • 点击 "React 子应用" → 加载 http://localhost:7101 的 React 应用
  3. 调试验证
    • 检查网络请求,确认子应用资源加载
    • 查看控制台生命周期日志(bootstrap → mount → unmount)
    • 验证样式隔离和数据通信

六、生产环境部署要点

  1. 构建子应用

    bash 复制代码
    # Vue 子应用
    vue build --base=/vue/  # 设置资源路径前缀
    # React 子应用
    npm run build
  2. 主应用配置 Nginx

    nginx 复制代码
    server {
      listen 80;
      location / {
        root /path/to/main-app/dist;
        try_files $uri $uri/ /index.html;
      }
      location /vue/ {
        proxy_pass http://localhost:7100; # Vue 子应用地址
      }
      location /react/ {
        proxy_pass http://localhost:7101; # React 子应用地址
      }
    }
  3. 跨域处理:确保子应用服务器允许主应用域名跨域访问


七、总结与扩展

优势 注意事项
技术栈解耦 需处理样式隔离
独立部署 需统一路由规划
渐进式重构 需注意全局状态管理

学习资源推荐

  • 乾坤官方文档
  • 示例代码仓
  • Micro Frontends 模式深度解析

通过本文,你可以掌握乾坤的核心用法,从基础配置到生产部署,逐步构建稳健的微前端架构。

相关推荐
weixin_382395231 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__1 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.2 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~3 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华3 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子6 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅6 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni6 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学7 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端