微前端架构将大型前端应用拆分为多个独立的子应用,实现独立开发、测试和部署,提升应用的可维护性和扩展性。
Header
组件,订单子应用引用该组件。/product
时加载商品子应用。qiankun
提供的沙箱机制隔离子应用的运行环境。SystemJS
或Webpack联邦按需加载子应用代码。qiankun
构建微前端应用假设有一个电商平台,包含用户管理、商品展示、订单管理等模块。我们将这些模块拆分为独立的微前端应用,使用qiankun
进行集成。
mkdir micro-frontend-main
cd micro-frontend-main
npm init -y
npm install qiankun --save
index.html
:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>微前端主应用title>
head>
<body>
<div id="subapp-container">div>
<script src="index.js">script>
body>
html>
index.js
:
import { registerMicroApps, start } from 'qiankun';
registerMicroApps([
{
name: 'user-app', // 子应用名称
entry: '//localhost:7101', // 子应用入口地址
container: '#subapp-container', // 子应用渲染容器
activeRule: '/user', // 激活规则,匹配路由时加载子应用
},
{
name: 'product-app',
entry: '//localhost:7102',
container: '#subapp-container',
activeRule: '/product',
},
{
name: 'order-app',
entry: '//localhost:7103',
container: '#subapp-container',
activeRule: '/order',
},
]);
start();
mkdir user-app
cd user-app
npm init -y
npm install react react-dom --save
index.html
:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户管理子应用title>
head>
<body>
<div id="root">div>
<script src="index.js">script>
body>
html>
index.js
:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
function render(props) {
ReactDOM.render(<App {...props} />, document.getElementById('root'));
}
// 导出生命周期函数
export async function bootstrap() {
console.log('用户管理子应用 bootstrap');
}
export async function mount(props) {
console.log('用户管理子应用 mount', props);
render(props);
}
export async function unmount() {
console.log('用户管理子应用 unmount');
ReactDOM.unmountComponentAtNode(document.getElementById('root'));
}
App.js
:
import React from 'react';
const App = (props) => {
return (
<div>
<h1>用户管理子应用</h1>
<p>欢迎,{props.name}!</p>
</div>
);
};
export default App;
package.json
:
{
"name": "user-app",
"version": "1.0.0",
"scripts": {
"start": "webpack-dev-server --mode development",
"build": "webpack --mode production"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"webpack": "^5.74.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
}
}
webpack.config.js
:
const path = require('path');
module.exports = {
entry: './index.js',
output: {
filename: 'index.js',
library: 'userApp', // 指定库名称
libraryTarget: 'umd', // 通用模块定义
publicPath: '//localhost:7101/', // 子应用访问路径
chunkFilename: '[name].js',
},
mode: 'development',
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: true,
port: 7101,
historyApiFallback: true,
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react'],
},
},
},
],
},
};
cd user-app
npm start
同样启动product-app
和order-app
。
cd micro-frontend-main
npx http-server -p 8080
访问http://localhost:8080
,通过路由切换查看不同子应用的展示效果。
通过以上设计与实战示例,展示了微前端架构的核心原则、架构模式和关键技术。使用qiankun
框架,成功构建了一个包含用户管理、商品展示、订单管理等模块的微前端应用,实现了子应用的独立开发、部署和集成,提升了应用的可维护性和扩展性。