Skip to content
On this page

ESLint 规则详解

ESLint 的规则是代码检查的核心,本章将详细介绍各种类型的规则及其配置方法。

规则分类

1. 问题检测规则(Possible Errors)

这些规则旨在帮助发现代码中的潜在错误:

javascript
module.exports = {
  rules: {
    // 禁止使用 console
    'no-console': 'warn',
    
    // 禁止使用 debugger
    'no-debugger': 'error',
    
    // 禁止未定义变量
    'no-undef': 'error',
    
    // 禁止不必要的括号
    'no-extra-parens': ['error', 'all', {
      'conditionalAssign': true,
      'nestedBinaryExpressions': false,
      'returnAssign': false,
      'enforceForArrowConditionals': false
    }],
    
    // 禁止不必要地转义字符
    'no-useless-escape': 'error',
    
    // 要求使用 isNaN() 检查 NaN
    'use-isnan': 'error',
    
    // 强制比较时使用 NaN
    'no-self-compare': 'error',
    
    // 禁止不必要的 catch 子句
    'no-useless-catch': 'error',
    
    // 要求所有的浮点数都必须有一个数字在至少一个小数点之前或之后
    'no-floating-decimal': 'error',
    
    // 禁止在常规字符串中出现模板字面量占位符语法
    'no-template-curly-in-string': 'error'
  }
};

2. 最佳实践规则(Best Practices)

这些规则帮助您编写更好的代码:

javascript
module.exports = {
  rules: {
    // 要求使用 === 和 !==
    'eqeqeq': ['error', 'always', {
      'null': 'ignore'  // 可以忽略 null 比较
    }],
    
    // 禁止 case 语句落空
    'no-fallthrough': 'error',
    
    // 禁止使用 alert, confirm, prompt
    'no-alert': 'warn',
    
    // 禁止使用 caller 或 callee
    'no-caller': 'error',
    
    // 要求使用骆驼拼写法
    'camelcase': ['error', {
      'properties': 'never',  // 属性名可以不是驼峰
      'ignoreDestructuring': false
    }],
    
    // 禁止删除变量
    'no-delete-var': 'error',
    
    // 禁止标签与变量同名
    'no-label-var': 'error',
    
    // 禁止混合普通变量声明和解构
    'no-var': 'error',  // 优先使用 let 或 const
    
    // 要求尽可能使用 const
    'prefer-const': 'error',
    
    // 禁止在条件语句中赋值
    'no-cond-assign': ['error', 'always'],
    
    // 要求 return 语句要么总是指定值,要么不指定值
    'consistent-return': 'error'
  }
};

3. 变量处理规则(Variables)

这些规则帮助处理变量:

javascript
module.exports = {
  rules: {
    // 禁止删除变量
    'no-delete-var': 'error',
    
    // 禁止标签与变量同名
    'no-label-var': 'error',
    
    // 禁止使用特殊块作用域的变量
    'no-shadow': 'error',
    
    // 禁止初始化变量为 undefined
    'no-undef-init': 'error',
    
    // 禁止使用未使用的变量
    'no-unused-vars': ['error', {
      'vars': 'all',
      'args': 'after-used',
      'ignoreRestSiblings': true,
      'argsIgnorePattern': '^_'
    }],
    
    // 禁止在变量定义之前使用
    'no-use-before-define': ['error', {
      'functions': true,
      'classes': true,
      'variables': true
    }],
    
    // 禁止未声明的变量
    'no-implicit-globals': 'error'
  }
};

4. 风格指南规则(Stylistic Issues)

这些规则与代码风格有关:

javascript
module.exports = {
  rules: {
    // 要求使用一致的缩进
    'indent': ['error', 2, {
      'SwitchCase': 1,
      'VariableDeclarator': 1,
      'outerIIFEBody': 1,
      'MemberExpression': 1,
      'FunctionDeclaration': {'parameters': 1, 'body': 1},
      'FunctionExpression': {'parameters': 1, 'body': 1},
      'CallExpression': {'arguments': 1},
      'ArrayExpression': 1,
      'ObjectExpression': 1,
      'ImportDeclaration': 1,
      'flatTernaryExpressions': false,
      'ignoreComments': false
    }],
    
    // 要求使用一致的换行符
    'linebreak-style': ['error', 'unix'],
    
    // 要求使用一致的引号
    'quotes': ['error', 'single', {
      'avoidEscape': true,
      'allowTemplateLiterals': false
    }],
    
    // 要求使用分号
    'semi': ['error', 'always'],
    
    // 要求在块之前有一致的空格
    'space-before-blocks': ['error', 'always'],
    
    // 要求在关键字前后有空格
    'keyword-spacing': ['error', {
      'before': true,
      'after': true,
      'overrides': {
        'return': {'after': true},
        'throw': {'after': true},
        'case': {'after': true}
      }
    }],
    
    // 强制一行的最大长度
    'max-len': ['error', {
      'code': 120,
      'tabWidth': 2,
      'comments': 120,
      'ignoreComments': false,
      'ignoreTrailingComments': true,
      'ignoreUrls': true,
      'ignoreStrings': true,
      'ignoreTemplateLiterals': true,
      'ignoreRegExpLiterals': true
    }],
    
    // 要求方法链中每个调用都有一个换行符
    'newline-per-chained-call': ['error', {'ignoreChainWithDepth': 3}],
    
    // 要求对象属性在不同行上
    'object-property-newline': ['error', {
      'allowAllPropertiesOnSameLine': true
    }]
  }
};

