- 初期陷阱:功能优先,架构靠后
很多项目在起步阶段都会陷入同一个误区:快速交付 MVP(最小可行产品),忽视代码组织。结果是:
所有逻辑堆在一个组件里;
状态管理混乱,父子组件层层透传;
API 调用散落在各个角落;
样式随意嵌套,全局污染严重。
这种“技术债”短期内看似无害,但随着需求迭代,维护成本会指数级上升。
- 分层架构:让每一层各司其职
借鉴后端开发的经验,前端也可以采用分层思想。一个典型的可维护前端架构通常包含以下几层:
表现层(UI Layer)
负责渲染界面,不包含业务逻辑。组件应尽可能“傻瓜化”(dumb components),只接收 props 并展示。逻辑层(Logic Layer)
处理用户交互、状态变更和副作用(如数据获取)。可以使用自定义 Hook(React)或组合式函数(Vue)封装。数据层(Data Layer)
统一管理远程数据与本地状态。推荐使用 React Query、SWR、TanStack Query 或 Vuex/Pinia 等工具,避免手动管理 loading/error 状态。服务层(Service Layer)
封装 API 调用,提供语义化的接口方法。例如:
Ts
编辑
// services/userService.ts
export const fetchUserProfile = (id: string) =>
api.get(/users/${id});
export const updateUserProfile = (data: User) =>
api.put('/users/me', data);
这样,上层逻辑只需调用 fetchUserProfile(id),而无需关心 URL、请求头或错误处理细节。
- 文件结构:按功能而非类型组织
传统做法常按文件类型划分目录(如 /components, /utils, /hooks),但这会导致跨功能修改时需要频繁切换目录。更推荐 按功能模块(feature-based)组织:
Text
编辑
src/
├── features/
│ ├── auth/
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── services/
│ │ └── types.ts
│ └── dashboard/
│ ├── ...
├── shared/
│ ├── ui/ // 公共 UI 组件
│ ├── lib/ // 工具函数
│ └── api/ // 通用 API 配置
└── app/
├── layout.tsx
└── routes.tsx
这种结构让每个功能模块高度内聚,便于团队并行开发和代码复用。
- 自动化与约定优于配置
再好的架构也需要工程化保障。建议引入:
ESLint + Prettier:统一代码风格,自动修复低级错误;
TypeScript:通过静态类型提前捕获潜在 bug;
单元测试 + E2E 测试:关键逻辑覆盖测试,提升重构信心;
提交规范(如 Conventional Commits):便于生成 changelog 和语义化版本。
- 小步重构,持续演进
架构不是一蹴而就的。与其等待“完美设计”,不如在日常开发中持续小步优化:
每次新增功能时,思考是否破坏了现有边界;
遇到重复代码,立即抽象成共享模块;
定期进行代码审查,关注架构一致性。
结语
前端架构的目标不是追求炫技,而是降低认知负荷、提升团队效率、延长项目生命周期。当你下次写代码时,不妨多问一句:“如果三个月后有人接手这段代码,他能轻松理解并修改吗?”
答案,就是你架构演进的方向。