多端统一不是代码复用:一套前端平台架构实战

31 阅读4分钟

🚀 从 Ant Design Pro 到多端架构:一套可落地的前端平台化方案

一、背景:为什么我要“推翻重来”

我原本有一套基于 Ant Design Pro 的 Web 系统。

随着业务发展,逐渐遇到几个典型问题:

  • ❌ Web 项目结构越来越重,难以扩展
  • ❌ 无法支撑多端(小程序 / App / H5)
  • ❌ UI 强绑定,复用困难
  • ❌ 业务逻辑散落在各个页面中

与此同时,新的需求已经很明确:

我需要一套能够同时支撑:

  • 微信小程序
  • 混合 App(H5)
  • 桌面 Web
  • 移动 Web

并且:

既要统一体验,又要保证各端性能最优

这意味着一个关键问题:

❗前端多端架构,究竟应该如何设计?


二、误区:跨端框架并不是答案

在调研阶段,我首先考虑的是常见方案:

  • Taro
  • uni-app
  • React Native / Flutter

但最终我放弃了这些方案,原因很明确:

1️⃣ UI 强行复用,带来长期维护灾难

“一套代码,多端运行” 本质是伪命题

不同端:

  • 渲染机制不同
  • 交互模型不同
  • 性能瓶颈不同

👉 强行统一 UI,代价是:

  • 复杂度指数上升
  • Debug 成本极高
  • 体验不可控

2️⃣ 框架锁死,技术演进受限

一旦绑定跨端框架:

  • 技术升级受限
  • 生态依赖严重
  • 难以按需优化

✅ 最终结论:

多端统一的关键,不是 UI 复用
而是:逻辑与规范的统一

三、核心思路:分层 + 解耦

我最终采用了一套“前端平台化架构”:

UI层(各端独立实现)

业务层(modules,共享)

服务层(services,共享)

🔥 关键思想:

层级是否复用说明
UI❌ 不复用各端独立实现
业务逻辑✅ 复用核心资产
API层✅ 复用数据统一
设计规范✅ 复用体验统一

📌 本质上,这是一种:

前端版的“Clean Architecture”

四、工程落地:Monorepo 架构

为了实现真正的复用,我采用了 Monorepo:

repo/
├── apps/
│   ├── web        # Next.js
│   ├── mini       # 小程序
│   ├── app        # H5(App壳)
│
├── packages/
│   ├── services   # API层(OpenAPI生成)
│   ├── modules    # 业务逻辑
│   ├── request    # 跨端请求适配
│   ├── shared     # 工具函数
│
├── design-system/
│   ├── tokens
│   ├── foundations
│   ├── patterns

为什么选择 Monorepo?

因为它天然解决了:

  • 代码复用
  • 版本一致性
  • 类型共享
  • 跨项目协作

五、关键设计一:API 层(services)

API 层完全基于 OpenAPI 自动生成:

后端 → OpenAPI → 自动生成 TS services

优势:

  • 类型安全
  • 零手写接口
  • 自动同步后端变更

⚠️ 关键点:

必须抽象 request 层:

Web → fetch / axios
小程序 → wx.request

否则无法跨端运行。


六、关键设计二:业务层(modules)

这是整个架构的“核心”。


📦 结构设计:

modules/
├── user/
│   ├── model.ts
│   ├── service.ts
│   ├── hooks.ts
│   ├── store.ts

🔥 核心原则:

modules = 前端领域层(Domain Layer)

必须保证:

  • ❌ 不依赖 UI
  • ❌ 不依赖平台 API
  • ✅ 只包含业务逻辑

举个例子:

export function useUser() {
  const user = ref(null)

  async function fetchUser() {
    user.value = await getUser()
  }

  return { user, fetchUser }
}

👉 不同端可以用不同方式消费:

  • Web:React hooks / Zustand
  • 小程序:自定义状态管理

七、关键设计三:Design System

很多人以为 Design System = UI组件库,这是误区。


我的设计:

design-system/
├── tokens        # 设计变量
├── foundations   # 基础规则
├── patterns      # 设计模式

🔥 最重要的是:patterns

例如:

列表页必须包含:
- 筛选区
- 列表区
- 空状态
- 错误态

👉 不同端实现不同:

  • Web → React
  • 小程序 → WXML

但体验一致 ✅


八、小程序策略:不做跨端

小程序采用:

✅ 原生开发
❌ 不使用 Taro

原因:

  • 性能最优
  • 能力最完整
  • 可控性最高

复用内容:

  • services
  • modules

九、Web 重构方案

不再使用 Ant Design Pro,原因:

  • 过重
  • 设计受限
  • 难以统一多端风格

新方案:

Next.js + Tailwind CSS + 自建组件体系

目标:

  • UI 完全可控
  • 支持 Design System
  • 可迁移到 H5

十、最终认知总结

这套架构的核心不是技术选型,而是认知升级:


❌ 错误方向:

试图用一个框架统一所有端

✅ 正确方向:

用分层架构统一“逻辑”
用设计系统统一“体验”

🔥 一句话总结:

多端统一的关键,不是代码复用
而是:边界清晰 + 抽象合理

十一、架构本质

如果用一句话定义这套系统:

这不是一个前端项目
而是一个前端平台(Frontend Platform)

十二、后续演进方向

这套架构还可以继续演进:

  • 微前端(多团队协作)
  • BFF 层(服务聚合)
  • SSR + Edge 渲染
  • Design Token 自动同步多端

结语

这次重构让我最大的收获不是技术,而是一个认知转变:

前端的复杂度,不在于写页面
而在于如何组织代码

如果你也在做多端项目,希望这篇文章能帮你少走一些弯路。