华智工作总结
@hz/layout + @hz/node-server技术架构
微前端架构图及核心流程解析
graph TD
subgraph 配置管理系统
M[菜单配置系统] -->|存储| MenuData
P[代理配置系统] -->|存储| ProxyRules
end
subgraph 基础服务层
Layout{{"@hz/layout"}}
NodeServer{{"@hz/node-server"}}
end
subgraph 微应用A
A1[子应用A - 端口11127]
A2[React Router配置]
A3[业务模块a/b/c]
end
subgraph 微应用B
B1[子应用B - 端口9090]
B2[React Router配置]
B3[业务模块d/e]
end
User[用户浏览器] -->|请求| NodeServer
NodeServer -->|读取| ProxyRules
Layout -->|读取| MenuData
%% 独立运行流程
A1 -->|运行时加载| Layout
B1 -->|运行时加载| Layout
Layout -->|过滤菜单| A2
Layout -->|过滤菜单| B2
%% 代理转发流程
NodeServer -->|路由匹配| ProxyRules
ProxyRules -->|/deviceManage → 9090| B1
ProxyRules -->|/appAPath → 11127| A1
%% 菜单处理流程
MenuData -->|全量菜单数据| Layout
A2 -->|仅保留a/b/c| A3
B2 -->|仅保留d/e| B3
%% 集成部署
Gateway[统一网关] --> NodeServer
CDN[静态资源CDN] --> User
架构核心组件说明
配置管理系统
- 菜单配置系统:存储所有微应用的菜单配置(a/b/c/d/e)
- 代理配置系统:存储路径-端口映射规则(如 /deviceManage → 9090)
基础服务层
@hz/layout:
flowchart LR
L[Layout组件] --> M[获取全量菜单]
L --> R[读取当前应用Router配置]
L --> F[过滤匹配菜单]
L --> H[渲染有效菜单项]
@hz/node-server:
flowchart LR
N[Express服务] --> C[加载代理配置]
N --> P[创建代理中间件]
N --> R[监听指定端口]
P -->|express-http-proxy| T[目标应用]
微应用架构
flowchart TB
subapp[子应用] --> layout["引入@hz/layout"]
subapp --> server["基于@hz/node-server"]
subapp --> router[配置React Router]
subapp --> business[开发业务模块]
router -->|仅暴露| current[当前应用路由]
layout -->|过滤| filter[仅显示有效菜单]
关键流程解析
菜单处理流程
sequenceDiagram
participant User
participant Layout as @hz/layout
participant Config as 菜单配置系统
participant Router as React Router
User->>+Layout: 访问子应用A(11127)
Layout->>+Config: 获取全量菜单(a/b/c/d/e)
Config-->>-Layout: 返回菜单数据
Layout->>+Router: 读取子应用A的路由配置
Router-->>-Layout: 返回路由(a/b/c)
Layout->>Layout: 过滤菜单(仅保留a/b/c)
Layout->>User: 渲染有效菜单
代理转发流程
sequenceDiagram
participant User
participant Node as @hz/node-server
participant ProxyCfg as 代理配置系统
participant AppB as 子应用B(9090)
User->>+Node: 访问 :11127/deviceManage
Node->>+ProxyCfg: 查询路径规则
ProxyCfg-->>-Node: /deviceManage → 9090
Node->>+AppB: 转发请求
AppB-->>-Node: 返回响应
Node-->>-User: 返回代理内容
独立运行 vs 集成运行
| 场景 | 独立运行 | 集成运行 |
|---|---|---|
| 菜单显示 | 仅显示当前应用路由匹配的菜单 | 显示全部菜单 |
| 请求处理 | 直接响应本地路由 | 通过代理转发到目标应用 |
| 路由匹配 | react-router 本地匹配 | Node层代理路径匹配 |
| 部署方式 | 独立端口部署 | 统一网关接入 |
核心优势
- 动态菜单管理:
- 菜单配置与业务代码解耦
- 动态过滤机制保证菜单安全性
- 无缝代理切换:
// express-http-proxy 配置示例 app.use('/:path', proxy((req) => { const target = proxyConfig[req.params.path]; return `http://localhost:${target.port}`; }, { proxyReqPathResolver: (req) => req.originalUrl.replace(`/${req.params.path}`, '') })); - 路由隔离:
- 各子应用维护独立路由配置
- Layout实现运行时路由匹配过滤
- 独立部署能力:
- 每个微应用独立版本化部署
- 代理配置热更新,无需重启服务