惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
IT之家
IT之家
J
Java Code Geeks
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
量子位
I
InfoQ
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
V
V2EX
博客园 - Franky
U
Unit 42
S
SegmentFault 最新的问题
美团技术团队
The Register - Security
The Register - Security
Last Week in AI
Last Week in AI
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
M
MIT News - Artificial intelligence
博客园 - 聂微东
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Troy Hunt's Blog
B
Blog
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy International News Feed
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
C
Cisco Blogs
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
S
Schneier on Security
C
CERT Recently Published Vulnerability Notes
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
小众软件
小众软件
T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Martin Fowler
Martin Fowler
AWS News Blog
AWS News Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
H
Heimdal Security Blog

博客园 - 华腾智算

子系统框架存档20260717 响应式后台管理系统 smart-water 融合多端协同总体架构设计方案 极简设计框架 跨平台弹性栅格理念设计 多端统一设计理念 一套规则,多端伸缩的UI设计理念 现代栅格设计之一 设计中的栅格系统 智慧水利顶层设计之何为“水利矩阵”与“数字孪生” 从古典Web到AI原生超级应用:团队学习路线与未来架构蓝图 最新架构设计 前端代码规范 v1.0 树型菜单全功能代码 最终最佳实践操作文档:统信UOS VSCode 全栈开发环境配置(基于 Chromium 浏览器) vscode-setting.json配置 VSCode 全栈开发环境初始化设置与跨平台配置指南(Windows/macOS 通用) VScode完整的跨平台适配方案 完整的跨平台 settings.json(飞雪飘鸿优化版) 数字孪生破局之道 完整的GLFW应用程序示例 雏形 程序方向 web三维 第一步,第一行,开始 绘制三角形 明确目标 从文本文件加载指令到模拟内存中,并显示前11个内存单元的内容 使用Python的pydub库播放音乐并打印二进制数据 python的音频处理 python加密与解密 mainwindows.cpp 十进制数213转换为二进制数的完整过程,使用除2取余法(也称为“重复除法法”) 二进制数 \((-1101.101)_2\) 转换为十进制数 - 华腾智算
现代前端架构的核心思想
华腾智算 · 2026-07-16 · via 博客园 - 华腾智算

面对“多端界面不同,但数据源和业务逻辑一致”的挑战,现代前端架构的核心思想是:最大化共享数据逻辑与业务规则,最小化 UI 表现层的差异成本。它不再靠“多套完全独立的代码”,而是通过分层架构、共享数据 Hooks 和设计令牌,让各端各自独立渲染,但底层逻辑完全统一。


一、架构分层:BFF + 共享逻辑 + 端 UI

┌──────────────────────────────────────────────────────┐
│                    各端 UI 壳                         │
│  桌面 (Table/复杂表单)  手机 (卡片/底部导航)  大屏 (全屏图表)  │
└───────────────┬──────────────────────────────────────┘
                │ 调用共享 Hooks / 服务
┌───────────────▼──────────────────────────────────────┐
│              共享业务逻辑层 (Monorepo packages)         │
│  • API 类型定义  • 数据获取 Hooks (React Query)        │
│  • 业务校验函数  • 状态管理 (Zustand)  • 设计令牌      │
└───────────────┬──────────────────────────────────────┘
                │
┌───────────────▼──────────────────────────────────────┐
│         可选的 BFF (Backend for Frontend)              │
│  桌面 BFF (聚合表格数据)  手机 BFF (精简字段)          │
└───────────────┬──────────────────────────────────────┘
                │
┌───────────────▼──────────────────────────────────────┐
│              统一后端微服务 / API                       │
│       用户服务 · 订单服务 · 分析服务 · 权限服务          │
└──────────────────────────────────────────────────────┘

关键点:

  • 业务逻辑(过滤、排序、权限判断、表单校验)只存在于共享层,各端完全复用
  • 数据获取策略、缓存、乐观更新由共享 Hooks 管理,UI 组件只消费数据。
  • 各端可以拥有完全不同的组件树、路由和交互方式,通过容器查询和弹性栅格实现自身内部的响应式。

二、Monorepo 代码组织(最落地)

smart-platform/
├── apps/
│   ├── desktop/          # 桌面端 (React + Ant Design)
│   │   ├── src/
│   │   │   ├── layouts/   # 经典顶栏+侧边双菜单
│   │   │   ├── pages/     # 表格、复杂表单
│   │   │   └── App.tsx
│   ├── mobile/           # 移动端 (React + 自定义移动组件)
│   │   ├── src/
│   │   │   ├── layouts/   # 底部导航 + 抽屉
│   │   │   ├── pages/     # 卡片流、滑动操作
│   │   │   └── App.tsx
│   └── bigscreen/        # 大屏 (React + ECharts)
│       ├── src/
│       │   ├── layouts/   # 全屏网格无菜单
│       │   ├── pages/     # 实时数据看板
│       │   └── App.tsx
└── packages/
    ├── shared-hooks/     # 数据获取与业务逻辑 Hooks
    │   ├── useUsers.ts
    │   ├── useOrders.ts
    │   └── validators.ts
    ├── shared-types/     # API 接口类型
    ├── shared-state/     # 全局状态 atoms (Zustand)
    ├── design-tokens/    # 跨平台设计令牌
    └── ui-kit/           # 可选的基础 UI 原子 (Button, Input)

