核心术语与概念
在 ESLint 自定义规则开发过程中,掌握以下核心术语和概念对于理解工具功能和编写高质量规则至关重要。
AST(抽象语法树)
AST 是 Abstract Syntax Tree 的缩写,是源代码的树形结构表示。ESLint 使用 espree 解析器将 JavaScript 代码转换为 AST,每个语法元素(如变量声明、函数调用、表达式等)都对应树中的一个节点。自定义规则的核心工作就是遍历 AST 并检查特定节点是否符合规范。理解 AST 的结构是编写 ESLint 规则的基础,可以通过 astexplorer.net 等在线工具可视化查看代码的 AST 结构。
规则(Rule)
ESLint 规则是用于检查代码是否符合特定编码规范的检测单元。每条规则都导出一个包含 create 方法的对象。create 方法接收 context 参数并返回一个对象,该对象的键为 AST 节点类型,值为对应的处理函数。规则可以配置为不同的严重级别:off(禁用)、warn(警告)和 error(错误)。自定义规则允许团队根据项目需求制定专属的编码规范。
上下文对象(Context)
context 是 ESLint 在执行规则时传递给 create 方法的参数对象。它提供了丰富的方法和属性供规则使用:context.report() 用于报告违规;context.getFilename() 获取当前文件名;context.getSourceCode() 获取解析后的源代码对象;context.getScope() 获取当前作用域信息。正确使用 context 对象是实现复杂规则逻辑的关键。
严重级别(Severity)
严重级别决定了 ESLint 对检测到的违规采取的行动。设置为 off 时规则不执行;设置为 warn 时违规会显示警告但不阻断流程;设置为 error 时违规会作为错误处理,在严格模式下会导致退出码非零。在自定义规则测试器中,开发者可以自由切换严重级别来验证不同配置下的检测效果。选择合适的严重级别对于平衡代码质量和开发体验非常重要。
选择器(Selector)
选择器是用于匹配 AST 节点的模式字符串。ESLint 支持多种选择器语法,包括直接选择器(如 Identifier)、遍历选择器(如 CallExpression MemberExpression)和否定选择器(如 :not(CallExpression))。选择器允许开发者精确定位需要检查的 AST 节点类型。例如,要检查所有函数调用,可以选择 CallExpression 节点类型。掌握选择器的使用可以让你的规则更加精确和高效。
源代码对象(SourceCode)
源代码对象是 ESLint 解析代码后生成的对象,可以通过 context.getSourceCode() 获取。它包含了解析后的 AST、令牌流、注释信息等。常用的方法有 getASTBody() 获取 AST 根节点、getCommentsBefore() 获取节点前的注释、getText() 获取指定节点的源代码文本等。在需要获取代码上下文信息时,源代码对象是不可或缺的工具。
节点(Node)
节点是 AST 中的基本单元,代表源代码中的一个语法元素。每个节点都有 type 属性标识其类型(如 VariableDeclaration、IfStatement 等),以及 start 和 end 属性标识在源代码中的位置。节点还包含与其类型相关的特定属性,例如 CallExpression 节点包含 callee(调用对象)和 arguments(参数列表)属性。理解不同节点类型的结构对于编写精确的规则至关重要。
遍历(Traversal)
遍历是 ESLint 按照特定顺序访问 AST 中每个节点的过程。ESLint 默认使用深度优先遍历,且会先访问子节点再访问父节点(enter 阶段和 exit 阶段)。在规则的 create 方法返回的对象中,键就是节点类型,值就是在遍历到该类型节点时执行的回调函数。开发者还可以通过 context.report() 的 fix 参数提供自动修复功能,在遍历过程中直接修改源代码。
作用域分析(Scope Analysis)
作用域分析是 ESLint 提供的用于追踪变量声明、引用和作用域关系的能力。通过 context.getScope() 可以获取当前节点所在的作用域对象,其中包含变量列表(variables)、上层作用域(upper)等信息。在编写涉及变量使用检查的规则时(如禁止未使用的变量、检查变量命名规范等),作用域分析功能非常有用。
自动修复(Fix)
自动修复是 ESLint 规则的高级功能,允许规则在检测到违规时自动提供修改建议。在 context.report() 中传入 fix 参数,使用 fixer 对象的方法(如 replaceText、remove、insertText 等)定义修复操作。支持自动修复的规则可以通过 eslint --fix 命令一键修复所有问题。在在线测试器中,虽然主要关注检测功能,但理解自动修复机制对于编写完整的规则同样重要。
UD5工具箱