对于没有系统编程背景的人,刚开始使用 AI Coding 工具构建产品时,最容易犯的错误就是一上来就提需求,让 AI 直接编写代码。这样做在编写简单脚本或小页面时问题不大,但一旦是稍微复杂的产品,随着功能增长、代码量和模块增多,代码就会变得越来越混乱。尤其是交给 AI 来写,更容易堆出“屎山代码”。如果前期不做好项目结构的规划与规范,它就容易“随意发挥”(freestyle);写得越快,后期的可维护性往往越差。

友情提醒

刚进入产品构建或初次接触一个新项目的同学,最重要的学习环节:先了解并熟悉项目结构。

为什么要在开发一个项目之前,最好初始化?

一言以蔽之:建立项目结构的规范,保障项目代码的可维护性。

什么是初始化?

“初始化”指的是在正式写业务代码前完成的“打地基”步骤。以前端项目(Next.js + Tailwind CSS + shadcn/ui + Framer Motion)为例,通常包括:

  • 生成基础项目结构(通过脚手架工具,如 create-next-app)
  • 配置 TypeScript、ESLint、Prettier(保证代码规范与可维护性)
  • 安装并配置 Tailwind CSS(原子化样式)
  • 安装并初始化 shadcn/ui(高质量 UI 组件)
  • 安装 Framer Motion(动画库),并处理其与 Next.js App Router 及客户端组件的配合
  • 建立 Git 版本管理并配置忽略文件
  • 准备环境变量文件

一个完全不懂的规划自己项目结构的人,应该如何初始化自己的项目结构?

对于刚入坑 AI Coding 的人来说,最容易忽略的一点就是项目结构的规划。如果不知道如何规划项目结构,一般有两种方法:

  1. 根据你项目所使用的技术栈,通过标准化的命令行指令,来初始化自己的项目,搭建一个初步的项目结构。

    • 例如 Next.js 项目,可以通过执行以下命令进行初始化:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    npx create-next-app@latest my-app \
    --typescript \
    --eslint \
    --tailwind \
    --src-dir \
    --app \
    --import-alias "@/*"

    解释一下这段命令行指令

    * npx create-next-app@latest:使用 npx 临时执行最新版本的 create-next-app(不会全局安装)。
    * my-app:要创建的项目目录名(会在当前目录创建名为 my-app 的文件夹)。
    * --typescript:初始化为 TypeScript 项目(生成 tsconfig、.tsx 文件等)。
    * --eslint:自动配置 ESLint(基本 lint 规则)。
    * --tailwind:自动添加并配置 Tailwind CSS。
    * --src-dir:把源码放在 src/ 目录下(而不是根目录)。
    * --app:启用 Next.js 的 app Router(app/ 目录结构)。
    * --import-alias "@/*":在 tsconfig.json/jsconfig.json 中生成路径别名 "@/*" -> "src/*"(方便 import "@/components/...")。

  2. 在开始撰写代码之前,先让 AI 根据项目的技术栈和需求,进行初步的项目规划。

友情提示:对于此前没有进行过项目规划的朋友,在完成项目结构的初步搭建后,最好让 AI 生成一份《项目结构说明书》,对结构规范加以说明。该文件可以放到项目根目录的 docs/ 文件夹下(例如:docs/structure-guide.md)。

清晰和明确的项目结构到底有什么好处?

一个产品的项目结构,并不是简单的“文件夹分类”,它是一套约定好的“信息组织规则”,无论是人还是工具(AI、编译器、打包工具),都需要通过这套规则理解代码逻辑、依赖关系和功能边界。

一个清晰和明确的项目结构会有哪些重要的好处?

  1. 降低“认知成本”。能够让人和 AI 快速了解到这个项目框架,并快速定位到代码。它就像是一个好的目录文件一样。

  2. 帮助理解上下文。AI 生成好的代码的前提是“理解上下文”——如果项目结构清晰明确,比如你只需要提示 AI 在src/components/Button 下写一个按钮组件,它就能够精准生成并自动关联依赖;如果结构随意,AI 无法判断“新代码该放在哪,该引用哪个文件夹的文件”,这样就很容易生成重复代码(比如重复写同一个工具函数)或者路径引入错误,然后就累计出“屎山代码”。

  3. 让 AI 生成的代码规范,保障可维护。AI 本身不具有“长期项目规划能力”,若没有结构约束,AI 会为了快速实现功能,就信马由缰,“哪里有空就往哪里写”,在后续迭代的时候,新增代码会不断叠加在混乱的基础上,最终导致代码完全无法维护。

  4. 适配工具链,确保项目能够正常运行、打包和部署。现代项目开发需要依赖大量工具(比如前端的 Webpack/Vite、后端的 Node.js/Java 框架、版本控制 Git),这些工具的正确运行都需要遵循“约定的项目结构”,才能工作。

    1. 例如前端 Vite 默认会从 src/main.js 入口文件开始打包,若你随意把入口文件改名为 “start.js” 且不配置路径,打包时会直接报错;
    2. 后端 Spring Boot 框架默认扫描 com.example.demo.controller 路径下的接口,若你随意更改 controller 文件夹名,接口会无法被识别,导致服务启动后无法访问。

    若结构不规范,不仅工具会失效,甚至可能出现 “本地能运行、部署到服务器就报错” 的问题(比如路径引用错误),排查起来极其耗时。

总之,项目结构的核心价值是 “建立规则,降低混乱”—— 对人而言,它是 “导航地图”;对 AI 而言,它是 “约束框架”;对工具而言,它是 “工作协议”。而 “不随意更改结构或文件名”,本质是维护这套规则的有效性,避免项目从 “可控的工程” 沦为 “不可维护的代码垃圾”。