规则配置语法详解

规则严重程度

javascript
module.exports = {
  rules: {
    // 使用字符串形式
    'no-console': 'off',     // 关闭规则
    'no-console': 'warn',    // 警告级别
    'no-console': 'error',   // 错误级别
    
    // 使用数字形式
    'no-debugger': 0,        // 关闭规则
    'no-debugger': 1,        // 警告级别
    'no-debugger': 2,        // 错误级别
    
    // 使用数组形式(带选项)
    'semi': ['error', 'always'],
    'quotes': ['warn', 'single', { 'avoidEscape': true }]
  }
};

规则选项详解

javascript
module.exports = {
  rules: {
    // 基本选项
    'no-var': 'error',
    
    // 单个选项
    'semi': ['error', 'always'],
    
    // 多个选项
    'max-len': ['error', {
      'code': 120,
      'ignoreComments': true,
      'ignoreUrls': true
    }],
    
    // 数组和对象混合选项
    'array-bracket-spacing': ['error', 'never', {
      'singleValue': true,
      'objectsInArrays': false,
      'arraysInArrays': false
    }],
    
    // 多级配置
    'brace-style': ['error', '1tbs', {
      'allowSingleLine': true
    }]
  }
};

常用规则详解

1. 代码格式规则

javascript
module.exports = {
  rules: {
    // 逗号风格
    'comma-style': ['error', 'last'],
    
    // 逗号间距
    'comma-spacing': ['error', {'before': false, 'after': true}],
    
    // 分号间距
    'semi-spacing': ['error', {'before': false, 'after': true}],
    
    // 分号位置
    'semi-style': ['error', 'last'],
    
    // 块内空行
    'padded-blocks': ['error', 'never'],
    
    // 空行规则
    'lines-between-class-members': ['error', 'always', {
      'exceptAfterSingleLine': true
    }],
    
    // 空行要求
    'padding-line-between-statements': [
      'error',
      { 'blankLine': 'always', 'prev': '*', 'next': 'return' },
      { 'blankLine': 'always', 'prev': ['const', 'let', 'var'], 'next': '*' },
      { 'blankLine': 'any', 'prev': ['const', 'let', 'var'], 'next': ['const', 'let', 'var'] }
    ]
  }
};

2. 命名约定规则

javascript
module.exports = {
  rules: {
    // 变量命名
    'camelcase': ['error', {
      'properties': 'never',
      'ignoreDestructuring': false,
      'ignoreImports': true,
      'ignoreGlobals': true
    }],
    
    // 常量命名
    'constant-case': ['error', {
      'properties': 'always'
    }],
    
    // 函数命名
    'func-name-matching': ['error', 'always', {
      'includeCommonJSModuleExports': false
    }],
    
    // 命名规则
    'id-match': ['error', '^[a-zA-Z_$][a-zA-Z0-9_$]*$', {
      'properties': false,
      'onlyDeclarations': true,
      'ignoreDestructuring': false
    }]
  }
};

3. 对象和数组规则

javascript
module.exports = {
  rules: {
    // 对象属性新行
    'object-curly-newline': ['error', {
      'ObjectExpression': {'minProperties': 4, 'multiline': true, 'consistent': true},
      'ObjectPattern': {'minProperties': 4, 'multiline': true, 'consistent': true},
      'ExportDeclaration': {'minProperties': 4, 'multiline': true, 'consistent': true}
    }],
    
    // 对象花括号间距
    'object-curly-spacing': ['error', 'always'],
    
    // 对象属性引号
    'quote-props': ['error', 'as-needed', {
      'keywords': false,
      'unnecessary': true,
      'numbers': false
    }],
    
    // 数组括号间距
    'array-bracket-spacing': ['error', 'never'],
    
    // 数组括号新行
    'array-bracket-newline': ['error', 'consistent'],
    
    // 尾随逗号
    'comma-dangle': ['error', {
      'arrays': 'never',
      'objects': 'never',
      'imports': 'never',
      'exports': 'never',
      'functions': 'never'
    }]
  }
};

