大家在做react
项目的时候或许看过类似下面那张图,里面数量繁多的文件是否也让你感到头疼?😣😖😫这些文件的作用又是什么呢?这篇文章我们通过举例子🌰的方式着重来讲述React
下各种的用途,在以后需要时让他们在自己的岗位上各司其职。

抽象事物实例化
我们可以把这个文件夹比作一个餐厅,里面每个小文件夹比作一个餐厅的每一个部分功能,它们互相配合就能把"菜品"(网页)呈送到顾客(用户)面前。
外援帮助node_modules
/ 项目依赖------"外部供应商"
在这家餐厅中,你不能所有事情都自己做,需要"依赖"外部供应商去提供各种东西(这些东西是别人做好的,你直接拿来用就可以了):
1. 核心依赖(厨房必备设备)
这些是餐厅运转的基础,就像React项目的核心依赖:
- 炉灶(React):没它你做不了菜(写不了UI)。
- 冰箱(React DOM):存放食材(渲染到浏览器)。
- 刀具(Axios):切菜工具(用来发送HTTP请求)。
➡️没有它们,餐厅根本开不了张!
安装方法:
markdown
npm install react react-dom
2. 功能依赖(特色菜品工具)
这些让餐厅更有竞争力,就像项目里的功能库:
- 咖啡机(React Router):让顾客能点不同饮品(实现页面跳转)。
- 冰淇淋机(Redux):统一管理所有订单(全局状态管理)。
- 空气炸锅(Styled Components):让菜品摆盘更漂亮(CSS-in-JS)
**➡️有了它们,你的餐厅(项目)更专业,更高级!
安装方法:**
markdown
npm install react-router-dom
验证安装是否成功:
检查package.json
:
perl
"dependencies": {
"react-router-dom": "^6.14.0",
"@reduxjs/toolkit": "^1.9.5"
}
👨🍳 开发依赖(员工培训工具)------后厨"培训部"全套清单
这些"工具"顾客永远看不到,但没有它们,厨房分分钟乱成一锅粥。
表格
复制
工具 / 包名 | 专业角色 | 餐厅里的真人真事 | 常见配置 & 口诀 |
---|---|---|---|
ESLint (eslint ) |
代码风格"菜谱"+"卫生条例" | 1. 菜谱规定:番茄必须切丁 1 cm²,禁止拍扁。 | 常见配套: |
Prettier (prettier ) |
菜品摆盘"强迫症量尺" | 无论谁摆盘,盘子边距永远是 2 cm,刀口统一朝 10 点钟方向。 | .prettierrc 里一行 printWidth: 80 就像"盘子直径 8 寸",超出就换行。 |
Husky (husky ) |
值班经理的"每日晨检" | 每次 git commit 前强制跑 ESLint + Prettier,不合格不许进后厨。 |
husky install 后在 .husky/pre-commit 写: |
lint-staged (lint-staged ) |
只检查"今日新买"的食材 | 不翻旧账,只对 git add 的文件做检查,节省时间。 |
package.json 里声明: |
Commitlint (@commitlint/cli ) |
外卖订单备注格式检查 | 订单备注必须写成"口味-辣度-加料",否则厨房看不懂。 | 提交信息强制 <type>: <subject> ,例如 feat: 加辣微辣加香菜 。 |
Stylelint (stylelint ) |
CSS/SCSS 的"摆盘规范" | 颜色变量必须用 --color-primary ,禁止手写 #ff6600 。 |
与 Prettier 配合,样式文件出现红色波浪线就是"摆盘歪了"。 |
Vitest / Jest (vitest / jest ) |
每日"试吃员" | 每道菜出锅前先端给试吃员:分量对不对?味道够不够? | npm run test:watch 保存即跑,红色 ❌ 就是"菜咸了"。 |
@testing-library/react | 顾客视角"试吃" | 模拟顾客拿筷子夹一口,看有没有吃到生姜(Bug)。 | screen.getByRole('button', {name: /提交订单/}) 就像"点单按钮必须看得见"。 |
msw (Mock Service Worker) | "样品菜"模型 | 后端厨师还没上班,先用蜡制模型顶一顶,UI 照样拍照。 | server.use(rest.get('/api/menu', mockHandler)) |
Chromatic / Storybook test-runner | 菜品拍照"对比系统" | 每次改摆盘,自动拍照对比,确保颜色/位置不被意外改动。 | 与 Storybook 连用,CI 里跑 chromatic --project-token=xxx 。 |
cypress / playwright | 整店"神秘顾客" | 真人从进门到买单完整走一遍:扫码、点菜、支付、评价。 | cypress open 弹出浏览器,脚本点点点,录屏留证。 |
concurrently / npm-run-all | 多线程"同步上菜" | 一边跑 dev 服务器,一边跑 mock 服务器,互不耽误。 | "dev": "concurrently "vite" "npm run mock"" |
cross-env | 环境变量"翻译器" | Windows / Mac / Linux 都能识别 NODE_ENV=production 。 |
cross-env NODE_ENV=test jest |
nodemon | 热更新"传菜铃" | mock 服务器改一行,自动重启,不用手动敲命令。 | nodemon mock/server.js |
rimraf | 一键"大扫除" | 打包前把 dist/ 旧盘子全摔碎,再摆新盘。 |
"prebuild": "rimraf dist" |
bundle-analyzer (rollup-plugin-visualizer / webpack-bundle-analyzer ) |
厨房"成本核算" |
🏗️ 建筑结构(文件夹) src
/根目录文件------"后厨区-真正干活的地方"
1️⃣ api/
专业:封装所有HTTP请求(REST/GraphQL),集中管理后端接口调用。 通俗:外卖电话,负责和后端订餐,所有和总部要菜的电话都要从这里拨,换号码只改这一出。
2️⃣ assets/
专业:存放静态资源(图片,字体,全局样式文件等),Webpack\Vite 会对其做哈希命名、压缩。CDN加速等。 通俗:墙上贴的海报、菜单照片。搬店时直接打包带走,不会重拍。
3️⃣ components/
专业:可复用的通用React组件,例如Button、Modal、Card。遵循单一职责、props驱动。 通俗:预制菜包。按钮是"速冻鸡块",哪里需要直接丢进空气炸锅(props 调口味)。
4️⃣ features/
专业:按"业务功能"聚合的模块,内含该功能专属的components、hooks、utils、services。
通俗:店长划分的"档口":
features/auth/
专门做"顾客登记";features/dashboard/
专门做"今日营业报表"。
5️⃣ hooks/
Hook | 专业描述 | 餐厅里的真人真事 |
---|---|---|
useState | 给组件"记忆" | 吧台小黑板写着"今日例汤:番茄牛腩28份"。每卖出一份,数字减1------这就是const [stock,setStock]=useState(38) |
useEffect | 生命周期+副作用 | 厨房定时器:汤炖好就"叮"一声通知服务员。对应useEffect(()=>{ timer=>setInterval(notify,600000);return()=>clearInterval(timer) |
useContext | 跨层级共享数据 | 共享冰箱:厨房、服务员、收银员都能看到"今日特调酱料"的配方,不用一层层口头传。 |
🍳 继续扩展 hooks 真人真事
表格
复制
Hook | 专业描述 | 餐厅里的真人真事 |
---|---|---|
useReducer | 复杂状态机管理,类似 Redux 的轻量版。 | 当"今日例汤"需要根据"库存-预订-加购-退单"四种动作综合计算时,小黑板升级为"智能库存看板",按规则自动加减。 |
useMemo | 缓存昂贵计算结果,依赖不变则不重算。 | 厨师长每天只做一次"高汤",只要原材料不变,就从保温桶里舀,不再重新熬制。 |
useCallback | 缓存函数引用,避免子组件无谓重渲染。 | 服务员给包间递菜单的"手势动作"被拍成教学视频,下次直接播放视频即可,不再重新示范。 |
useRef | 保存可变的、不触发渲染的值(DOM 引用、计时器 ID)。 | 厨房墙上挂着一只"秒表",谁按了都记同一组时间,不按不会刷新菜单。 |
useId | SSR 场景生成唯一 ID,避免 hydration 不匹配。 | 给每份外卖贴"订单号条形码",防止堂食和外卖的订单串号。 |
custom hooks(例:useAuth,useCart) | 提取可复用逻辑,让组件专注于 UI。 | 把"会员验证""购物车统计"写成"标准作业流程(SOP)",新员工培训完就能上岗。 |
🛠️ 一条完整的"菜品生命周期"串起所有岗位
- 顾客扫码进店 → index.html 门面打开。
- 店长按下 main.jsx 电源 → React 厨房通电。
- 服务员根据 App.jsx 菜单 → 把顾客带到对应 pages/ 包间。
- 点单信息通过 features/order/ 档口 → 调用 api/order.js 外卖电话 → 后端厨房接单。
- 做菜过程中 hooks/useStock 智能看板实时减库存 → store/ 广播给所有人。
- 菜做好后 components/Plate/ 统一摆盘 → assets/ 里的品牌 LOGO 贴签。
- 顾客买单 → services/payment.js 对接支付。
- 打烊后 .husky/ 自动跑卫生检查 → README.md 更新"今日流水"。
- 店长把今天所有配置打包成 Dockerfile 移动餐车 → 明天去下一个商圈继续营业。
单页文件(根目录)
表格 | |||
---|---|---|---|
文件 | 专业角色与技术应用 | 通俗解释 | 类比 |
index.html | 应用的入口HT模板模板 ;浏览器加载时解析DOM,挂载根节点<div id="root"> ,为SPA提供渲染锚点 |
店铺门面,唯一的大门 | 客人第一眼看到的门头 |
main.jsx | 应用的JavaScript入口模块 ;调用ReactDOM.createRoot() 完成React应用对DOM的水合(hydrate),并注入全局Provider(Router、Store、Theme). |
开门营业按钮,把厨房(src)接到门面 | 插上电源,灯亮了 |
App.jsx | 根组件(Root Component) ;定义路由出口、全局布局、全局状态Provider树,是整颗React组件树的顶层容器 | 今日菜单总览,所有页面的大框架 | 菜单第一页"本店特色" |
App.css/index.css | 全局样式表;声明CSS变量、重置样式、主题token,作用于整个应用,影响视觉层 | 店铺装修风格(墙纸、灯光颜色) | 中式风格还是西式风格 |
package.json | 项目清单(manifest) ;记录依赖版本、脚本命令、元数据、拱npm/yarn/pnpm进行依赖解析与生命周期管理 | 购物清单:需要哪些食材、调料版本 | "买2斤React、3两Vite" |
package-lock/json | 依赖锁定文件 ;固化依赖树精确版本及完整哈希,确保CI/其他开发者可复现同一依赖环境。 | 购物清单的"拍照留底",锁定版本 | 防止供应商偷偷换货 |
vite.config.js | 构建配置 ;定义Vite的dev server、插件链、路径别名、环境变量、打包策略、实现快速冷启动与HMR。 | 厨房设备说明书(Vite构建工具) | "烤箱200°C预热5分钟" |
eslintconfig.js | 代码质量规则集 通过 ESLint插件和规则声明代码风格、潜在错误检查、集成到Git Hook/CI保持统一规范 | 卫生检查表,代码整洁规范 | "厨师帽必须戴正" |
.env.local | 本地环境变量文件 ;存放敏感或环境相关的键值对(如API_KEY),被Vite注入import.meta.env ,不提交到仓库 |
私房秘密配方(API密钥等) | 锁在抽屉里的独家酱料 |
.gitignore | Git忽略规则 ;声明无需纳入版本控制的文件/目录(node_module、dist、日志),保持仓库干净且体积小 | 垃圾桶标签:哪些垃圾不打包带走 | "烂菜叶别上传到仓库" |
README.md | 项目文档 ;用Markdown描述项目背景,启动命令、目录结构、贡献指南,帮助新成员快速上手或复制项目 | 开店指南:新手如何复制这家店 | "加盟手册" |
✅ 小结(给新入职的你)
- 黄色安全帽区域 :所有带
config
、带.json
、带rc
的文件 → 别乱动,动前请找"店长/架构师"。 - 蓝色围裙区域 :
src/components
&src/features
→ 你每天切菜炒菜的主战场。 - 红色禁区 :
node_modules
→ 千万别手改,出问题直接"重装依赖"比"修 bug"更快。
现在,无论你是新来的"切配小弟"还是"掌勺大厨",拿着这份"餐厅说明书"都能迅速找到自己的工位。祝你编码愉快,永不"烧厨房"!