跳转到内容

4.5 一个前端项目由哪些文件组成

一、本节你会做出什么

你会打开 2.2 建的那个真实项目,把里面每个文件归入三类:我常改的、偶尔改的、永远别手动动的。

📷 效果位:项目目录树,三种颜色标注的文件分类

为什么这一节重要:第一次打开 AI 生成的项目,看到二十几个文件和文件夹,是很多人放弃的瞬间。 其实绝大多数文件你一辈子都不用打开。这一节就是帮你划清这条线——知道该看哪三个文件,剩下的全部无视。


二、开始前你需要

  • 已完成 4.4
  • 已完成 2.2,手上有 hello-node 项目(删了的话回 2.2 第 5 步重建)
  • 会用终端 cd 和 ls(2.1)

三、跟着做

第 1 步:先用眼睛看一遍

终端窗口
cd ~/Documents/ai-course/hello-node # 换成你的路径
ls

你会看到大概这些(版本不同会略有差异):

hello-node/
├── app/ ← 👈 你的页面都在这里
│ ├── page.tsx ← 👈 首页
│ ├── layout.tsx ← 👈 所有页面的外壳
│ └── globals.css ← 全局样式
├── public/ ← 👈 图片等静态文件
├── node_modules/ ← ⛔ 几百个依赖包,永远别碰
├── package.json ← 👈 项目的"身份证 + 零件清单"
├── pnpm-lock.yaml ← ⛔ 自动生成,别手改
├── next.config.ts ← ⚙️ 框架配置
├── tsconfig.json ← ⚙️ TypeScript 配置
├── .gitignore ← ⚙️ Git 忽略清单(2.3 讲过)
└── README.md ← 项目说明

用更好看的方式再看一次(跳过 node_modules,否则会刷屏几万行):

终端窗口
ls -a # 包括隐藏文件
ls app # 看 app 里有什么

📷 截图位 1:终端里 ls -a 的输出

第 2 步:三个你真正要打开的文件

20 多个文件里,日常只有三个值得你关心。

① app/page.tsx —— 首页

这是你改得最多的文件。 打开它看看(用编辑器,或 cat app/page.tsx)。

你会看到 4.2 学的 HTML 标签(<div> <h1> <main>)混在 JS 里,带着 4.3 学的 Tailwind class。

这种“HTML 长在 JS 里”的写法叫 JSX,4.6 会讲。现在你只要知道:想改首页内容,就是改这个文件。

② app/layout.tsx —— 所有页面共用的外壳

这是最容易被忽略、但很关键的一个文件。

它里面放的是“每一页都有的东西”:

放什么 为什么放这儿
网页标题(浏览器标签页上的字) 每页都要
顶部导航 Header 每页都要
页脚 Footer 每页都要
全局字体、主题 每页都要

🔑 一条实用判断: 只在某一页出现的 → 改 page.tsx;每一页都出现的 → 改 layout.tsx。

新手常犯的错:想改导航栏,却在 page.tsx 里翻半天找不到——因为它在 layout 里。

③ package.json —— 身份证 + 零件清单 + 命令表

打开它:

终端窗口
cat package.json

重点看两段:

{
"scripts": {
"dev": "next dev", ← 本地开发(2.2 跑的 pnpm dev 就是这个)
"build": "next build", ← 打包,部署时用
"start": "next start"
},
"dependencies": {
"next": "...", ← 这个项目用到的"零件"
"react": "...",
"react-dom": "..."
}
}
段落 是什么 怎么用
scripts 命令表 里面写了 dev,你就能跑 pnpm dev。不知道项目怎么启动,先看这里
dependencies 项目运行必需的包 看一眼有哪些,知道项目用了什么技术
devDependencies 只在开发时用的包 一般不用管

🔑 3.5 讲过「不要擅自新增依赖包」,dependencies 就是检查这件事的地方。 AI 改完之后 git diff 显示 package.json 变了 → 它装了新东西,去问清为什么。

第 3 步:三个文件夹

文件夹 放什么 你的操作
app/ 所有页面和路由。这里的目录结构直接决定网址长什么样(4.8 细讲) 常进
public/ 图片、图标、字体等静态文件。放这里的东西,用 /文件名 就能访问 放素材时进
node_modules/ 下载下来的几百个依赖包 ⛔ 永远不要打开、不要手改

关于 public/,一个常见困惑:

