Vite + Vue3 + Module Federation 打造微前端MVP

Vite + Vue3 + Module Federation 打造微前端MVP

本文将手把手带你从 0 到 1 构建一个包含三个独立 Vue3 应用(homeappdemo1appdemo2app)的微前端架构,基于 Vite + Module Federation 实现组件共享、远程加载,并解决常见的跨域、加载失败等问题。


什么是 Module Federation?

Module Federation 是 Webpack 5 提出的革命性机制,它允许多个独立构建的项目共享模块。简单理解就是:

A 应用可以在运行时动态加载 B 应用暴露的模块,就像加载本地组件一样。

这为微前端架构提供了现代化解决方案------多个团队可并行开发和部署独立模块,互不干扰又可自由组合。


那 Vite 支持 Module Federation 吗?

虽然原生 Vite 不支持 Webpack 的 Module Federation,但社区有非常成熟的插件:

@originjs/vite-plugin-federation

它让我们在 Vite 中像在 Webpack 一样使用 Module Federation,并支持 Vue、React 等生态。


项目结构简介

我们将构建三个独立应用:

ruby 复制代码
vite-module-federation-demo/
├── homeapp      # 暴露 ListComp 组件
├── demo1app     # 远程加载 homeapp 中的组件
└── demo2app     # 加载整个 demo1app,形成应用组合

快速上手三步走

Step 1:安装插件

在每个项目中执行:

bash 复制代码
pnpm add @originjs/vite-plugin-federation -D
pnpm add vue @vitejs/plugin-vue -D

Step 2:配置 vite.config.ts

homeapp 为例:

ts 复制代码
// homeapp/vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import federation from '@originjs/vite-plugin-federation'

export default defineConfig({
  plugins: [
    vue(),
    federation({
      name: 'homeapp',
      filename: 'remoteEntry.js',
      exposes: {
        './ListComp': './src/components/ListComp.vue'
      },
      shared: ['vue']
    })
  ],
  build: {
    target: 'esnext',
    minify: false
  }
})

demo1app 中使用 homeappListComp,同时暴露 demo1app

ts 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import federation from '@originjs/vite-plugin-federation'

export default defineConfig({
  plugins: [
    vue(),
    federation({
      name: 'demo1app',
      filename: 'remoteEntry.js',
      remotes: {
        homeapp: 'http://localhost:5001/assets/remoteEntry.js'
      },
      exposes: {
        './App': './src/App.vue' // demo1app 整个应用对外暴露
      },
      shared: ['vue']
    })
  ],
  build: {
    target: 'esnext',
    minify: false
  }
})

🧠 小提示:路径不要手写错 "remoteEntry.js",最好确认 URL 是否能访问!


demo2app 中使用 demo1app

ts 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import federation from '@originjs/vite-plugin-federation'

export default defineConfig({
  plugins: [
    vue(),
    federation({
      name: 'demo2app',
      remotes: {
        demo1app: 'http://localhost:5002/assets/remoteEntry.js'
      },
      shared: ['vue']
    })
  ],
  build: {
    target: 'esnext',
    minify: false
  }
})

Step 3:打包远程模块 + 本地开发主应用

bash 复制代码
cd homeapp
vite build
http-server dist -p 5001 --cors  # 支持 CORS

cd demo1app
vite build
http-server dist -p 5002 --cors

cd demo2app
http-server dist -p 5003 --cors 

如何在主应用中使用远程组件?

demo1app 中引入 homeapp 的组件:

ts 复制代码
// demo1app/src/App.vue
import { defineAsyncComponent } from 'vue'

const ListComp = defineAsyncComponent(() => import('homeapp/ListComp'))

export default {
  components: { ListComp }
}

常见错误与解决方案

错误提示 解决方案
404: remoteEntry.js not found 必须 vite build 后才能生成 remoteEntry.js
Access to script blocked by CORS 使用 http-server --cors 或配置 Nginx 添加 CORS 响应头
Failed to fetch dynamically imported module 检查远程地址是否可访问、是否 build、路径是否对
❌ 加载组件无响应 记得用 defineAsyncComponent 包裹远程组件

最终效果


结语

Vite + Vue3 + Module Federation 是构建现代微前端应用的强组合,它同时兼顾了:

  • 极速开发体验(Vite)
  • 灵活运行时模块组合(MF)
  • 解耦部署与升级(微前端核心价值)

如果你也在做中大型前端系统拆分、模块重用、独立部署的工作,Module Federation 将是你不可错过的关键技术

GitHub地址github.com/Tom-kkk/vit...

相关推荐
往事随风去11 分钟前
Java 中的 Consumer 与 Supplier 接口
java·面试·响应式编程
IT_陈寒23 分钟前
Python 3.12 的这5个新特性,让我的代码性能提升了40%!
前端·人工智能·后端
方安乐39 分钟前
vite+vue+js项目使用ts报错
前端·javascript·vue.js
韩立233342 分钟前
Vue 3.5 升级指南
前端·vue.js
小猪乔治爱打球44 分钟前
[Golang 修仙之路] Go语言:内存管理
后端·面试
子兮曰1 小时前
🚀别再乱写package.json了!这些隐藏技巧让项目管理效率提升300%
前端·javascript·npm
我叫汪枫1 小时前
Spring Boot图片验证码功能实现详解 - 从零开始到完美运行
java·前端·javascript·css·算法·html
小桥风满袖1 小时前
极简三分钟ES6 - ES8中async,await
前端·javascript
一直在学习的小白~2 小时前
node_modules 明明写进 .gitignore,却还是被 push/commit 的情况
前端·javascript·vue.js
前端小超超2 小时前
如何配置capacitor 打包的ios app固定竖屏展示?
前端·ios·web app