版本

架构

dependency graph

在高层次上,ESLint 有几个关键部分

  • bin/eslint.js - 这是实际使用命令行实用程序执行的文件。它是一个简单的包装器,除了引导 ESLint 并将命令行参数传递给 cli 之外,什么也不做。这样做是为了保持其体积小巧,避免繁重的测试。
  • lib/api.js - 这是 require("eslint") 的入口点。此文件公开一个对象,其中包含公共类 LinterESLintRuleTesterSourceCode
  • 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 的执行环境
  • 从文件系统读取
  • 从配置文件(包括 .eslintrcpackage.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() 或任何其他类似方法
更改语言