拆分与重构——微前端

什么是微前端?

微前端是一种架构模式,类似于微服务的理念,但它应用于前端开发。它的核心思想是将一个大型的前端应用拆分成多个小的独立应用(微应用),每个微应用都可以独立开发、部署和运行。

简单来说:微前端是一种把前端大项目拆成多个小项目独立开发的技术架构,就像后端的微服务那样。

举个🌰(理解拆分)

假设有一个电商后台系统,有这些功能页面:

  • 订单管理
  • 商品管理
  • 财务管理
  • 用户权限管理

传统方式:这几个功能写在一个 Vue 项目里,几百个页面、几万行代码,团队多人协作容易混乱、部署慢、上线风险大。

微前端方式:把每个功能拆成一个独立的小前端应用,比如:

  • order-app:订单管理
  • product-app:商品管理
  • finance-app:财务管理
  • user-app:权限管理

每个小应用可以独立开发、独立部署、甚至技术栈不同(比如订单用 Vue,商品用 React 都行)。

为什么要使用微前端?
  1. 团队独立性:不同的团队可以独立开发自己的微应用,使用自己熟悉的技术栈。

  2. 灵活性:微应用之间可以独立更新和部署,不会影响主应用。

  3. 适应多技术栈:在一个项目中可以使用不同的框架和库,比如 React、Vue、Angular 等。

微前端的架构

在微前端中,存在两个主要的角色:

  1. 主应用(Container App):负责承载和加载多个微应用。

  2. 微应用(Micro App):每个微应用负责自己的一部分功能,可以使用不同的技术栈。

             +----------------------+
             |     主应用(壳子)     |
             |----------------------|
             |   微应用加载/管理逻辑   |
             +----------------------+
                |        |        |
        +-------+        +--------+-------+
        |                             |     |
+---------------+         +------------------+
| 订单微应用     |         | 商品微应用        |
|(Vue 项目)    |         |(React 项目)     |
+---------------+         +------------------+

微前端如何实现呢?

Webpack Module Federation(Webpack 模块联邦)

🔍 这是最主流、现代的方式,适用于用 Webpack 构建的 Vue/React 项目

核心概念:让前端项目可以在运行时引入其他 Webpack 构建好的模块。

也就是说,A 应用运行时可以加载 B 应用导出的组件,并且像本地组件一样使用!

示例结构:

假设有两个前端项目:

  • main-app:主应用,负责加载别的微应用
  • order-app:订单管理微应用,暴露出一个页面模块

步骤1:配置微应用 order-app

// order-app/webpack.config.js
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'orderApp',
      filename: 'remoteEntry.js',  // 暴露的入口
      exposes: {
        './OrderPage': './src/pages/OrderPage',  // 暴露页面模块
      },
    }),
  ],
};

步骤2:配置主应用 main-app

// main-app/webpack.config.js
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'mainApp',
      remotes: {
        orderApp: 'orderApp@http://localhost:9001/remoteEntry.js',
      },
    }),
  ],
};

主应用中使用微应用的组件:

// main-app/src/App.tsx
import React, { Suspense, lazy } from 'react';

const OrderPage = lazy(() => import('orderApp/OrderPage'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <OrderPage />
    </Suspense>
  );
}

Module Federation 优点:

  • 支持 运行时加载 微应用;

  • 可以 共享依赖(React/Vue 不重复打包);

  • 可以每个微应用独立部署,上线互不影响;

Web Components(原生技术,框架无关)

🔍 是浏览器支持的一种组件化标准,所有框架都能用(Vue/React/Angular)

核心概念:

Web Components 是原生浏览器提供的组件封装机制,它有三个核心能力:

  • Custom Elements:自定义标签<my-element>
  • Shadow DOM:样式和结构隔离
  • HTML Templates:模板定义

核心逻辑:

每个微应用暴露为一个自定义标签,例如:

<order-app></order-app>
<product-app></product-app>

主应用只要动态插入这些标签就能运行微应用,完全解耦。

举个 🌰:Vue 3 打包 Web Component

// vue.config.js
module.exports = {
  configureWebpack: {
    output: {
      library: 'OrderApp',
      libraryTarget: 'window',
    },
  },
  chainWebpack: config => {
    config.plugins.delete('html');
  },
};
// main.js
import { createApp } from 'vue';
import OrderApp from './App.vue';

const app = createApp(OrderApp);
app.mount('#order-app'); // 主应用会加载这个元素

主应用集成 Web Component:

<script src="http://localhost:8081/order-app.js"></script>
<order-app></order-app>
注意事项
问题说明解决方案
样式冲突多个微应用样式互相污染使用 CSS Modules 或 Shadow DOM
多框架共存Vue 与 React 同时运行可能冲突保持技术边界、互不干扰
微应用加载慢首屏性能差使用懒加载、按需加载
路由冲突主子应用都使用前端路由采用 hash 模式或 base 配置隔离
共享依赖版本不同微应用和主应用版本不一致使用 Webpack shared 配置统一版本

总结

微前端通过将大型前端应用拆分为多个独立的微应用,使得团队能够使用不同的技术栈,独立开发、部署和管理各自的功能模块。

主应用负责加载和渲染微应用,同时微应用之间通过通信机制进行交互。借助 Webpack Module Federation 和 Web Components 等技术,微前端的实现变得更加高效和灵活。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值