一、为什么需要微前端

现在很多公司的前端项目越来越大,一个项目可能有几十个页面,甚至上百个。如果所有代码都放在一个工程里,开发、测试、部署都会变得很麻烦。比如:

  • 每次改一个小功能,整个项目都要重新打包
  • 团队协作时,代码冲突频繁
  • 技术栈升级困难,老代码不敢动

微前端就是把一个大项目拆成多个小项目,每个小项目可以独立开发、独立部署,最后再组合在一起运行。这样既能保持项目的灵活性,又能降低维护成本。

二、qiankun是什么

qiankun 是阿里开源的一个微前端框架,它基于 single-spa 做了二次封装,使用起来更简单。它的核心能力包括:

  • 支持多种前端框架(Vue、React、Angular 等混用)
  • 样式隔离,避免子应用之间的样式冲突
  • JS 沙箱,防止全局变量污染
  • 资源预加载,提升用户体验

三、如何在Vue项目中接入qiankun

3.1 主应用配置

首先在主应用的 main.js 中初始化 qiankun:

// 技术栈:Vue2 + qiankun
import { registerMicroApps, start } from 'qiankun';

// 注册子应用
registerMicroApps([
  {
    name: 'vue-subapp', // 子应用名称
    entry: '//localhost:7101', // 子应用入口
    container: '#subapp-container', // 挂载节点
    activeRule: '/subapp', // 激活路由
  },
]);

// 启动 qiankun
start();

3.2 子应用改造

子应用需要导出三个生命周期钩子:

// 技术栈:Vue2 子应用
let instance = null;

function render(props = {}) {
  const { container } = props;
  instance = new Vue({
    router,
    store,
    render: h => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');
}

// 导出生命周期
export async function bootstrap() {
  console.log('子应用启动');
}

export async function mount(props) {
  console.log('子应用挂载');
  render(props);
}

export async function unmount() {
  console.log('子应用卸载');
  instance.$destroy();
  instance = null;
}

3.3 路由配置要点

主应用和子应用的路由需要配合:

// 主应用路由
const routes = [
  {
    path: '/subapp*', // 匹配所有/subapp开头的路径
    name: 'subapp',
    component: () => import('@/views/SubAppContainer.vue'),
  },
];

四、实际开发中的注意事项

  1. 静态资源路径问题
    子应用的静态资源建议使用绝对路径,或者在打包时设置 publicPath:

    // vue.config.js
    module.exports = {
      publicPath: process.env.NODE_ENV === 'production' ? '/subapp/' : '/',
    };
    
  2. 样式隔离方案

    • 使用 CSS Modules
    • 添加应用前缀(如 .app1-button)
    • 开启 qiankun 的严格样式隔离(但有性能损耗)
  3. 全局状态管理
    可以通过 props 把主应用的状态传给子应用:

    // 主应用传递状态
    registerMicroApps([
      {
        name: 'vue-subapp',
        entry: '//localhost:7101',
        container: '#subapp-container',
        activeRule: '/subapp',
        props: {  // 传递全局状态
          userInfo: { name: '张三' },
        },
      },
    ]);
    

五、qiankun的优缺点分析

优点:

  • 真正实现独立开发、独立部署
  • 技术栈无关,老项目也能接入
  • 完善的沙箱机制,稳定性好

缺点:

  • 子应用之间通信较复杂
  • 调试稍麻烦,需要同时运行多个项目
  • 某些第三方库可能不兼容沙箱环境

六、适合的使用场景

  1. 大型后台管理系统(比如有订单、会员、商品等多个模块)
  2. 需要逐步重构的老项目
  3. 多团队协作开发的项目

七、完整示例:电商后台实战

假设我们要做一个电商后台,包含三个子应用:

// 主应用配置
registerMicroApps([
  {
    name: 'product',
    entry: '//localhost:7101',
    container: '#subapp-container',
    activeRule: '/product',
  },
  {
    name: 'order',
    entry: '//localhost:7102', 
    container: '#subapp-container',
    activeRule: '/order',
  },
  {
    name: 'user',
    entry: '//localhost:7103',
    container: '#subapp-container',
    activeRule: '/user',
  },
]);

start({
  prefetch: true, // 开启预加载
  sandbox: { experimentalStyleIsolation: true }, // 开启样式隔离
});

八、常见问题解决方案

问题1:子应用加载失败
检查:

  • 子应用是否允许跨域(devServer.headers 设置 Access-Control-Allow-Origin)
  • 子应用的生命周期钩子是否导出正确

问题2:样式混乱
解决方案:

/* 子应用添加作用域前缀 */
.app-container .ant-btn {
  /* 按钮样式 */
}

问题3:路由跳转异常
确保主应用的路由模式与子应用一致(都是 hash 或 history)

九、总结

微前端不是银弹,但对于大型项目确实能解决很多痛点。qiankun 作为目前最成熟的方案之一,上手简单、功能完善,特别适合 Vue 技术栈的项目。实际使用时要注意资源路径、样式隔离和通信机制,建议先在测试环境充分验证再上线。