文件放在: public/images/panda.jpg
代码里写: /images/panda.jpg ← 注意:没有 public

⚠️ 路径里不要带 public。这是图片裂掉的头号原因(4.1 定位表里那条「图片 404」)。

关于 node_modules/,重申 2.2 的话:

它动辄几百 MB,是可再生资源。删掉之后 pnpm install 就回来了。永远不要备份它、不要提交它(.gitignore 已经帮你排除了)。

第 4 步:剩下那些配置文件——认识就行,不用懂

文件 干什么 你需要做什么
next.config.ts 框架配置(图片域名、重定向等) AI 让你改时再看
tsconfig.json TypeScript 配置 基本不用动
postcss.config.mjs / tailwind 配置 样式工具链配置 改主题色时可能会碰
pnpm-lock.yaml 锁定每个包的精确版本 ⛔ 别手改,但要提交到 Git
.gitignore Git 忽略清单(2.3 讲过) 偶尔加一行
README.md 项目说明 建议写,给未来的自己看

💡 关于 pnpm-lock.yaml:它看着像垃圾文件,但必须提交到 Git。它保证你、你的队友、部署平台装的是完全相同的版本。少了它,就会出现“我这儿好的,部署就坏”(4.1 定位表最后一行)。

第 5 步:⚠️ .env.local —— 现在还没有,但你必须先认识它

你的 hello-node 里现在没有这个文件。但从第 7 章起,它会出现,而且是全课最危险的一个文件。

它长这样:

ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx
DATABASE_URL=postgres://...

里面装的是密钥。 三条规矩现在就记住:

规矩 说明
① 绝不提交到 Git .gitignore 默认已排除 .env*(2.3 讲过)。但 AI 从零生成的项目要自己确认
② 改完要重启 改了 .env.local 必须重启 pnpm dev,否则不生效。这是个高频困惑点
③ 泄露了就换钥匙 不是删文件,是去平台把 Key 作废重新生成(2.4 讲过,10.1 详讲)

🔑 现在就做一件事:打开 hello-node/.gitignore,确认里面有 .env* 这样的行。

终端窗口
cat .gitignore | grep env

有输出就是安全的。

第 6 步:文件地图(本节交付物)

把上面的内容压成一张表。存下来,第一次进陌生项目时对照着看。

