React 项目骨架把“一万行灾难”拆成“百来个各司其职的小文件”

310 阅读9分钟

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

c7c032f1b9612e976b714bb0b6624e8.png

抽象事物实例化

我们可以把这个文件夹比作一个餐厅,里面每个小文件夹比作一个餐厅的每一个部分功能,它们互相配合就能把“菜品”(网页)呈送到顾客(用户)面前。

外援帮助node_modules/ 项目依赖——“外部供应商”

在这家餐厅中,你不能所有事情都自己做,需要“依赖”外部供应商去提供各种东西(这些东西是别人做好的,你直接拿来用就可以了):

1. 核心依赖(厨房必备设备)

这些是餐厅运转的基础,就像React项目的核心依赖:

  • 炉灶(React):没它你做不了菜(写不了UI)。
  • 冰箱(React DOM):存放食材(渲染到浏览器)。
  • 刀具(Axios):切菜工具(用来发送HTTP请求)。

➡️没有它们,餐厅根本开不了张!

安装方法:

          npm install react react-dom
2. 功能依赖(特色菜品工具)

这些让餐厅更有竞争力,就像项目里的功能库:

  • 咖啡机(React Router):让顾客能点不同饮品(实现页面跳转)。
  • 冰淇淋机(Redux):统一管理所有订单(全局状态管理)。
  • 空气炸锅(Styled Components):让菜品摆盘更漂亮(CSS-in-JS)

**➡️有了它们,你的餐厅(项目)更专业,更高级!

安装方法:**

      npm install react-router-dom

验证安装是否成功:

检查package.json

"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=productioncross-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)。厨房墙上挂着一只“秒表”,谁按了都记同一组时间,不按不会刷新菜单。
useIdSSR 场景生成唯一 ID,避免 hydration 不匹配。给每份外卖贴“订单号条形码”,防止堂食和外卖的订单串号。
custom hooks(例:useAuth,useCart)提取可复用逻辑,让组件专注于 UI。把“会员验证”“购物车统计”写成“标准作业流程(SOP)”,新员工培训完就能上岗。

🛠️ 一条完整的“菜品生命周期”串起所有岗位

  1. 顾客扫码进店 → index.html 门面打开。
  2. 店长按下 main.jsx 电源 → React 厨房通电。
  3. 服务员根据 App.jsx 菜单 → 把顾客带到对应 pages/ 包间。
  4. 点单信息通过 features/order/ 档口 → 调用 api/order.js 外卖电话 → 后端厨房接单。
  5. 做菜过程中 hooks/useStock 智能看板实时减库存 → store/ 广播给所有人。
  6. 菜做好后 components/Plate/ 统一摆盘 → assets/ 里的品牌 LOGO 贴签。
  7. 顾客买单 → services/payment.js 对接支付。
  8. 打烊后 .husky/ 自动跑卫生检查 → README.md 更新“今日流水”。
  9. 店长把今天所有配置打包成 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密钥等)锁在抽屉里的独家酱料
.gitignoreGit忽略规则;声明无需纳入版本控制的文件/目录(node_module、dist、日志),保持仓库干净且体积小垃圾桶标签:哪些垃圾不打包带走“烂菜叶别上传到仓库”
README.md项目文档;用Markdown描述项目背景,启动命令、目录结构、贡献指南,帮助新成员快速上手或复制项目开店指南:新手如何复制这家店“加盟手册”

✅ 小结(给新入职的你)

  • 黄色安全帽区域:所有带 config、带 .json、带 rc 的文件 → 别乱动,动前请找“店长/架构师”。
  • 蓝色围裙区域src/components & src/features → 你每天切菜炒菜的主战场。
  • 红色禁区node_modules → 千万别手改,出问题直接“重装依赖”比“修 bug”更快。

现在,无论你是新来的“切配小弟”还是“掌勺大厨”,拿着这份“餐厅说明书”都能迅速找到自己的工位。祝你编码愉快,永不“烧厨房”!