当前位置:首页 > VUE

vue 微前端实现

2026-01-19 00:15:42VUE

Vue 微前端实现方案

微前端架构允许将多个独立的前端应用组合成一个整体。以下是基于 Vue 的常见实现方案:

基于 qiankun 的微前端方案

qiankun 是一个成熟的微前端框架,支持 Vue 应用作为主应用或子应用。

主应用配置:

import { registerMicroApps, start } from 'qiankun';

registerMicroApps([
  {
    name: 'vue-sub-app',
    entry: '//localhost:7101',
    container: '#subapp-container',
    activeRule: '/vue-sub-app',
  },
]);

start();

子应用配置(Vue 子应用需要暴露生命周期钩子):

// main.js
import Vue from 'vue';
import App from './App.vue';

let instance = null;

function render(props = {}) {
  instance = new Vue({
    render: h => h(App),
  }).$mount('#app');
}

if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

export async function bootstrap() {}
export async function mount(props) { render(props); }
export async function unmount() { instance.$destroy(); }

基于 Module Federation 的 Webpack 5 方案

Webpack 5 的模块联邦特性可以实现更灵活的微前端架构。

主应用配置:

// webpack.config.js
module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'host',
      remotes: {
        remoteApp: 'remoteApp@http://localhost:3001/remoteEntry.js',
      },
    }),
  ],
};

子应用配置:

// webpack.config.js
module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'remoteApp',
      filename: 'remoteEntry.js',
      exposes: {
        './Button': './src/components/Button.vue',
      },
    }),
  ],
};

基于 single-spa 的方案

single-spa 是更底层的微前端框架,需要更多手动配置。

主应用注册:

import { registerApplication, start } from 'single-spa';

registerApplication({
  name: 'vue-app',
  app: () => System.import('vue-app'),
  activeWhen: ['/vue-app'],
});

start();

Vue 子应用适配器:

import './set-public-path';
import Vue from 'vue';
import App from './App.vue';

const vueLifecycles = {
  bootstrap: async () => {
    console.log('vue app bootstrap');
  },
  mount: async () => {
    new Vue({
      render: h => h(App),
    }).$mount('#vue-app');
  },
  unmount: async () => {
    document.getElementById('vue-app').innerHTML = '';
  },
};

export const bootstrap = vueLifecycles.bootstrap;
export const mount = vueLifecycles.mount;
export const unmount = vueLifecycles.unmount;

样式隔离方案

微前端需要处理样式隔离问题,常见解决方案:

使用 Shadow DOM

// 子应用挂载时
const shadow = this.$el.attachShadow({ mode: 'open' });
const app = document.createElement('div');
shadow.appendChild(app);
new Vue({ el: app });

使用 CSS 命名空间

/* 子应用样式文件 */
.vue-sub-app .container {
  /* 样式规则 */
}

状态管理共享

微前端应用间共享状态的常见方式:

使用自定义事件

// 主应用
window.dispatchEvent(new CustomEvent('global-event', { detail: data }));

// 子应用
window.addEventListener('global-event', handler);

使用 reduxvuex 共享 store

// 主应用初始化 store
const store = createStore(reducer);

// 子应用接入
if (window.parent.store) {
  Vue.prototype.$store = window.parent.store;
}

路由管理方案

处理微前端间的路由冲突:

主应用使用 history 路由

const router = new VueRouter({
  mode: 'history',
  base: '/main-app',
});

子应用使用 hash 路由或指定 base

const router = new VueRouter({
  mode: 'history',
  base: '/sub-app',
});

构建与部署注意事项

独立构建子应用

# 子应用 package.json
"build": "vue-cli-service build --dest dist/sub-app"

主应用配置代理避免跨域

vue 微前端实现

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/sub-app': {
        target: 'http://localhost:7101',
        changeOrigin: true,
      },
    },
  },
};

以上方案可根据项目需求组合使用,qiankun 提供了最完整的解决方案,Module Federation 适合 Webpack 5 项目,single-spa 则提供更多自定义空间。

标签: vue
分享给朋友:

相关文章

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…

vue实现横滚

vue实现横滚

Vue 实现横滚效果 横滚效果通常指水平滚动内容,常见于轮播图、横向导航栏等场景。以下是几种实现方式: 使用 CSS 和 Vue 结合 通过 CSS 的 overflow-x 和 white-spa…

vue实现增删

vue实现增删

Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是基于 Vue 2 或 Vue 3 的实现方法: 数据定义 初始化一个数组用于存储列表数据,并在 Vue 实…

vue实现分步

vue实现分步

Vue 实现分步功能 在 Vue 中实现分步功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 通过动态组件切换不同的步骤内容,结合 v-if 或 component 标签实现分步逻辑。…