Skip to content

React 项目实践

如何设计大型 React 项目的目录和模块边界?

面试官关注的不是目录名称,而是模块是否能沿业务领域演进、测试和发布。

适合阶段:高级前端 / 资深前端 / 架构面核心能力:领域建模 · 依赖治理 · 可维护性

面试官想考什么

  • 你如何避免所有代码都堆进 components、hooks 和 utils? 考察领域建模能力。
  • 什么应该放在共享层? 考察复用边界和依赖方向。
  • 如何防止客户端代码依赖服务端或基础设施? 考察工程治理和安全意识。
  • 目录设计如何服务测试和发布? 考察是否考虑长期演进。

一句话回答

text
大型 React 项目应按领域和用例组织业务代码,公共 UI、领域逻辑、服务端访问和基础设施分层,并用依赖规则保证方向稳定。

面试回答详解

这道题的重点不是背一个固定目录,而是说明目录如何承载领域边界。可以采用“路由入口 + 领域模块 + 共享能力 + 基础设施”的结构。

1. 建议的分层方式

text
app/pages -> features/domains -> shared UI/hooks
features -> services/repositories -> API/database adapter
  • 路由层:负责页面组装、参数解析和布局,不承载大量业务规则。
  • 领域层:围绕订单、内容、账户等用例组织状态、组件、校验和 API adapter。
  • 共享层:只放跨领域且契约稳定的 UI、基础 Hook、类型和工具。
  • 基础设施层:封装 HTTP、日志、埋点、配置和第三方 SDK。

2. 关键边界

领域模块可以依赖共享层和基础设施抽象,但共享 UI 不应反向依赖某个业务领域。客户端入口不能导入数据库、私钥或服务端专用模块。通过 ESLint import rules、TypeScript project references 或 monorepo package boundary 固化约束。

3. 工程取舍

按领域拆分适合中大型项目和多人协作;小项目不必为了形式引入过多层。utilshookscomponents 如果没有所有权和命名边界,很快会变成无法迁移的公共垃圾场。

4. 生产落地

每个领域应有入口、类型、测试和错误边界;共享包要有变更记录和兼容策略。用构建依赖图、类型检查、测试覆盖和发布影响范围验证目录设计。

可直接背诵的 30 秒回答

text
我会按业务领域和用例组织大型 React 项目,路由层负责组装,领域层负责业务状态和行为,共享层只放真正稳定的 UI、Hook、类型和工具,基础设施层封装请求、日志和第三方依赖。核心是依赖方向不能反转,客户端不能直接碰服务端资源,并通过 lint、类型、测试和构建依赖图持续治理。

扩展知识

目录治理信号

  • 一个模块是否能被单独测试?
  • 修改一个领域是否会触发全站依赖?
  • 共享层是否出现大量业务判断?
  • 服务端密钥和客户端 bundle 是否有明确隔离?

面试官追问链

追问一:为什么不直接按技术类型分 components/hooks/utils

  • 考察点:是否理解技术分层和领域分层的差异。
  • 回答方向:纯技术分层在小项目可用,但大型项目会造成跨领域耦合;可以在领域内部保留技术子层,顶层仍按业务边界组织。

追问二:如何判断一个组件应该进入公共组件库?

  • 考察点:是否避免过早抽象。
  • 回答方向:至少有稳定语义、多个真实场景、明确 API、行为测试和维护责任,而不是仅仅复制过一次。

追问三:如何自动阻止错误依赖?

  • 考察点:是否能落到工程手段。
  • 回答方向:使用 ESLint boundaries、路径别名约束、独立 package、CI 类型检查和 code review 规则,并对服务端模块做客户端构建保护。

推荐阅读

基于 MIT 协议开源