架构
在高层次上,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 的文件和目录名称数组。
此对象的职责包括
- 管理
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()
或任何其他类似方法。