用途:把现有 React 文件改到能被 React Compiler 编译优化。判断标准只有一个——react-compiler-marker 报告的失败数下降,而不是推理上说得通。
主要能力与依据:react-compiler-marker 加载工作区自身的 babel-plugin-react-compiler,执行真实的 transformFromAstSync(noEmit: false),不是 lint 或启发式。它以 compilationMode: "infer"、panicThreshold: "none" 运行,并额外开启 enableTreatRefLikeIdentifiersAsRefs: true,因此比应用构建更严格:marker 干净的文件在构建时也干净。它无法验证的是编译产物的运行时行为——Jest 下编译器被禁用,测试通过只说明源码行为未变。
使用方式:从仓库根目录运行,显式传入插件路径,CLI 扫描的是目录而非文件:
npx -y react-compiler-marker@latest
--babel-plugin-path node_modules/babel-plugin-react-compiler
app/path/to/containing/dir
先记录目标文件的失败行;若文件未出现在失败列表中则无需处理。需要前后 memo 指标时,在首次编辑前用 --format json ... 2>/dev/null 采集基线。每次只改一处并复跑,确认失败消失且目录内无新失败。零失败是必要条件而非充分条件,需读 JSON 中每函数的 memoBlocks、memoValues 与 prunedMemoBlocks、prunedMemoValues,完成文件应无剪枝。随后运行:
yarn prettier --write <file> && yarn eslint <file> && yarn jest <dir>
有类型面变化时加 yarn lint:tsc。
适用场景:修复 React Compiler 的 bail-out、迁移组件文件。限制与注意:不要用 "use no memo"、新增 eslint-disable 或删除失败行为来抑制;测试文件(*.test.tsx)应跳过;部分诊断是误报,需先确认代码确实违反规则;若真正修复在文件之外(改导出、共享 hook、他人模块),应停止并报告。保持最小 diff,优先提取到模块作用域,不新增文件,不缩小 try/catch/effect 的保护范围(唯一例外是 finally 改为尾随语句,且需满足前置条件)。报告时说明 diff、原代码存在原因、保留的行为、前后失败数,并标注风险等级(重命名级、结构级、有状态级)。