
React Doctor 的 React Router 规则研究与实践从 38 个候选规则到版本感知的 lint 契约【免费下载链接】react-doctorYour agent writes bad React. This catches it项目地址: https://gitcode.com/GitHub_Trending/re/react-doctor导读本文基于 docs/react-router-rule-research.md 研究文档系统梳理 React Doctor 为 React Router 设计专用 lint 规则的完整思路为什么 React Router 不能当作单一框架形态的 API 来检测、如何通过模式感知Framework/Data/Declarative与版本门控两条基石保证规则精确、38 个候选规则如何按 P0/P1/P2 分层以及这些契约在仓库中如何被真正落地实现。读完本文你将掌握 React Router 运行时不变量的可 lint 化方法、版本矩阵驱动的规则门控策略以及缺报优于误报的项目感知检测边界设计。研究结论React Router 值得专属规则家族但必须模式感知React Doctor 的研究结论非常明确React Router 是专属规则家族的强候选但不能被当作一个框架形态的 API来处理。官方 agent skill 将 React Router 明确划分为 Framework、Data、Declarative 三种模式lint 规则也必须沿用这一区分——尤其是loaders、actions、fetchers、route.lazy以及路由模块导出在 Declarative 模式下根本不存在任何把 Framework/Data 指南强加到 Declarative 应用的规则都会产生灾难性误报。研究分两轮推进第一轮产出 15 个候选第二轮深入路由运行时不变量、中间件实现、v6/v7/v8 变更日志、安全公告、Framework 约定、已接受的官方设计决策以及维护者讨论串将积压扩充到38 个候选。其中 P0 层 12 条规则其危害行为可直接证明、版本边界可编码表格中保留了原始 P1/P2 上下文优先级候选规则模式精度置信度P0react-router-no-router-in-renderDatascope pathhighP0react-router-no-navigate-in-renderallpathhighP0react-router-no-unsynchronized-search-params-mutationallscope pathhighP0react-router-no-multiple-set-search-params-in-tickallpathhighP0react-router-no-invalid-lazy-route-propertiesDatascopehighP0react-router-nested-route-requires-outletallcross-filehigh when resolvedP0react-router-no-loader-request-bodyFramework, DatascopehighP0react-router-no-session-mutation-in-loaderFrameworkscopehighP0react-router-no-use-loader-data-in-error-uiFramework, Datascope projecthighP0react-router-no-multiple-middleware-nextFramework, DatapathhighP0react-router-descendant-routes-require-splatallcross-filehigh when resolvedP0react-router-no-invalid-absolute-child-pathallprojecthigh when staticP1react-router-require-root-error-boundaryFramework, DataprojecthighP1react-router-guard-aborted-handle-errorFrameworkpathhighP1react-router-resource-link-requires-reloadFramework, Dataproject scopehigh when resolvedP1react-router-loader-parallel-fetchFramework, DatapathhighP1react-router-loader-fetch-forwards-signalData, client loadersscopemedium-highP1react-router-prefer-route-lazyDatascopemedium-highP2react-router-internal-route-anchorallproject scopemedium-high when resolvedP2react-router-csp-nonce-consistencyFrameworkcross-filemedium-highP2react-router-valid-route-objectDatascopehigh, but mostly type-covered研究强调候选数量本身不是目标。扩充的意义在于分离三种不应混为一谈的产品形态默认开启的行为型规则具有直接的运行时或安全后果版本作用域的迁移规则仅在用户声明目标大版本时激活依赖/配置诊断更适合交给既有 supply-chain 或项目扫描器实现而不是 AST lint 规则。When resolved解析成功时是这一切的承重墙当 React Doctor 无法证明路由目标或组件实现时项目感知规则必须保持沉默。缺失一条诊断远比猜测这个锚点指向 UI 路由这个导入的组件漏掉了 Outlet这个 URL 是资源路由要好。必需的地基模式感知能力检测与版本解析模式感知能力检测落地的基础设施只在包证据可靠处使用项目能力见 capabilities.ts 与 collect-project-facts.ts 的实现react-router安装了react-router或react-router-domreact-router-framework安装了react-router/dev单调递增版本令牌react-router:6.4到react-router:8覆盖各规则使用的发布边界。官方 skill 提供了精确的模式信号并明确警告不要将 Framework/Data 指南应用于 Declarative 应用。因此Data 与 Declarative 用法必须由路由创建器、路由对象、JSX 路由器和导入 API 在本地local证明而不是靠项目级模式猜测。对文件名敏感的 Framework 规则只限于规范文件解析自定义appDirectory与任意路由配置属于未来的跨文件索引工作。源码兼容性同样关键React Router 6 应用通常从react-router-dom导入 DOM APIReact Router 7 将这些 API 收敛到react-router与react-router/dom同时保留兼容包React Router 8 移除了react-router-dom。因此规则必须能从两个包解析导入只在行为真正因主版本不同时才使用已安装主版本信息。研究时的官方文档版本为 v8.2.0而下述契约刻意面向 v6.4 起的稳定 Data API 与 v7 起的 Framework API。版本解析器与规则门控版本感知不等于检查导入拼写。已实现的解析器从根与 workspace 的 manifest 读取声明版本和目录引用保守地选择最低可解析版本将无法解析或非 semver 的依赖视为未知。一条规则随后可以选择四种门控策略之一API 存在门控API-presence gate从首次提供该 API 的版本起激活行为门控Behavior gate仅从使被诊断行为成立的那个版本起激活目标大版本迁移门控Target-major migration gate仅当用户显式声明目标大版本、或已安装的大版本已移除该构造时激活公告门控Advisory gate在 supply-chain 扫描器中将已安装包与补丁范围对比不要把易受攻击的依赖伪装成源码 lint 问题。研究给出了完整的功能/版本矩阵直接对应仓库中 constants.ts 定义的能力阈值阶梯react-router:6.4、6.7、6.9、6.19、7、7.8、7.9、7.10、7.15、8功能或行为v6v7v8规则后果Data routers、loaders、actions6.4支持支持Data-only 规则需要 Data/Framework 证明而非仅仅包导入。route.lazy函数6.9支持之后增加对象形式支持lazy 属性与 route-lazy 规则在 6.9 以下保持关闭。useBlocker不稳定6.7稳定6.19支持支持多 blocker 规则仅在各自有效范围内识别两个名称。search-param setter 回调隔离7.7 之前共享可变实例从7.7.0起为复制的回调值复制值变更规则只跟踪元组结果、绝不跟踪 setter 回调参数同一检测器跨版本有效。Middleware不存在7.9 前不稳定稳定7.9始终启用稳定 middleware 规则在 7.9 门控实验性 middleware 留在首个已发布契约之外。next()永不抛出不存在从7.8.0起为真真围绕next的 try/catch 规则对更早的实验性 middleware 必须关闭。React transition 路由选项不存在unstable_useTransitions自 7.10useTransitions自 7.15作为useTransitions支持Promise 返回规则使用正确 prop 名且只把 Data/Framework 导航 API 视为返回 Promise。Framework 根Layout错误流不存在支持支持loader-data-in-error-UI 自 v7 起适用于 Framework 根Layout与路由边界。包入口点react-router-dom正常保留兼容导出react-router-dom被移除导入迁移规则仅对已安装 v8 激活仍在维护的 v6/v7 应用保持安静。meta/useMatches匹配数据datadata自 7.8 弃用loaderData可用data被移除移除字段规则仅对已安装 v8 激活且要求 scope 或 Framework 导出证明。future.v8_*标志不存在可选的升级控制移除或提升移除标志规则仅对已安装 v8 Framework 配置激活。由该矩阵推出两条重要的非规则不要仅仅因为当前文档偏好 v8 拼写就运行 v8 codemod 风格的诊断——一个正常维护的 v6 应用从react-router-dom导入是完全正确的不要按大版本 fork 每一个行为检测器——大多数路由树不变量从 v6 到 v8 保持不变只有在 API 或行为真正不同时才附加最低版本。路由与组件索引有三个候选需要一个小型跨文件索引路由父级 → 组件/模块路由路径 → UI 路由或资源路由组件 → 直接或传递渲染Outlet/调用useOutlet。Framework 模式可以从routes.ts、react-router/fs-routes以及配置的 app 目录推导Data 模式可以从提供给 contenteditable="false">【免费下载链接】react-doctorYour agent writes bad React. This catches it项目地址: https://gitcode.com/GitHub_Trending/re/react-doctor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考