用途:在编写、组织或审查 React/TypeScript 应用时套用 bulletproof-react 的架构约定。上游 bulletproof-react(作者 Alan Alickovic,MIT)现为 monorepo,含 apps/react-vite/、apps/nextjs-app/、apps/nextjs-pages/ 三种应用变体,本技能以 react-vite 版本为主。
术语:Feature 指 src/features/ 下自包含的目录,含该功能的 api/、components/、hooks/、stores/、types/;Shared code 指顶层 components/、hooks/、lib/、types/、utils/,可被任何 feature 或 app 层使用,但不依赖 feature;App 层指 src/app/ 中的路由、根组件、providers、路由配置,是唯一可组合多个 feature 的层。
核心规则:禁止跨 feature 导入,共用逻辑应提升为 shared code;代码流向单向,shared → features → app,不可反向;先确定状态类别再选工具,组件、应用、服务端缓存、表单与 URL 状态是五类不同问题。
适用前提:适合多 feature、多贡献者或生命周期较长的项目;不适用于五文件原型、一次性脚本或临时组件。只有一个 feature、少量文件时保持 src/ 扁平;若代码库已有可用模式则沿用,两套约定并存成本更高。仅处理改 bug、写单个函数、组件样式等非结构性问题时不需要本技能。
常见误区:使用 react-router-dom(上游已改用 react-router v7 库模式,应从 react-router 导入);为不离开单个组件的状态创建 store;给小功能搭建完整 feature 骨架;把服务端缓存状态放进 Zustand/Redux 等通用 store(应使用 TanStack Query 缓存);使用 barrel 文件(index.ts 全量再导出)会破坏 Vite 的 tree shaking,应直接按文件导入;跨 feature 导入;误判单个 api/ 文件为过度设计;用 useEffect 转换数据或处理用户事件(可从 props/state 计算的应在渲染时计算,用户触发的逻辑放进事件处理器,Effects 仅用于与外部系统同步)。
参考文件(按当前问题选读):project-structure.md(app 与 feature 目录布局及强制导入方向的 ESLint 规则)、api-layer.md(类型、fetcher、hook 的请求声明结构)、state-management.md(五类状态及库推荐)、testing.md(测试类型、投入重点、Vitest/Testing Library/Playwright/MSW)、error-handling.md、security.md(必须整篇读完)、performance.md、overengineering-check.md、effects.md、quality-check.md。其余平台、费用或安装方式暂未提供。