微前端架构在大型项目中的落地经验(面向零基础初学者的实战教程)
开篇:微前端到底是什么?能解决什么问题?

想象一下,你和几位朋友要一起做一顿大餐。如果每个人都想负责整道菜的所有步骤——洗菜、切菜、炒菜……那效率可能很低,而且容易出错。
但在一个更聪明的方式下,你可以让张三负责凉拌黄瓜,李四专攻红烧肉,王五只管饭后甜点。每个人专注于自己最拿手的部分,最后把这些菜合在一起,就是一顿丰盛的晚餐。
这就是微前端的核心思想:把一个庞大的前端项目拆分成多个“小厨房”,每个团队或开发者各自开发自己的模块,然后统一整合成一个完整的应用。
微前端不是一种框架,而是一种 前端架构设计理念,它特别适合:
- 多人协作的大型项目
- 多种技术栈并存的老系统重构
- 希望快速迭代、灵活部署的应用
环境准备:搭建微前端开发环境(一步步来,超简单!)

在开始动手之前,我们得先准备好“厨房”。我们将使用 Webpack Module Federation 技术来演示微前端的实现方式。
步骤 1:安装 Node.js 和 npm
请从 https://nodejs.org 下载并安装最新 LTS 版本。
安装完成后,在命令行中执行下面两个命令:
node -v
npm -v
你会看到类似如下输出:
v20.15.1
10.7.0
表示安装成功!
步骤 2:创建主项目(Host)和子项目(Remote)
我们要创建两个项目:一个是主应用(用来整合所有子应用),另一个是子应用(比如产品展示页)。
创建主项目 host-app
mkdir host-app
cd host-app
npm init -y
npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
npm install react react-dom
创建子项目 product-app
mkdir ../product-app
cd ../product-app
npm init -y
npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
npm install react react-dom
现在你的目录结构应该是这样的:
micro-frontend-project/
├── host-app/ # 主应用
└── product-app/ # 子应用
核心概念讲解:用白话讲清楚关键知识点

概念一:什么是 Host 和 Remote?
- Host(宿主应用):就像是餐厅总管理,负责控制整个页面的布局和各个模块的加载。
- Remote(远程模块):就像一道独立的菜品,由其他团队开发完成,主应用可以随时“调用”。
通俗点说,Host 负责“叫菜”,Remote 负责“做菜”。
概念二:Module Federation 是什么?
这是 Webpack 提供的一个功能,允许我们在不打包的前提下,将不同项目的代码共享起来。
它的核心配置是:
new ModuleFederationPlugin({
name: 'appname',
filename: 'remoteEntry.js',
remotes: {},
exposes: {},
shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
})
我们可以把它理解为一个“外卖连接器”——当 Host 应用需要调用 Remote 应用时,只需要告诉它“我要哪道菜”,就会自动从对应的 Remote 端加载过来。
实战项目:跟着我一步一步搭建一个简单的微前端项目
第一步:配置子项目 product-app 作为 Remote 模块
进入 product-app 目录,编辑 webpack.config.js 文件内容如下:
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
mode: 'development',
devServer: {
port: 3001,
},
plugins: [
new ModuleFederationPlugin({
name: 'productApp',
filename: 'remoteEntry.js',
remotes: {},
exposes: {
'./ProductList': './src/ProductList',
},
shared: {
react: { singleton: true },
'react-dom': { singleton: true },
},
}),
new HtmlWebpackPlugin({
template: './public/index.html',
}),
],
};

