本文档详细介绍了 React Hooks 的 ESLint 插件,这是一个静态分析工具,用于强制执行 React 的 Hooks 规则并检查 Hook 调用中的依赖项。该插件帮助开发者避免在使用 React Hooks 的应用程序中可能导致错误的常见问题。有关 React Hooks 实现的更多信息,请参阅React Hooks。
React Hooks 的 ESLint 插件主要有两个用途
useEffect、useCallback 和 useMemo 等 Hook 中正确指定该插件可在开发阶段识别潜在错误,这些错误在生产环境中可能难以调试。
来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js1-15 packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js1-15
该插件包含两个主要规则,它们协同工作以强制执行 React Hooks 的最佳实践
来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js14-15 packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js14-15
rules-of-hooks 规则强制执行 React 的Hooks 规则,这对于 Hooks 的正确运行至关重要。此规则检测 Hooks 在可能导致状态不一致或其他错误的方式下被调用的违规行为。
来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js565-1286
exhaustive-deps 规则验证在 useEffect、useCallback 和 useMemo 等 Hook 中使用的所有依赖项都已在其依赖数组中正确声明。缺少依赖项可能导致陈旧闭包和难以追踪的错误。
该规则对某些 React 模式有特殊处理
useState 的 setter、useReducer 的 dispatcher 和 ref 无需包含在依赖数组中来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js37-1918
该插件可以通过选项进行配置以自定义其行为
| 选项 | 描述 | 默认 |
|---|---|---|
additionalHooks | 用于应遵循 Hooks 规则的额外自定义 Hook 的正则表达式或正则表达式数组 | [] |
enableDangerousAutofixThisMayCauseInfiniteLoops | 启用 exhaustive-deps 的自动修复(实验性功能,可能导致问题) | false |
使用自定义 Hook
来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js516-537
该插件使用复杂的静态分析来强制执行规则。以下是其关键组件的工作原理
use 前缀后跟大写字母来识别 Hook 调用来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js1463-1533 packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js1772-2060
该插件自推出以来经历了显著发展
| 版本 | 关键变更 |
|---|---|
| 5.2.0 | 支持扁平配置、TypeScript 转换,修复了 do/while 循环中的误报问题 |
| 5.1.0 | 增加了对 do/while 循环的支持,修复了回调参数问题 |
| 5.0.0 | 增加了组件名称验证,禁止在异步函数中使用 Hooks |
| 4.x | 增加了更多违规检查,改进了对可选链的支持 |
基于更新日志和近期开发
useEffectEvent 等新兴模式来源:packages/eslint-plugin-react-hooks/CHANGELOG.md1-123
该插件经过针对多个 ESLint 版本和解析器的全面测试
该插件具有广泛的测试覆盖率,包含有效和无效的代码示例,确保在不同环境和编码模式下的可靠性。
来源:packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js1562-1676 packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js1-1918