架构
从高层来看,ESLint 有几个关键部分
bin/eslint.js- 这是实际执行的命令行工具的文件。它是一个简单的包装器,除了引导 ESLint 并将命令行参数传递给cli之外,什么也不做。这有意保持较小,以避免需要大量的测试。lib/api.js- 这是require("eslint")的入口点。此文件暴露了一个包含公共类Linter、ESLint、RuleTester和SourceCode的对象。lib/cli.js- 这是 ESLint CLI 的核心。它接收一个参数数组,然后使用eslint来执行命令。通过将此作为单独的实用程序,它允许其他人有效地从另一个 Node.js 程序内部调用 ESLint,就像在命令行中完成一样。主要调用是cli.execute()。 这也是执行所有文件读取、目录遍历、输入和输出的部分。lib/cli-engine/- 此模块是CLIEngine类,用于查找源代码文件和配置文件,然后使用Linter类进行代码验证。这包括配置文件的加载逻辑、解析器、插件和格式化程序。lib/linter/- 此模块是核心Linter类,它根据配置选项进行代码验证。此文件不执行任何文件 I/O,并且完全不与console交互。对于具有要验证的 JavaScript 文本的其他 Node.js 程序,它们可以直接使用此接口。lib/rule-tester/- 此模块是RuleTester类,它包装了 Mocha,以便可以对规则进行单元测试。 此类使我们能够为每个已实现规则编写一致格式的测试,并确信每个规则都有效。 RuleTester 接口是根据 Mocha 建模的,并与 Mocha 的全局测试方法一起使用。 RuleTester 也可以修改为与其他测试框架一起工作。lib/source-code/- 此模块是SourceCode类,用于表示解析后的源代码。它接收源代码和代表代码的 AST 的 Program 节点。lib/rules/- 这包含用于验证源代码的内置规则。
cli 对象
cli 对象是命令行界面的 API。 实际上,bin/eslint.js 文件只是将参数传递给 cli 对象,然后将 process.exitCode 设置为返回的退出代码。
主要方法是 cli.execute(),它接受一个字符串数组,该数组表示命令行选项(就像传递了 process.argv 而没有前两个参数一样)。 如果你想从另一个程序内部运行 ESLint 并使其像 CLI 一样工作,那么 cli 就是要使用的对象。
此对象的职责包括
- 解释命令行参数。
- 从文件系统读取。
- 输出到控制台。
- 输出到文件系统。
- 使用格式化程序。
- 返回正确的退出代码。
此对象可能不会
- 直接调用
process.exit()。 - 执行任何异步操作。
CLIEngine 对象
CLIEngine 类型代表 CLI 的核心功能,但它不从命令行读取任何内容,并且默认情况下不输出任何内容。 相反,它接受许多(但不是全部)传递到 CLI 的参数。 它读取配置和源文件,并管理传递给 Linter 对象的环境。
CLIEngine 的主要方法是 executeOnFiles(),它接受一个要运行静态代码检查的文件和目录名称数组。
此对象的职责包括
- 管理
Linter的执行环境。 - 从文件系统读取。
- 从配置文件(包括
.eslintrc和package.json)读取配置信息。
此对象可能不会
- 直接调用
process.exit()。 - 执行任何异步操作。
- 输出到控制台。
- 使用格式化程序。
Linter 对象
Linter 对象的主要方法是 verify(),它接受两个参数:要验证的源代码和配置对象(给定配置文件的烘焙配置加上命令行选项)。 该方法首先使用 espree(或配置的解析器)解析给定的文本并检索 AST。 AST 使用行/列和范围位置生成,这对于报告问题位置和检索与 AST 节点相关的源代码非常有用。
一旦 AST 可用,estraverse 就会被用来从上到下遍历 AST。 在每个节点,Linter 对象会发出一个与节点类型同名的事件(例如,“Identifier”、“WithStatement”等)。 在返回子树的过程中,会发出一个带有 AST 类型名称并以“:exit”结尾的事件,例如“Identifier:exit” - 这允许规则在向下和向上遍历时采取行动。 每个事件都会发出适当的 AST 节点。
此对象的职责包括
- 检查 JavaScript 代码字符串。
- 为代码创建 AST。
- 在 AST 上执行规则。
- 报告执行结果。
此对象可能不会
- 直接调用
process.exit()。 - 执行任何异步操作。
- 使用 Node.js 特定的功能。
- 访问文件系统。
- 调用
console.log()或任何类似的方法。
规则
单独的规则是 ESLint 架构中最专业的部分。 规则可以做的很少,它们只是针对提供的 AST 执行的一组指令。 它们会获得一些上下文信息传递,但规则的主要职责是检查 AST 并报告警告。
这些对象的职责是
- 检查 AST 中特定的模式。
- 在找到某些模式时报告警告。
这些对象可能不会
- 直接调用
process.exit()。 - 执行任何异步操作。
- 使用 Node.js 特定的功能。
- 访问文件系统。
- 调用
console.log()或任何类似的方法。