再创建 public/index.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Product App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
创建组件文件:src/ProductList.js
import React from 'react';
const ProductList = () => {
return (
<div>
<h2>商品列表</h2>
<ul>
<li>衣服 $99</li>
<li>帽子 $49</li>
<li>鞋子 $129</li>
</ul>
</div>
);
};
export default ProductList;
最后是入口文件:src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import ProductList from './ProductList';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<ProductList />);
运行子项目:
npm run start
访问 http://localhost:3001,你应该能看到商品列表显示出来。
第二步:配置主项目 host-app 使用 Remote 模块
进入 host-app 项目目录,同样编辑 webpack.config.js:
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
mode: 'development',
devServer: {
port: 3000,
},
plugins: [
new ModuleFederationPlugin({
name: 'hostApp',
filename: 'remoteEntry.js',
remotes: {
productApp: 'productApp@http://localhost:3001/remoteEntry.js',
},
exposes: {},
shared: {
react: { singleton: true },
'react-dom': { singleton: true },
},
}),
new HtmlWebpackPlugin({
template: './public/index.html',
}),
],
};
同样创建 public/index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Host App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
再写我们的主页面组件:src/App.js
import React, { useEffect, useState } from 'react';
const App = () => {
const [ProductList, setProductList] = useState(null);
useEffect(() => {
async function loadRemote() {
const module = await import('productApp/ProductList');
setProductList(React.createElement(module.default));
}
loadRemote();
}, []);

return (
<div>
<h1>欢迎来到主系统</h1>
{ProductList ? ProductList : '正在加载商品模块...'}
</div>
);
};
export default App;
最后是入口文件:src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
运行主项目:
npm run start
访问 http://localhost:3000,你应该看到主页面中动态加载了远程的 ProductList 组件!
🎉 成功啦!
常见问题答疑:新手常问的问题都在这
❓1. Host 加载 Remote 模块很慢怎么办?
✅ 解决方案:
- 使用懒加载(如上面例子中使用
useEffect + import()) - 添加 Loading 动画提升用户体验
- 预加载模块资源
❓2. Remote 和 Host 用了不同版本的 React 怎么办?
✅ 解决方案:
- 设置
shared字段强制使用同一个依赖
shared: {
react: { singleton: true, requiredVersion: '^18.2.0' },
'react-dom': { singleton: true, requiredVersion: '^18.2.0' },
}
❓3. 如何调试 Host 和 Remote 的通信?
✅ 推荐工具:
- Chrome DevTools 中查看 Network 请求
- 在 Remote 页面打开
http://localhost:3001/remoteEntry.js查看暴露接口 - 手动打印
window.productApp查看远程模块
❓4. 如果没有 Webpack,还能用微前端吗?
✅ 当然可以:
- 可以用基于 iframe 的嵌套(但交互性差)
- 或者使用 Qiankun、Single SPA 等通用框架
- 本例选择 Webpack 是因为它是最常用的构建工具之一,便于理解和上手
学习建议:接下来可以怎么学?方向在哪?
恭喜你完成了第一个微前端实战项目 🎊,但这只是开始!
你可以沿着以下路径继续学习:
✅ 初级阶段(已掌握):
- 搭建基本的 Host + Remote 结构
- 使用 Webpack Module Federation 实现模块共享
- 动态加载远程组件
✅ 进阶阶段:
- 学习如何在 Vue、Angular 中使用 Module Federation
- 使用 Qiankun 等通用微前端框架
- 掌握 CSS 隔离与全局污染解决方案
- 异常处理与性能优化策略
✅ 高阶挑战:
- 构建多级嵌套的微前端架构
- 实现按需加载、权限路由整合
- 多个 Remote 应用之间的状态通信设计
- 自动化部署与灰度发布策略
推荐学习资源:
| 类型 | 资源名称 | 地址 |
|---|---|---|
| 文档 | Webpack Module Federation 官方文档 | https://webpack.js.org/concepts/module-federation/ |
| 框架 | Qiankun 官网 | https://qiankun.umijs.org/zh/guide |
| 教程 | Bilibili 上的实战视频 | 搜索“微前端实战+React+Webpack” |
总结回顾:我们学会了什么?
我们从零开始完成了以下几个关键操作:
- ✅ 认识了微前端的概念及其应用场景
- ✅ 搭建了本地的 Host + Remote 开发环境
- ✅ 理解了 Webpack Module Federation 的原理与作用
- ✅ 实践了一个简单的微前端项目案例
- ✅ 收集并解答了一些常见问题
- ✅ 规划了后续的学习路线
微前端是一个强大且灵活的技术架构,虽然一开始可能会有点复杂,但只要你动手做了就能理解其价值。希望你能继续深入探索,早日成为项目架构高手!
如果你觉得这篇文章对你有帮助,别忘了收藏 + 分享给正在学习的朋友 😄

评论 0