分类 文件 / 文件夹 说明
🟢 常改 app/page.tsx 首页内容
🟢 常改 app/*/page.tsx 其他页面
🟢 常改 app/layout.tsx 导航、页脚、页面标题
🟢 常改 components/ 组件(4.9 会建)
🟢 常改 public/ 图片素材
🟡 偶尔改 package.json 看命令和依赖;装包用命令,不手改
🟡 偶尔改 app/globals.css 全局样式
🟡 偶尔改 .gitignore 加忽略项
🟡 偶尔改 next.config.ts / tailwind 配置 AI 指导时改
🔴 只看不改 .env.local 密钥,手动维护,绝不提交
⛔ 永远别动 node_modules/ 可再生,pnpm install 会重建
⛔ 永远别动 pnpm-lock.yaml 自动生成,但要提交 Git
⛔ 永远别动 .next/ / dist/ 构建产物,每次 build 重新生成

💡 一条省心的规矩: 🟢 里的文件放心让 AI 改;🟡 和 🔴 的改动,在 git diff 里要停下来看一眼;⛔ 的出现在 diff 里,说明 .gitignore 配错了。

第 7 步:动手——让 AI 给你画一遍

这是一个很实用的习惯动作,以后每进一个陌生项目都可以用:

在项目目录里启动你的 AI 工具(Pi 就 cd 进去敲 pi),说:

先不要改任何文件。请扫一遍这个项目,给我一张目录说明表:
每个文件/文件夹一行,说明它是干什么的,以及我作为新手会不会需要改它。
按「常改 / 偶尔改 / 别动」给我分三组。

然后和你刚才那张表对照。 对得上,说明你已经看懂这个项目的骨架了。

📷 截图位 2:AI 生成的目录说明表

🔑 4.11 节会把这个动作扩展成一套完整方法:拿到一个完全陌生的项目,五分钟说清它在干什么。本节的文件地图是那套方法的第一步。


四、完成的标志是

  • 我用 ls / ls -a 看过项目根目录和 app/ 里有什么
  • 我知道改首页内容是改 app/page.tsx
  • 我知道改导航栏/页脚要去 app/layout.tsx(“每页都有的东西在 layout 里”)
  • 我打开过 package.json,知道 scripts 是命令表、dependencies 是零件清单
  • 我知道 git diff 里 package.json 变了意味着装了新包,要问清楚
  • 我知道图片放 public/,但代码里引用时路径不带 public
  • 我知道 node_modules/ 是可再生资源,永远不手动碰
  • 我知道 pnpm-lock.yaml 不能手改,但必须提交 Git
  • 我确认了 .gitignore 里排除了 .env*
  • 我知道改完 .env.local 要重启 dev 才生效
  • 我存好了第 6 步那张文件地图
  • 我让 AI 生成了一遍目录说明,并和自己的理解对照过

五、卡住了看这里

Q:我的项目结构和课程里写的不一样。 正常。版本不同、创建时选项不同,都会有差异。不变的是那条判断逻辑:页面在 app/(或 src/app/、pages/)、清单是 package.json、依赖在 node_modules/。结构对不上就用第 7 步让 AI 给你画一遍——这比记死某个版本的目录结构有用得多。

Q:我看到项目里有 src/ 目录,app/ 在它里面。 这是另一种常见组织方式(创建项目时的一个选项)。src/app/page.tsx 和 app/page.tsx 作用完全一样,只是多包了一层。

Q:.tsx 和 .jsx 有什么区别?.ts 和 .js 呢? t 代表 TypeScript —— 带类型检查的 JavaScript。x 代表里面能写 JSX(HTML 式的标签)。

后缀 是什么
.js 普通 JavaScript
.ts TypeScript
.jsx 能写标签的 JS
.tsx 能写标签的 TypeScript(本课项目用这个)

你不需要学 TypeScript。 它的价值是让 AI 写出错误更少的代码,对你来说只是“文件后缀不一样”。

Q:node_modules 占了 500MB,能删吗? 能。删完在项目目录 pnpm install 就回来了(2.2 讲过)。长期不用的旧项目,删掉它能省不少空间。

Q:我不小心改了 pnpm-lock.yaml / 删了 node_modules 里的东西,项目启动不了了。 rm -rf node_modules 然后 pnpm install 重装。lock 文件被改坏了的话,用 2.3 的后悔药:git restore pnpm-lock.yaml。

Q:这些文件我要全记住吗? 不用。只要记住三个文件(page.tsx / layout.tsx / package.json)和两条规矩(图片放 public 但路径不带 public、每页都有的东西在 layout),其余查表。


六、本节提示词

① 项目导览(进任何陌生项目的第一句话,4.11 会升级这条):

先不要修改任何文件。
请扫一遍当前项目,给我一张目录说明表(markdown 表格):
| 文件/文件夹 | 作用 | 我作为新手会改它吗 |
要求:
1. 跳过 node_modules 和构建产物,不要列里面的东西;
2. 按「常改 / 偶尔改 / 别动」分三组;
3. 特别指出:改首页内容该动哪个文件、改导航栏该动哪个文件;
4. 告诉我这个项目怎么启动(从 package.json 的 scripts 里读,不要猜);
5. 如果有 .env 相关文件,提醒我注意什么。
用中文,说人话。

② 安全体检(文件层面):

请检查当前项目的文件配置是否安全:
1. `.gitignore` 里有没有排除 `node_modules`、构建产物、以及**所有 `.env` 系列文件**?
2. 有没有任何文件里**明文写着密钥或密码**?(搜一下 api_key、secret、password、token 这类字样)
3. 有没有本该被忽略、却已经被 Git 跟踪的文件?
4. `public/` 目录里有没有不该公开的东西?(放在 public 的文件任何人都能通过网址访问到)
逐条给结果,有问题的指出具体文件和行号,并告诉我怎么修。

③ 这个文件是干什么的(遇到不认识的文件时):

我的项目里有个文件叫 【文件名】,我不知道它是干什么的。
内容是:
【粘贴内容,太长就贴前 30 行】
请告诉我:
1. 它是干什么的,是谁生成的(我手写的?工具自动生成的?);
2. 我需要改它吗?什么情况下会需要改?
3. 它应该提交到 Git 吗?
4. 如果我把它删了会发生什么?能恢复吗?

上一节 ← 4.4 JavaScript 基础 下一节 → 4.6 为什么需要前端框架:React 在替你做什么