当前位置: 首页 > news >正文

ESLint 使用教程(五):从输入 eslint 命令到最终代码被处理,ESLint 中间究竟做了什么工作

前言

ESLint 是现代 JavaScript 开发中不可或缺的代码质量工具。它能够帮助开发者找到并修复代码中的问题,提升代码的可维护性。但是,你可能会好奇:从我们在终端里输入 eslint 命令到最终代码被处理,ESLint 中间究竟做了什么工作?本文将深入探讨 ESLint 的工作机制。

工作流程

1. 初始化阶段

当我们在命令行里执行 eslint 命令时,ESLint 首先会进行初始化,这个过程主要包括以下几个步骤:

  1. 加载配置文件
    ESLint 会自动查找并加载配置文件,如 .eslintrc.json 或 package.json 中的 eslintConfig 字段。这些配置文件定义了 ESLint 的规则、环境和插件等信息。
{"env": {"browser": true,"node": true},"extends": "eslint:recommended","rules": {"eqeqeq": "warn","curly": "error"}
}
  1. 解析命令行参数
    ESLint 会解析你在命令行中传递的参数,例如指定要检查的文件或目录、是否自动修复(–fix)等。
  2. 查找插件和扩展
    ESLint 会查找并加载你在配置文件中指定的插件和扩展(例如 eslint-plugin-react 或 eslint-config-airbnb)。这些插件和扩展能够添加自定义的规则和配置,帮助你更好地管理你的代码风格。

2. 文件读取与解析

初始化完成后,ESLint 开始处理指定的文件。这个过程包括以下步骤:

  1. 读取文件内容
    ESLint 会读取你指定的代码文件。这些文件可以是单个文件,也可以是目录中的所有文件。ESLint 会确保读取到的文件都是需要检查的 JavaScript 文件。ESLint 会读取每一个要检查的文件的内容,并将其转换为字符串。
  2. 解析代码
    ESLint 使用 JavaScript 解析器(如 Espree)将代码解析成抽象语法树(AST)。AST 是一种结构化的表示形式,AST 是一个树状结构,表示代码的语法结构,它将代码按照语法结构分解成树状结构,便于分析和处理。

3. 应用规则检测

到了这一步,ESLint 已经有了配置和要检查的代码语法树。接下来就是规则检测的核心阶段:

  1. 规则注册
    ESLint 会根据配置文件和插件,注册所有需要应用的检测规则。每个规则都是一个独立的函数,用于检查代码中的特定问题。
module.exports = {create: function(context) {return {BinaryExpression(node) {if (node.operator === '===') {context.report({node,message: "Use '==' instead of '==='"});}}};}
};
  1. 遍历 AST
    有了 AST,ESLint 就开始应用规则了。每个规则都是一个函数,接受 AST 作为输入,遍历 AST 节点,检查是否违反了规则,发现代码中的潜在问题。例如,假设我们有一个规则要求使用双等号()而不是三等号(=),规则函数会检查所有的比较操作符,如果发现三等号,就会报告问题。
  2. 收集报告
    每当发现一个问题,规则函数会生成一个报告(包含问题的位置、描述和建议)。ESLint 会收集所有的报告,准备在最终阶段输出。

4. 输出结果

检查完成后,ESLint 需要将结果反馈给开发者。这个过程包括两部分:

  1. 格式化输出
    ESLint 会根据配置中的格式化选项(如 stylish 或 json 等)将问题报告格式化为易读的输出形式。
  2. 输出到终端或文件
    ESLint 会将格式化后的结果输出到终端,或者根据配置保存到指定的文件中。如果你使用了 --fix 选项,ESLint 还会自动修复一些可以修复的问题,并将修改后的代码重新写入文件。
/path/to/file.js1:10  warning  Use '==' instead of '==='  eqeqeq

实战案例

我们以 no-debugger 规则为例,具体说明 ESLint 从执行命令到最终处理代码的整个流程。no-debugger 规则禁止在代码中使用 debugger 语句,这有助于避免开发阶段的调试语句留在生产代码中。

1. 初始化阶段

  1. 加载配置文件
    假设你的 .eslintrc.json 配置文件如下:
{"rules": {"no-debugger": "error"}
}