三、共享逻辑层具体实现

以“用户管理”为例,三个端界面完全不同:

  • 桌面:带有排序、筛选、分页的复杂表格,批量操作工具栏。
  • 手机:可下拉刷新的卡片列表,点击进入详情,滑动删除。
  • 大屏:实时滚动的用户活跃度排名,WebSocket 推送。

它们共享的代码只有一份:

// packages/shared-hooks/useUsers.ts
import { useQuery } from '@tanstack/react-query';
import { fetchUsers } from '../services/userApi';
import type { UserFilters } from '../shared-types';

export function useUsers(filters: UserFilters) {
  return useQuery({
    queryKey: ['users', filters],
    queryFn: () => fetchUsers(filters),
    staleTime: 30_000,        // 各端一致的缓存策略
  });
}
// packages/shared-hooks/validators.ts
export const validateEmail = (email: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
export const canDeleteUser = (user, currentUserRole) => { /* 权限逻辑 */ }

桌面端使用:

// apps/desktop/pages/UserList.tsx
import { Table, Button } from 'antd';
import { useUsers } from '@smart-platform/shared-hooks';

export default function UserList() {
  const { data, isLoading } = useUsers({ status: 'active' });
  return <Table dataSource={data} columns={columns} />;
}

手机端使用:

// apps/mobile/pages/UserList.tsx
import { useUsers } from '@smart-platform/shared-hooks';
import { CardList } from '../components/CardList';

export default function UserList() {
  const { data, refetch } = useUsers({ status: 'active' });
  return <CardList data={data} onRefresh={refetch} />;
}

结果: 逻辑完全一致,UI 随意定制,代码零重复。


四、何时需要 BFF?不同端的接口裁剪

如果移动端需要的字段明显少于桌面端,或大屏需要特殊的聚合数据,可以让 BFF 层做适配,但共享 Hooks 依然调用同一函数,只是传入不同的 API endpoint 或参数:

// packages/shared-hooks/useDashboard.ts
export function useDashboard(device: 'desktop' | 'mobile' | 'bigscreen') {
  const endpoint = {
    desktop: '/api/desktop/dashboard',
    mobile: '/api/mobile/dashboard',
    bigscreen: '/api/bigscreen/dashboard',
  }[device];
  return useQuery({ queryKey: ['dashboard', device], queryFn: () => fetch(endpoint) });
}

每个 BFF 接口由后端统一维护,业务规则依然在服务层集中,只是组装数据时按需裁剪,避免移动端加载不必要的字段。


五、跨端一致性保障(设计令牌 + 弹性栅格)

即使界面不同,视觉语言和间距体系应该统一,这依赖我们之前定义的设计令牌。各端应用都引用同一份 CSS 变量,但允许在局部覆盖参数:

/* packages/design-tokens/global.css */
:root {
  --color-primary: #4f46e5;
  --grid-min-col: 300px;
  --grid-gap: 24px;
}

手机端可以在入口处覆盖:

/* apps/mobile/src/styles.css */
body {
  --grid-min-col: 160px;
  --grid-gap: 12px;
}

桌面端的复杂表格依然可以享受弹性栅格带来的列数自适应,大屏的 --grid-min-col 可能设为 500px各端按需取值,但共享令牌名称


六、现代趋势:更进一步的元数据驱动

当界面差异极大且变化频繁时,可引入元数据驱动 UI。将“用户列表”抽象为一份描述文件:

# user-module-meta.yaml
entity: User
features: [list, create, delete]
list:
  desktop: TableView
  mobile: CardView
  bigscreen: LiveTicker
  api: /api/users

各端引擎根据这份元数据加载不同的预设组件,共享的 useUsers Hook 自动绑定。这样,新增一个模块只需写一份元数据和后端接口,三端自动获得对应视图(可覆盖)。


七、总结:现代方案三大支柱

  1. 共享逻辑层(Hooks / 状态 / 校验) → 业务逻辑写一次,杜绝各端 Bug 不一致。
  2. 设计令牌 + 弹性栅格 → 视觉语言统一,布局自适应但允许端级微调。
  3. 可选的 BFF 与元数据 → 按需裁剪数据,甚至可以动态生成差异界面。

这套方案完美平衡了精细控制维护成本,是从“古典 Web 多套代码”到“AI 原生超级系统”演进中,现阶段最务实的工程选择。你的团队可以立即从 Monorepo + shared-hooks 开始,逐步叠加 BFF 和元数据驱动,既满足当前多端差异需求,又为未来留下扩展空间。