React 特定规则

javascript
module.exports = {
  plugins: ['react'],
  rules: {
    // React 版本检测
    'react/react-in-jsx-scope': 'error',
    
    // JSX 标签闭合
    'react/self-closing-comp': 'error',
    
    // JSX 间距
    'react/jsx-tag-spacing': ['error', {
      'closingSlash': 'never',
      'beforeSelfClosing': 'always',
      'afterOpening': 'never',
      'beforeClosing': 'never'
    }],
    
    // JSX 闭合括号位置
    'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
    
    // JSX 最大 props 数量
    'react/jsx-max-props-per-line': ['error', {'maximum': 1, 'when': 'multiline'}],
    
    // JSX 新行
    'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
    
    // PropTypes 定义
    'react/prop-types': ['error', {
      'ignore': [],
      'customValidators': [],
      'skipUndeclared': false
    }],
    
    // 组件定义
    'react/display-name': 'error'
  }
};

TypeScript 特定规则

javascript
module.exports = {
  plugins: ['@typescript-eslint'],
  rules: {
    // 显式函数返回类型
    '@typescript-eslint/explicit-function-return-type': ['error', {
      'allowExpressions': true,
      'allowTypedFunctionExpressions': true,
      'allowHigherOrderFunctions': true,
      'allowDirectConstAssertionInArrowFunctions': true,
      'allowConciseArrowFunctionExpressionsStartingWithVoid': false
    }],
    
    // 显式成员访问
    '@typescript-eslint/explicit-member-accessibility': ['error', {
      'accessibility': 'explicit'
    }],
    
    // 命名约定
    '@typescript-eslint/naming-convention': [
      'error',
      {
        'selector': 'variableLike',
        'format': ['camelCase', 'UPPER_CASE']
      },
      {
        'selector': 'typeLike',
        'format': ['PascalCase']
      }
    ],
    
    // 不允许 any
    '@typescript-eslint/no-explicit-any': 'warn',
    
    // 不允许空函数
    '@typescript-eslint/no-empty-function': 'error',
    
    // 不允许空接口
    '@typescript-eslint/no-empty-interface': 'error',
    
    // 不允许不安全的任意类型
    '@typescript-eslint/no-unsafe-assignment': 'error'
  }
};

自定义规则

创建自定义规则

javascript
// 自定义规则示例
module.exports = {
  rules: {
    // 自定义规则配置
    'my-custom-rule': ['error', {
      'option1': 'value1',
      'option2': 'value2'
    }]
  }
};

使用插件规则

javascript
module.exports = {
  plugins: [
    'import',
    'jsx-a11y'
  ],
  rules: {
    // Import 规则
    'import/order': ['error', {
      'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
      'newlines-between': 'always',
      'alphabetize': {
        'order': 'asc',
        'caseInsensitive': true
      }
    }],
    
    // Accessibility 规则
    'jsx-a11y/alt-text': 'error',
    'jsx-a11y/anchor-has-content': 'error',
    'jsx-a11y/click-events-have-key-events': 'error',
    'jsx-a11y/no-static-element-interactions': 'error'
  }
};

规则性能考虑

性能优化规则

javascript
module.exports = {
  rules: {
    // 对性能影响较小的规则
    'no-console': 'warn',
    'semi': 'error',
    'quotes': 'error',
    
    // 对性能影响较大的规则(谨慎使用)
    'no-unused-vars': 'warn',  // 检查所有变量使用情况
    'complexity': ['warn', 10],  // 圈复杂度检查
    'max-depth': ['warn', 4]    // 嵌套深度检查
  },
  
  // 使用 overrides 为不同文件类型设置不同规则
  overrides: [
    {
      files: ['*.test.js', '*.spec.js'],
      rules: {
        'no-unused-vars': 'off',  // 测试文件中可适当放宽规则
        'max-nested-callbacks': 'off'
      }
    }
  ]
};

小结

ESLint 规则是代码检查的核心,通过合理配置各种规则,可以有效地保证代码质量和一致性。不同类型的规则有不同的用途,需要根据项目需求进行选择和配置。下一章我们将介绍 ESLint 的插件系统。