ESLint 会读取这个配置文件,了解要应用的规则和其级别(在这个例子中,no-debugger 规则被设置为错误级别 error)。

  1. 解析命令行参数
    如果你执行了如下命令:
    eslint src/
    ESLint 会解析这个命令,确定要检查 src 目录下的所有文件。

  2. 查找插件和扩展
    如果有配置插件,ESLint 会加载这些插件,但在这个例子中我们只使用了内置规则,所以这一步可以忽略。

2. 文件读取与解析

  1. 读取文件内容
    ESLint 会遍历 src 目录,读取所有 JavaScript 文件的内容。假设其中一个文件 example.js 的内容如下:
function foo() {debugger;
}
  1. 解析代码
    ESLint 使用 Espree 解析器将 example.js 的内容解析为 AST。对于上面的代码片段,生成的 AST 可能部分如下:
{"type": "Program","body": [{"type": "FunctionDeclaration","id": {"type": "Identifier","name": "foo"},"body": {"type": "BlockStatement","body": [{"type": "DebuggerStatement"}]}}]
}

3. 应用规则检测

  1. 规则注册
    ESLint 会根据配置文件注册 no-debugger 规则。no-debugger 规则的实现大致如下:
module.exports = {meta: {type: 'suggestion',docs: {description: 'disallow the use of `debugger`',category: 'Possible Errors',recommended: true},schema: []},create(context) {return {DebuggerStatement(node) {context.report({node,message: 'Unexpected `debugger` statement.'});}};}
};
  1. 遍历 AST
    ESLint 会遍历 example.js 的 AST。当遍历到 DebuggerStatement 节点时,触发 no-debugger 规则的检查函数:
DebuggerStatement(node) {context.report({node,message: 'Unexpected `debugger` statement.'});
}

这个函数会生成一个问题报告,指出在代码中发现了 debugger 语句。

3. 收集报告:

ESLint 收集上述报告,记录下问题出现在 example.js 的具体位置,并记录问题描述。

4. 输出结果

  1. 格式化输出
    ESLint 会根据默认的输出格式(如 stylish)将报告格式化。格式化后的输出可能如下:
 /path/to/src/example.js       2:3  error  Unexpected `debugger` statement  no-debugger   
  1. 输出到终端或文件
    最终,ESLint 会将格式化后的结果输出到终端,帮助开发者发现并修复代码中的问题。

总结

通过以上步骤,ESLint 能够帮助开发者保持代码一致性,提高代码质量。它的内部工作原理虽然复杂,但通过解析配置、读取文件、解析代码、应用规则和报告问题这几个主要步骤,我们可以更好地理解和应用 ESLint。

相关文章:

ESLint 使用教程(五):从输入 eslint 命令到最终代码被处理,ESLint 中间究竟做了什么工作

前言 ESLint 是现代 JavaScript 开发中不可或缺的代码质量工具。它能够帮助开发者找到并修复代码中的问题,提升代码的可维护性。但是,你可能会好奇:从我们在终端里输入 eslint 命令到最终代码被处理,ESLint 中间究竟做了什么工作…...

【安全测试】sqlmap工具(sql注入)学习

前言:sqimap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。它有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获 取数据到访问底层文件系…...

YOLOv11融合CVPR[2023]空间和通道重建卷积ScConv模块及相关改进思路|YOLO改进最简教程

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《SCConv: Spatial and Channel Reconstruction Convolution for Feature Redundancy》 一、 模块介绍 论文链接:SCConv: Spatial and Cha…...

C++研发笔记13——C语言程序设计初阶学习笔记11

从今天开始我们开始第三模块《分支语句和循环语句》的学习,在本模块中我们将会涉及到以下9个内容:什么是语句、分支语句——if语言、分支语句——switch语句、循环语句——while循环、循环语句——for循环、循环语句——do while循环、折半查找算法、猜数…...

html5拖放

1、什么是拖放(Drag 和 Drop) 拖放,字面意思就是拖动,放置 在编程里面也是如此,拖放是一种常见的特性,即抓取对象以后拖到另一个位置。 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。…...

卫导调零天线功率倒置算法原理及MATLAB仿真

卫导调零天线功率倒置算法原理及MATLAB仿真 文章目录 前言一、调零天线简介二、功率倒置自适应算法三、MATLAB仿真四、MATLAB代码总结 前言 \;\;\;\;\; 自适应调零抗干扰技术可以很大程度改善导航抗干扰性能,也是目前导航抗干扰技术中不可或缺的,其研究意…...

【划分型 DP】力扣139. 单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s “leetcode”, wordDic…...

