为什么需要多目录?从混乱到有序的必经之路

说实话,我刚开始写代码那会儿,根本不在乎目录结构。一个项目,所有文件往 src 里一扔,完事。直到有一次,一个中型项目让我彻底崩溃——找配置文件花了半小时,测试代码和生产代码混在一起,文档散落在各个角落。嗯,那次之后,我老老实实开始研究多目录设计。

你可能会问:不就是个文件夹吗,至于这么讲究?我告诉你,至于。一个清晰的项目结构,就像一间整洁的厨房。你想炒菜,锅在哪、调料在哪、配菜在哪,一目了然。反之,你懂的。

单体项目 vs 模块化项目

先聊聊单体项目。说白了,就是所有代码堆在一个大仓库里。小项目还行,一旦规模上来,问题就来了:

  • 耦合严重——改一行代码,可能牵动整个项目
  • 构建缓慢——每次编译都要处理全部代码
  • 团队协作困难——多人同时改同一个模块,冲突不断

我记得有个项目,团队从3人扩张到15人,单体结构直接成了瓶颈。每次合并代码,光解决冲突就要半天。后来我们拆成了模块化项目,每个模块独立目录、独立构建、独立测试。效果立竿见影。

模块化项目的好处很明显:

  • 职责清晰——每个目录只做一件事
  • 独立演进——模块之间通过接口通信,互不干扰
  • 复用性强——公共模块可以轻松被其他项目引用

核心观点:多目录不是花架子,它是应对复杂度的第一道防线。项目越大,目录结构越重要。

经典目录结构剖析

一个成熟的项目,通常包含以下几个核心目录。我一个个说,你感受一下。

src —— 源码的核心

这是你的主战场。所有业务代码、逻辑实现都放在这里。我个人习惯按功能模块再细分,比如 src/user、src/order、src/payment。这样找代码快,新人上手也快。

src/
├── user/
│   ├── UserController.js
│   ├── UserService.js
│   └── UserModel.js
├── order/
│   ├── OrderController.js
│   ├── OrderService.js
│   └── OrderModel.js
└── payment/
    ├── PaymentController.js
    ├── PaymentService.js
    └── PaymentModel.js

小技巧:src 里不要放配置文件、不要放测试代码、不要放文档。保持纯净,只放生产代码。

lib —— 公共库与工具

有些代码,多个模块都会用到。比如日志工具、日期格式化、加密函数。这些放哪?放 lib。它就像你的工具箱,随时取用。

我曾经犯过一个错误:把工具函数散落在各个模块里,结果同一个功能写了三遍。后来统一放到 lib,清爽多了。

lib/
├── logger.js
├── dateUtils.js
├── cryptoHelper.js
└── httpClient.js

tests —— 测试的根据地

测试代码和生产代码分开,这是基本素养。为什么?因为测试代码不需要部署到生产环境。你想想看,如果把测试代码混在 src 里,打包时还得费劲排除,多麻烦。

我建议 tests 目录的结构和 src 保持一致。这样找测试文件就像照镜子,省心。

tests/
├── unit/
│   ├── user.test.js
│   └── order.test.js
├── integration/
│   └── api.test.js
└── e2e/
    └── fullFlow.test.js

docs —— 文档的归宿

文档这东西,没人爱写,但没人能缺。我见过最惨的情况:项目交接时,文档找不到,代码又没注释,新人直接崩溃。

docs 目录可以放:

  • API 文档
  • 架构设计文档
  • 部署手册
  • 变更日志

注意:文档要跟代码一起维护。代码改了,文档也得更新。我曾经因为文档没更新,导致新同事按旧文档部署,出了线上事故。血的教训。

scripts —— 自动化脚本

构建、部署、数据迁移、代码检查……这些重复性工作,写成脚本放到 scripts 目录。我习惯用 shell 脚本或 Python 脚本,简单直接。

scripts/
├── build.sh
├── deploy.sh
├── migrate.sh
└── lint.sh

config —— 配置的中心

数据库连接、API 密钥、环境变量……这些配置信息,统一放到 config 目录。不同环境(开发、测试、生产)可以有不同的配置文件。

config/
├── development.json
├── testing.json
├── production.json
└── default.json

建议:敏感信息(如密码、密钥)不要硬编码在配置文件里。用环境变量或密钥管理服务。安全第一。

一张图看懂整体结构

下面这张图,展示了经典多目录结构的全貌。你可以把它当作模板,直接套用。

项目根目录 src/ lib/ tests/ docs/ scripts/ config/ 每个目录各司其职,互不干扰 src 管业务,lib 管工具,tests 管质量 docs 管文档,scripts 管自动化,config 管配置

总结一下

多目录结构,说白了就是「分而治之」。把大问题拆成小问题,每个小问题放在对应的目录里。这样做的好处:

  1. 好找——想找什么,直奔对应目录
  2. 好改——改一个模块,不影响其他模块
  3. 好测——测试代码和生产代码分离,清晰明了
  4. 好部署——只打包需要的代码,减少体积

我见过太多项目,一开始图省事,所有文件堆在一起。等到项目膨胀到一定程度,重构成本高得吓人。所以,从一开始就规划好目录结构,这是最划算的投资。

一句话记住:目录结构不是写给别人看的,是写给自己未来的。你现在的规划,决定了你三个月后的心情。

下一章,我会带你手把手搭建一个真实的多目录项目。到时候,你会看到这些目录怎么落地、怎么配合。准备好了吗?