跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端微前端架构:避免应用变成巨石单体

探讨前端微前端架构,解决单体应用代码量大、构建慢、协作难的问题。介绍了三种主流方案:基于 Webpack 的 Module Federation、路由控制的 Single-SPA 以及阿里开源的 Qiankun。通过拆分独立微应用,提升团队协作效率与构建速度。

橘子海发布于 2026/4/6更新于 2026/10/1594 浏览

前端微前端架构:避免应用变成巨石单体

为什么需要微前端

最近看到一个项目,代码量超过 100 万行,构建时间超过 10 分钟,团队协作困难。维护一个巨大的单体应用就像在没有分区的大房子里生活——能住,但乱得要命。

单体应用痛点
// 反面教材:单体应用
import React from 'react';
import Header from './components/Header';
import Sidebar from './components/Sidebar';
import Dashboard from './components/Dashboard';
import Users from './components/Users';
import Products from './components/Products';
import Orders from './components/Orders';
import Settings from './components/Settings';

function App() {
  return (
    <div>
      <Header />
      <div>
        <Sidebar />
        <main>
          <Dashboard />
          <Users />
          <Products />
          <Orders />
          <Settings />
        </main>
      </div>
    </div>
  );
}

export default App;

这种将所有功能塞进一个大文件的方式,导致耦合严重,难以维护。

微前端解决方案
1. Module Federation
// 配置 webpack (webpack.config.js)
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'host',
      remotes: {
        dashboard: 'dashboard@http://localhost:3001/remoteEntry.js',
        users: 'users@http://localhost:3002/remoteEntry.js',
        products: 'products@http://localhost:3003/remoteEntry.js',
        orders: 'orders@http://localhost:3004/remoteEntry.js',
        settings: 'settings@http://localhost:3005/remoteEntry.js',
      },
      shared: {
        react: { singleton: true, requiredVersion: '^18.2.0' },
        'react-dom': { singleton: true, requiredVersion: '^18.2.0' },
      },
    }),
  ],
};

// 远程应用配置 (dashboard/webpack.config.js)
module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'dashboard',
      filename: 'remoteEntry.js',
      exposes: {
        './Dashboard': './src/Dashboard',
      },
      shared: {
        react: { singleton: true, requiredVersion: '^18.2.0' },
        'react-dom': { singleton: true, requiredVersion: '^18.2.0' },
      },
    }),
  ],
};

// 主机应用 (App.jsx)
import React, { lazy, Suspense } from 'react';
import Header from './components/Header';
import Sidebar from './components/Sidebar';

const Dashboard = lazy(() => import('dashboard/Dashboard'));
const Users = lazy(() => import('users/Users'));
const Products = lazy(() => import('products/Products'));
const Orders = lazy(() => import('orders/Orders'));
const Settings = lazy(() => import('settings/Settings'));

function App() {
  return (
    <div>
      <Header />
      <div>
        <Sidebar />
        <main>
          <Suspense fallback={<div>加载中...</div>}>
            <Dashboard />
            <Users />
            <Products />
            <Orders />
            <Settings />
          </Suspense>
        </main>
      </div>
    </div>
  );
}

export default App;
2. Single-SPA
// 注册应用 (src/registerApplications.js)
import { registerApplication, start } from 'single-spa';

registerApplication({
  name: '@my-org/dashboard',
  app: () => import('@my-org/dashboard'),
  activeWhen: (location) => location.pathname.startsWith('/dashboard'),
});

registerApplication({
  name: '@my-org/users',
  app: () => import('@my-org/users'),
  activeWhen: (location) => location.pathname.startsWith('/users'),
});

start();

// 微应用配置 (packages/dashboard/src/index.js)
import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import Dashboard from './Dashboard';

const lifecycles = singleSpaReact({
  React,
  ReactDOM,
  rootComponent: Dashboard,
  errorBoundary(err, info, props) {
    return <div>应用出错了</div>;
  },
});

export const bootstrap = lifecycles.bootstrap;
export const mount = lifecycles.mount;
export const unmount = lifecycles.unmount;
3. Qiankun
// 主应用 (src/main.js)
import { registerMicroApps, start } from 'qiankun';

registerMicroApps([
  {
    name: 'dashboard',
    entry: '//localhost:3001',
    container: '#micro-app-container',
    activeRule: '/dashboard',
  },
  {
    name: 'users',
    entry: '//localhost:3002',
    container: '#micro-app-container',
    activeRule: '/users',
  },
]);

start();

// 微应用配置 (packages/dashboard/src/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('dashboard bootstraped');
}

export async function mount(props) {
  console.log('dashboard mounted', props);
  render(props);
}

export async function unmount() {
  console.log('dashboard unmounted');
  instance.unmount();
  instance = null;
}

通过拆分独立微应用,团队协作更高效,构建时间更短,有效解决了巨石应用的问题。

目录

  1. 前端微前端架构:避免应用变成巨石单体
  2. 为什么需要微前端
  3. 单体应用痛点
  4. 微前端解决方案
  5. 1. Module Federation
  6. 2. Single-SPA
  7. 3. Qiankun

更多推荐文章

查看全部
  • 网络安全自学技术路线与基础指南
  • 独立开发者如何利用 AIGC 解决 UI 素材短缺问题
  • AI 产品经理必备核心能力与技能指南
  • Redis 高可用方案深度解析:从单点到集群
  • Cloudflare 反爬绕过:Canvas/WebGL/WebRTC 多维度指纹隐身实战
  • 云开发 Copilot:AI 赋能的低代码开发实践
  • 基于 Three.js 渲染三维无人机模型(WebGL / Vue / React)
  • AI 编程工具实测:效率提升背后的真实体验
  • AI 概念解析:LLM、AIGC、AGI 与 GPT 的核心关系及 2025 动态
  • 无需部署服务器:利用内网穿透实现本地服务远程访问
  • OpenClaw 接入 QVeris 实现 AI 助手实时数据查询
  • 告别模板爆炸:构建可读性强的 C++ 元程序的 7 种模式
  • 实测GLM-ASR-Nano-2512:超越Whisper V3的语音识别效果
  • 闲置 Mac Mini 部署 OpenClaw 实现金融 AI 分析助手
  • ROS 2 自主导航机器人系统架构与 SLAM 实践
  • 8 大 AI 平台速度与 Token 消耗测试
  • Ollama 本地部署:CPU 环境下的模型量化与性能优化实战
  • 无人机电力巡检设备缺陷检测数据集及 YOLOv8 训练方案
  • 双指针算法:快乐数判断
  • Rust 与 WebAssembly 深度实战:浏览器与 Node.js 高性能应用

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online