跳到主要内容

如何理解前端架构

问题

你如何理解前端架构?前端架构师需要做什么?

回答思路

1. 什么是前端架构

前端架构是对前端系统的整体设计和组织方式,回答"代码怎么组织、系统怎么拆分、技术怎么选型"这三个核心问题。

一句话总结

前端架构 = 在项目约束条件下,做出最合理的技术决策,并确保这些决策能长期支撑业务发展。

2. 前端架构的核心维度

技术选型

不同场景下的选型考量:

场景推荐方案考量因素
企业管理后台React + Ant Design + UmiJS组件生态、开箱即用
C 端营销页Next.js / NuxtSEO、首屏性能
跨端应用React Native / Flutter复用率、性能
低代码平台React + 自研引擎灵活性、扩展性
大型多团队微前端 + Monorepo团队自治、独立部署

应用架构

典型的分层架构
// 📁 src/
// ├── pages/ # 页面层(路由入口)
// ├── features/ # 功能模块(按业务拆分)
// │ ├── auth/
// │ │ ├── components/ # 模块内组件
// │ │ ├── hooks/ # 模块内 Hooks
// │ │ ├── services/ # API 调用
// │ │ ├── stores/ # 状态管理
// │ │ └── types/ # 类型定义
// │ └── dashboard/
// ├── shared/ # 共享层(跨模块复用)
// │ ├── components/ # 通用组件
// │ ├── hooks/ # 通用 Hooks
// │ ├── utils/ # 工具函数
// │ └── constants/ # 常量
// ├── services/ # 数据层(API 抽象)
// └── app/ # 应用层(全局配置)

核心原则:

  • 按功能/领域组织(Feature-based),而非按类型组织
  • 单向依赖:pages → features → shared → services
  • 关注点分离:UI、状态、数据获取各自独立

状态管理架构

状态分层策略
// 1. 局部状态 —— useState / useReducer
const [isOpen, setIsOpen] = useState(false);

// 2. 共享状态 —— Zustand / Jotai(轻量)
const useAuthStore = create<AuthState>((set) => ({
user: null,
login: async (credentials) => {
const user = await authService.login(credentials);
set({ user });
},
}));

// 3. 服务端状态 —— TanStack Query(数据缓存)
const { data, isLoading } = useQuery({
queryKey: ['users', page],
queryFn: () => userService.getList(page),
staleTime: 5 * 60 * 1000,
});

// 4. URL 状态 —— 路由参数
const searchParams = useSearchParams();
const tab = searchParams.get('tab');
状态管理的黄金法则

能用局部状态就不用全局状态,能用 URL 状态就不用内存状态,服务端数据用专门的缓存库管理。

数据层抽象

API 层设计
// services/http.ts —— 统一请求封装
class HttpClient {
private instance: AxiosInstance;

constructor(config: AxiosRequestConfig) {
this.instance = axios.create(config);
this.setupInterceptors();
}

private setupInterceptors(): void {
// 请求拦截:注入 token
this.instance.interceptors.request.use((config) => {
const token = authStore.getState().token;
if (token) config.headers.Authorization = `Bearer ${token}`;
return config;
});

// 响应拦截:统一错误处理
this.instance.interceptors.response.use(
(res) => res.data,
(err) => {
if (err.response?.status === 401) authStore.getState().logout();
return Promise.reject(err);
}
);
}

get<T>(url: string, params?: Record<string, unknown>): Promise<T> {
return this.instance.get(url, { params });
}

post<T>(url: string, data?: unknown): Promise<T> {
return this.instance.post(url, data);
}
}

export const apiClient = new HttpClient({ baseURL: '/api' });

3. 前端架构师的职责

核心能力:

  1. 技术广度:了解各种技术方案的优缺点
  2. 技术深度:能深入分析性能瓶颈、设计复杂模块
  3. 业务理解:架构服务于业务,脱离业务的架构没有意义
  4. 沟通协调:推动技术方案在团队中落地

4. 架构决策的核心原则

原则说明反例
适度设计满足当前需求 + 考虑可预见的扩展两人项目上微前端
技术服务业务技术选型考虑业务场景和团队能力只因"新"就引入
渐进式演进架构应该能平滑升级推倒重来式重构
约定大于配置减少决策成本,统一心智模型每个项目结构都不同
可观测性系统出问题能快速定位没有监控就上线

常见面试问题

Q1: 如何设计新项目的前端架构?

答案

设计步骤:

  1. 需求分析:了解业务场景、用户规模、性能要求
  2. 约束评估:团队规模、技术栈偏好、工期限制
  3. 技术选型:框架、UI 库、状态管理、构建工具
  4. 架构设计:目录结构、模块划分、数据流设计
  5. 基建规划:CI/CD、代码规范、测试策略
  6. 文档输出:技术方案文档、架构图

关键思路:不要追求"最好的"架构,而是追求"最合适的"架构

Q2: 大型前端项目如何拆分?

答案

三种常见拆分策略:

1. 按业务域拆分(推荐)
// Monorepo + Feature 模块
// packages/
// shared/ # 共享包
// feature-auth/ # 认证模块
// feature-dashboard/ # 仪表盘
// feature-settings/ # 设置
// app-web/ # Web 入口(组装各模块)
2. 微前端拆分
// 适用于多团队独立开发
// main-app/ → 主应用(基座)
// app-order/ → 订单子应用(团队 A)
// app-user/ → 用户子应用(团队 B)
// app-report/ → 报表子应用(团队 C)
3. 按页面/路由拆分
// 配合代码分割
const OrderPage = lazy(() => import('./pages/Order'));
const UserPage = lazy(() => import('./pages/User'));

选择依据:团队是否需要独立部署 → 微前端;同一团队多模块 → Monorepo;简单应用 → 路由分割。

Q3: 如何处理前端项目的技术债?

答案

  1. 识别债务:对代码进行审计,标记技术债(如 // TODO: TECH-DEBT
  2. 评估优先级:按影响范围和修复成本排列
  3. 渐进偿还:每个迭代预留 10-20% 时间处理技术债
  4. 预防新债:通过 Code Review、Lint 规则、架构规范减少新增债务
  5. 量化跟踪:在项目管理工具中追踪技术债 issue
警告

技术债不可能完全消除,关键是控制在可接受范围内,避免积累到影响业务迭代速度。

Q4: 前端架构和后端架构有什么区别?

答案

维度前端架构后端架构
关注点用户体验、渲染性能、交互数据一致性、高可用、高并发
状态管理客户端状态 + 服务端缓存数据库 + 分布式缓存
部署CDN 静态资源 + SSR 服务多实例 + 负载均衡
挑战浏览器兼容、网络环境多样数据一致性、分布式事务
扩展方式代码分割、懒加载水平扩展、微服务

共同点:都需要考虑可维护性、可扩展性、可测试性

Q5: 如何评估一个前端架构的好坏?

答案

从五个维度评估:

  1. 开发效率:新功能开发速度、新人上手时间
  2. 可维护性:修改一处功能是否需要改动多个文件
  3. 性能表现:首屏时间、交互响应速度、Core Web Vitals
  4. 可扩展性:新增功能模块是否容易、系统是否能平滑演进
  5. 团队适配:团队是否能理解和执行,不需要架构师才能开发
提示

最好的架构是团队能驾驭的架构。过度设计和设计不足同样有害。


相关链接