首页/开发/代码质量与评审速查/ESLint complexity:圈复杂度检查
规范与静态检查65 条

ESLint complexity:圈复杂度检查

ESLint 内置 complexity 规则限制函数圈复杂度:默认阈值 20,可按团队基线在配置中收紧(如 15),用于标记难理解的函数。

complexity 规则是什么

ESLint 内置的 complexity 规则限制函数的圈复杂度,默认阈值是 20,可以在配置里收紧到符合团队基线的数值。它适合用来标记分支多、理解成本高的函数,作为评审时判断要不要拆分的一个量化参考。

基本信息

规则名complexity
默认阈值20
配置方式把规则写成数组并传入数值
统计口径函数级别的分支判定点数量

典型使用场景

  • 项目刚引入检查:先看现有分布,再决定阈值
  • 核心模块加严:对关键目录设置更低的阈值
  • 评审辅助:把超过阈值的函数列为重点阅读对象
  • 拆分效果验证:重构前后对比同一函数的复杂度
  • 避免一刀切:新增代码与存量代码使用不同配置

设定阈值前的准备

  • 先统计现有函数的复杂度分布
  • 取多数函数能达到的值作为目标
  • 对确认复杂的存量函数列入豁免清单
  • 阈值调整单独提交,便于回溯

配置示例

配置示例
// 在 flat config 里收紧阈值
export default [
  { files: ["**/*.js"], rules: { complexity: ["error", 15] } },
];

阈值与实践

阈值影响
20,即默认值接近无约束,只能拦住极端函数
15 左右多数团队可以接受的折中
10 以下噪声明显增加,需要配套豁免机制
阈值要按现状基线定:先看分布,再定多数函数能够达到的目标值。

和复杂度一起看什么

  • 变更频率:高频改动的复杂函数优先拆分
  • 测试覆盖:复杂分支是否有对应用例
  • 文件长度:单个函数短但同类函数塞满文件属于组织问题
  • 团队约定:新代码与存量代码可以使用不同阈值
在评审中的用法:把超过阈值的函数列为重点阅读对象,先判断能否拆分,再决定是否豁免。
阈值只是一种提示:真正的判断标准仍然是这段逻辑能否被讲清楚、能否被测试覆盖。
复杂度要与文件长度一起看:单个函数都不长,但文件里塞满同类函数时,问题往往在组织方式而不是复杂度。
把阈值设得过低:存量代码无法收敛,规则最终会被整体关闭。

易错点

  • 直接设很低阈值:存量代码无法收敛,规则被整体关闭
  • 为过检查把逻辑拆碎成多层小函数:可读性反而下降
  • 全库统一一个阈值:核心模块与工具脚本用同一标准,两头都不合适
  • 只看复杂度不看实现:分支多但语义清晰的代码未必需要拆分
  • 超阈值就一律要求拆分:逻辑连贯的解析函数被切开后反而更难追踪

数据来源与参考

  • ESLint 官方文档 · complexity 规则(默认 max 20)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