如何用分层架构与TypeScript打造「稳如磐石」的前端应用

107 阅读3分钟

如何用分层架构与TypeScript打造「稳如磐石」的前端应用

—— 复杂业务场景下的可持续代码实践

前端业务复杂度飙升的今天,“写需求”容易,“稳定迭代”难。分享一套让团队协作效率提升 40% 的架构心法。

痛点直击:为什么前端容易变成“屎山”?

bash

复制

下载

1. 全局状态滥用导致数据流混乱(Redux 全家桶警告)
2. 组件边界模糊引发连锁修改(改 AB 的经典问题)
3. 类型安全缺失产生运行时“黑洞”(undefined is not a function)

一、核心原则:分层架构(Layer Architecture)

将前端应用拆分为四层责任链,每层仅与直接下层通信:

markdown

复制

下载

| 展示层 (UI)     | ← 只负责渲染视图/交互  
| 业务逻辑层 (Model) | ← 纯函数处理核心逻辑  
| 状态管理层 (State) | ← 管理应用数据流  
| 基础设施层 (Infra) | ← 网络请求/工具库封装  

优势
✅ 修改 UI 不影响业务逻辑
✅ 状态管理可替换(Redux → Pinia 无痛迁移)
✅ 单元测试覆盖率提升至 70%+


二、TypeScript:类型即文档

避免 any 的进阶技巧

typescript

复制

下载

// 用泛型约束 API 响应结构  
type ApiResponse<T> = {
  code: number;
  data: T; // 业务数据动态类型化
  message?: string;
}

// 业务实体精确建模  
interface User {
  id: string;
  name: string;
  permissions: ("admin" | "editor")[]; // 联合类型防误写
}

// 提取 API 参数类型  
type GetUserParams = Pick<Required<ApiParams>, "userId" | "orgId">;

配合 zod 做运行时校验,实现  “编译时 + 运行时”双保险


三、状态管理:避免全局 Store 的陷阱

按业务域切分状态模块

javascript

复制

下载

// 传统写法 ❌  
const store = createStore({  
  user: {...},  
  product: {...} // 所有状态挤在一起  
});

// 现代方案 ✅  
export const useUserStore = defineStore("user", { ... });  
export const useProductStore = defineStore("product", { ... });

黄金法则
🔹 组件内状态优先使用 useState/ref
🔹 跨组件状态用 Props + 事件传递
🔹 全局状态仅用于真正跨应用级数据


四、依赖倒置:解耦第三方库

案例:抽离 Axios 依赖

typescript

复制

下载

// 基础设施层 → httpClient.ts  
export interface HttpClient {  
  get<T>(url: string): Promise<T>;  
}  

// 业务层注入实现  
const fetchUser = (http: HttpClient) => {  
  return http.get<User>("/api/user");  
}

// 测试时可传入 Mock 实现  
test("fetchUser", async () => {  
  const mockHttp = { get: jest.fn() };  
  await fetchUser(mockHttp);  
  expect(mockHttp.get).toBeCalledWith("/api/user");  
});

五、效能提升:自动化代码守卫

  1. ESLint 规则强化

json

复制

下载

{ 
  "rules": {  
    "no-relative-imports": "error", // 禁止跨层引用  
    "max-lines-per-function": ["warn", 50] // 函数长度限制
  }
}
  1. Husky + lint-staged 拦截问题代码
  2. CI 流水线集成类型检查与测试覆盖率阈值

结语:稳定性的本质是“可控”

当需求变更时,你能清晰评估影响范围;当新人接手时,文档藏在类型定义里;当线上报错时,类型系统挡住 30% 低级错误 —— 这便是「稳」的底气。

拓展学习