之前跟着项目上手的时候,有人冷不丁问我react全家桶包括哪些,我当场卡了几秒,脑子里蹦出来一堆包名,又分不清哪些是标配,哪些只是大家顺手加上的,回去之后对着自己本地的package.json翻了好久,一点点捋清楚我当时在用的那一套。
最先固定下来的就是react和react-dom,这个没什么好说的,没有这两个东西,页面都渲染不出来,很多人会下意识把它们算作全家桶的底子。然后是路由,项目页面一多,跳转、传参、权限控制都绕不开,当时项目里用的是react-router,嵌套路由、路由守卫这些功能写页面的时候天天碰,我最开始还把它当成一个可选插件,后来看多了别人的工程,才知道大部分业务项目都会带上它。
状态管理这块变数就大很多了。最早接触的项目用redux,配套redux-toolkit,写slice、异步请求,把全局数据抽出去,组件之间不用一层一层透传props,数据改了所有订阅的地方自动更新,看着规整。后面换过别的项目,有的直接换成zustand,代码量短不少,写起来省事,不需要写一堆模板代码。还有同事偏爱mobx,写法更偏向响应式,改动数据视图就跟着变。这个地方分歧特别大,有人觉得redux才算是全家桶里面的,有人觉得只要是react生态里主流的状态库都可以算进去,没有统一的清单。
这只是我的个人感受,不是标准答案。不同团队选型差别很大,有的轻量项目甚至直接放弃复杂状态库,只用useContext加useReducer就撑住业务。
请求库一般也会顺带安排上,我之前项目配的是axios,拦截请求响应、统一处理返回格式、封装基础请求方法,几乎每个页面都要调接口拿数据,它和react本身没有强制绑定,但业务开发里很少有人裸写fetch到处跑。样式方案就更杂了,遇到过用styled-components的,组件和样式绑在一起,也碰过用tailwindcss的,写类名快速调样式,还有传统scss的写法,样式方案算不算全家桶,一直都有争论,我自己习惯不把它算成硬性组成部分,只能算配套工具。
代码校验和构建相关的,比如eslint、prettier、vite或者webpack,很多初始化模板会一并装好,用来统一代码风格、打包编译。我之前有段时间混淆过,以为这些也属于react全家桶,后来跟老开发聊过,他说全家桶更多偏向业务开发时支撑页面逻辑、路由、状态的库,构建校验工具属于工程化配套,不属于核心范畴。
还有一些看场景添加的东西,表单处理我用过react-hook-form,处理大量表单校验、收集值的时候比自己手写受控组件省心很多;表格、弹窗这类组件库,比如组件UI库,很多项目启动直接引入,快速搭后台页面,不过组件库属于独立的生态产品,不会被固定算进全家桶里面。
见过有人把react-query也放进清单里,它负责服务端状态管理,缓存接口数据、自动刷新、处理加载状态,和传统全局状态库解决的问题不一样。有的团队很依赖它,有的项目从头到尾都不会安装,完全看业务场景,数据请求频繁、需要缓存数据的后台系统会更喜欢引入。
慢慢就意识到,根本不存在一份写死的react全家桶清单。网上很多教程给的列表,只是早些年行业里流传最广的一套组合,也就是react+react-dom+react-router+redux相关套件,这套流传最久,所以很多新手搜到的都是它。现在生态迭代很快,新库不断出来,选型跟着团队习惯、项目规模走,小项目追求轻量化,能少装包就少装包,大型后台项目才会把路由、全局状态、表单、请求相关的库配齐。
之前踩过一个小误区,拿着网上那份固定清单去对照新项目,发现人家项目里面一半库都不一样,还怀疑是不是自己理解错了。后来才想明白,全家桶本质就是大家口头说的一套常用配套组合,不是官方定义的概念,没有强制标准。
现在再有人问起这个问题,我不会直接甩一长串包名。只会说我自己业务开发里最常碰到的那一组,同时提醒一句,换个团队,清单大概率就变样了。