Python学习从0到1 day26 第三阶段 Spark ④ 数据输出

半山腰太挤了,你该去山顶看看 —— 24.11.10 一、输出为python对象 1.collect算子 功能: 将RDD各个分区内的数据,统一收集到Driver中,形成一个List对象 语法: rdd.collect() 返回值是一个list列表 示例: from …...

AWTK fscript 中的 JSON 扩展函数

fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 ** JSON 扩展函数 ** 1.json_load 加载 json 数据。 原型 json_load(str) > object json_load(binary) > object js…...

动态规划 —— dp 问题-买卖股票的最佳时机III

1. 买卖股票的最佳时机III 题目链接: 123. 买卖股票的最佳时机 III - 力扣(LeetCode)https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/ 2. 题目解析 3. 算法原理 状态表示:以某一个位置为结尾或者…...

“绽放艺术风采、激发强国力量” 海南省第十一届中小学生艺术展演活动圆满开展

2024年11月1日,由省教育厅主办、琼台师范学院承办的海南省第十一届中小学生艺术展演省级展演活动在海口正式拉开帷幕。来自全省各市县、省属学校等共计4000余名师生参加本届中小学生艺术展演现场展演活动。 本届展演活动以“绽放艺术风采、激发强国力量”为主题&…...

Linux之文件和目录类命令详解(2)

Linux之文件和目录类命令详解(2) 1、mv-移动文件或重命名2、find-查找文件和目录3、locate-快速查找文件4、du-显示目录或文件的磁盘使用情况5、df-显示文件系统的磁盘空间使用情况6、chmod-更改文件或目录的权限7、chown-更改文件或目录的拥有者8、tree…...

NVR管理平台EasyNVR多品牌NVR管理工具/设备摄像头开启ONVIF的方法

NVR小程序接入平台EasyNVR作为一款功能强大的安防视频监控平台,以其出色的兼容性和灵活性,在智慧校园、智慧工厂、智慧水利等多个场景中得到了广泛应用。本文将重点介绍如何为大华摄像头开启ONVIF协议,以便与EasyNVR进行无缝对接。 大华大部分…...

Pr 视频过渡:沉浸式视频

效果面板/视频过渡/沉浸式视频 Video Transitions/Immersive Video Adobe Premiere Pro 的视频过渡效果中,沉浸式视频 Immersive Video效果组主要用于 VR 视频剪辑之间的过渡。 自动 VR 属性 Auto VR Properties是所有 VR 视频过渡效果的通用选项。 默认勾选&#x…...

SwiftUI开发教程系列 - 第1章:简介与环境配置

1.1 SwiftUI简介 SwiftUI 是 Apple 于 2019 年推出的声明式用户界面框架,旨在简化 iOS、macOS、watchOS 和 tvOS 应用的 UI 开发。与 UIKit 的命令式编程方式不同,SwiftUI 提供了一种声明式语法,让开发者可以以更加直观、简洁的方式构建 UI。…...

gitlab ci/cd搭建及使用笔记

记录下使用gitlab的ci/cd的devops构建过程中,一些易忘点或者踩坑点: 官方文档中英文(建议英文) https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html https://gitlab.cn/docs/jh/ci/pipelines/schedules.html为什么创建了…...

Xcode 16 中 Swift Testing 的参数化(Parameterized)机制趣谈

概述 我们之前曾在 《用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门》系列博文以及《WWDC24(Xcode 16)中全新的 Swift Testing 使用进阶》博文中较为系统地介绍了今年 WWDC 24 中全新的 Swift Testing 测试系统。 不过 Swift Testing 的本领远…...

Python自动化运维DevSecOps与安全自动化

Python自动化运维DevSecOps与安全自动化 目录 🛡️ DevSecOps概念与实践🔍 自动化安全扫描与漏洞修复🧰 基于Python的安全审计与合规性检查🐳 云平台与容器安全:基于Python的容器扫描工具⚠️ 自定义安全检测与漏洞修…...

2024下半年系统架构师考试【回忆版】

2024年11月10日,系统架构师考试如期举行,屡战屡败的参试倒是把北京的学校转了好几所。 本次考试时间 考试科目考试时间综合知识、案例分析8:30 - 12:30论文14:30 - 16:30 综合知识 1、1-1000以内包含5的数字个数 2、 案例分析 1、RESTful 对于前后…...

UE5.4 PCG 自定义PCG蓝图节点

