ESLINT是我们每天使用的工具。我们将使用其CLI或API进行代码错误检查和格式检查。有时,我们还为定制检查和维修编写一些规则。
尽管我们每天都使用它,但我们很少了解它是如何实现的。了解ESLINT的实现原理可以帮助我们更好地使用它并编写一些插头。
因此,我们将使用源代码通过源代码探索ESLINT的实现原理。
Linter是ESLINT的核心类别。它提供了这些API:
Sourcecode指的是AST(抽象语法树)。解析器由源代码字符串解析为AST,规则是我们配置的AST规则。这些API易于理解。
Linter的主要功能在验证和验证和验证中实现。当命令行指定或配置文件规格时,将调用验证和修复代码,否则验证将调用以进行检查。
验证和修复是如何实现的?这是ESLINT的核心部分:
我们知道,根据AST检查ESLINT规则,因此我们必须首先是解析,因为AST.ESLINT的解析器也可以切换。您需要首先查找解析器:
ESPREE带有默认值是ESLINT,也可以通过配置将其切换到另一个解析器,例如 @Eslint/babel-parser, @typescript/eslint-parser,等等。
以下是Resolve Parser的逻辑:
确认解析器后,是调用解析方法。
解析器的解析方法将分析源代码为AST,在ESLINT中,它由SourceCode封装。查看Sourcecode后来引用AST。
使用AST,您可以调用规则以检查AST
解析后,将调用Runrules方法检查AST。退货结果是私人,也就是说,有关如何维修的任何错误和信息。
那么Runrules如何运行规则?
规则的实现如下,即注册要检查的AST,这与Babel插件类似。
Runrules可以穿越AST,然后遇到不同AST的不同事件。规则将监控哪些事件来处理AST会聆听的内容,以便通过聆听事件的方法,您可以在此过程中执行不同的规则遍历AST。
注册听众:
像AST一样,发出不同的事件,触发听众:
这样,在遍历AST之后,所有规则都被称为规则的运行机理。
此外,它将在遍历过程中传递到上下文中,可以在规则中获得,例如范围,设置等。
和rulecontext,您可以在致电AST的听众时得到它:
该报告API报告了规则,因此您可以收集所有错误并打印它们。
这是什么问题?
覆盖覆盖问题是检查的结果,这是从哪个行(端线)和哪些错误的线。
还有如何维修(修复),维修实际上是从出价到竞标(范围)到哪个文本(文本)的。
为什么FIX的结构(例如范围返回和文本)?因为其实现是简单的字符串替换。
在遍历AST,呼叫所有规则,收集裁剪的预言之后,您可以执行修复。
修复部分的相关源代码是这样:
也就是说,检查了验证,然后根据修复信息自动修复。
修复实际上是一个替代字符串:
一些学生可能会注意到为什么要替换字符串替换?
因为多个修复程序之间的范围可能被重叠。如果有重叠,下次将进行修理,以便对While循环进行维修10次。如果修复程序未固定,则不会修复。
这是FIX实施的原则。它是由字符串替换实现的。
实际上,核心验证和修复的核心是上面的核心,但是ESLINT也支持以前的和以后的处理。也就是说,Pre和Post和Post的进度,也在插件中定义。
先前的处理是分析JS文件的非JS文件,该文件类似于WebPack的加载程序,这使ESLINT PROCESS成为非-JS文件的柔软。
稍后呢?那一定是有效的,也就是说,消息可以过滤一些消息或进行一些修改。
预处理和后过程如何实现?
这是相对简单的,只需在验证之前和之后致电。
我们知道,ESLINT还通过这样的注释支持配置。
它是如何实现的?
注释的配置是通过扫描AST收集所有配置。该配置称为评论指导,即ESLINT线是否生效。
然后在验证结束时,对收集的绒毛私人进行过滤。
这些是实施ESLINT的原则:
Linter已实现核心功能。我们已经在上面介绍了它,但是按照命令行的顺序,您需要处理一些命令行参数,因此您需要打包一层cliengine来读取和写文件,分析命令行参数的命令行参数
它具有基于linter类的上层包装等API,例如executeOnfiles和executeOntext。
但是克利昂宁没有直接暴露它,而是包装了一层ESLINT类。这只是一个相对容易的外观,隐藏了一些无关紧要的信息。
让我们看一下Eslint最终暴露的API:
我们通过源代码阐明了ESLINT的实施原则:
ESLINT的核心类别是Linter,该类别被分为这样的步骤:
除了Core Linter类外,还有用于处理配置和读写文件的Cliengine类,以及最终暴露的ESLINT类。
这是ESLINT的实现原则,但实际上非常简单:
基于AST,基于字符串以及之前和之后的修复,有前后过程,该过程支持注释以配置以滤除一些问题。
清除了这些合理性后,即使在源代码级别,ESLINT也得到了掌握。