ExecuteWithContext: PointLoopBody: 效果:点密度值与缩放成正比...

迁移学习相关基础

迁移学习 目标 将某个领域或任务上学习到的知识或模式应用到不同但相关的领域或问题中。 主要思想 从相关领域中迁移标注数据或者知识结构、完成或改进目标领域或任务的学习效果。 概述 Target data:和你的任务有直接关系的数据,但数据量少&#xff…...

华为云计算HCIE-Cloud Computing V3.0试验考试北京考场经验分享

北京试验考场 北京考场位置 1.试验考场地址 北京市海淀区北清路156号中关村环保科技示范园区M地块Q21楼 考试场选择北京,就是上面这个地址,在预约考试的时候会显示地址,另外在临近考试的时候也会给你发邮件,邮件内会提示你考试…...

数据分析——学习框架

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取行情数…...

pytorch实现深度神经网络DNN与卷积神经网络CNN

DNN概述 深度神经网络DNN来自人脑神经元工作的原理,通过在计算机中逻辑抽象出多个节点,接收处理并向后传递信息,实现计算机的自我学习,类比结构见下图: 该方法通过预测输出与实际值的差异不断调整节点参数&#xff0…...

芯片测试-LDO测试

LDO测试 💢LDO的简介💢💢压降💢💢决定压降的主要因素💢 💢LDO的分类及原理💢💢PMOS LDO💢💢PMOS LDO工作过程💢💢PMOS LDO…...

期权懂|期权新手看过来:看跌期权该如何交易?

期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权新手看过来:看跌期权该如何交易? 一、可以直接购买看跌期权‌: (1)选择预期下跌的标的资产。 (2&#…...

《深入浅出HTTPS​​​​​​​​》读书笔记(8):密码学Hash算法的分类

密码学Hash算法有很多,比如MD5算法、SHA族类算法,MD5早已被证明是不安全的Hash算法了,目前使用最广泛的Hash算法是SHA族类算法。 1)MD5 MD5是一种比较常用的Hash算法,摘要值长度固定是128比特。 MD5算法目前被证明已…...

大语言模型安全,到底是什么的安全

什么是AI安全 自ChatGPT问世以来,市场上涌现出了众多大型语言模型和多样化的AI应用。这些应用和模型在为我们的生活带来便利的同时,也不可避免地面临着安全挑战。AI安全,即人工智能安全,涉及在人工智能系统的开发、部署和使用全过…...

论文2—《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告

论文报告:基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对机器人辅助微创手术中定向障碍和缺乏导航信息的问题,设计了一种智能控制导航手术机器人系统。该系统采用可靠和安全的定位技术、7自由度机械臂以及避免关节角度限制的逆运动学控制策…...

wordpress js css压缩/网站策划报告

REST 1、简单介绍 REST:即 Representational State Transfer,(资源)表现层状态转化。是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解、扩展方便,正得到越来越多的网站的使用。 它是面向资源的,而资…...

wordpress mxtheme02/揭阳seo推广公司

需求的来源有很多,需求的处理方式也不尽相同。有效的收集需求,将收集到的需求去伪存真,是产品设计环节中最重要的一环,如同大厦的地基,地基不坚实,大楼是盖不起来的。 我把需求分析分为两个阶段&#xff0…...

太原网站科技公司/深圳网络推广软件

逆深度参数化(Inverse Depth Parametrization) 更多《计算机视觉与图形学》知识,可关注下方公众号:...

手机投资网站/广东网络seo推广公司

我感觉我是一个比较有发言权的人吧,我在测试行业爬模滚打5年,从点点点的功能测试到现在成为测试开发工程师,工资也翻了几倍; 个人觉得,测试的前景并不差,只要自己肯努力;我刚出来的时候是在鹅厂…...

做资源网站怎么不封/公司推广咨询

打开qgis ,在PostGIS上右键点击【连接】,如下 点击【测试连接】 连接成功 这样就对应起来了,删除qgis中的sichuan图层,即表示删除postgis中的sichuan图层...

在线视频2018免费视频/沈阳seo网站推广

往期回顾「正则表达式」 一、正则表达式字符匹配(前端必懂 )「正则表达式」二、正则表达式位置匹配(前端必懂 )正文内容简单理解:括号提供了分组,便于我们使用它。通常有两种引用情况:在JS代码中引入,和在正则表达式中引入。分组和…...