ESLint配置详解

news2024/11/24 11:37:55

ESLint配置详解

ESLint 是一个代码检查工具,用来检查代码是否符合指定的规范,防止在多人协作开发时代码格式不统一。

安装

全局安装

npm install eslint -g

当前项目安装

npm install eslint -D

安装之后运行eslint --init进行初始化,使用eslint --init会根据命令配置好一个模板.eslintrc.*文件。
在这里插入图片描述

当然也可以手动创建一个.eslintrc.*(支持后缀请看下面的配置文件部分)文件。

TODO 如果你想使用托管在 npm 上的指定可共享配置,你可以使用 --config 选项并指定包名:

执行eslint xxx命令对文件夹下的所有js文件或者单独某个js文件(指定文件名)进行校验。

配置文件

配置文件格式

ESLint 支持几种格式的配置文件:

  • js(一般都是使用该后缀)
  • cjs
  • yaml
  • json

同时可以在package.json文件添加eslintConfig配置。

如果在同一目录下存在多个配置文件,ESLint 将按照以下优先顺序只使用其中一个(并不会进行合并配置):

  1. .eslintrc.js
  2. .eslintrc.cjs (需要在 package.json 中指定 "type":"module"
  3. .eslintrc.yaml
  4. .eslintrc.yml
  5. .eslintrc.json
  6. package.json

配置文件的使用

通常情况下ESLint都是使用在根目录下创建的.eslintrc.*文件,不过也可以通过指令指定配置文件。

eslint -c eslintConfig.js myfile.js 

如果指定了配置文件,如果没有设置忽略的话,那么同时要校验的文件同目录及父目录下的.eslintrc.*都会生效(详情看下面的级联和层级结构)。

设置忽略只需在命令后添加--no-eslintrc

eslint -c eslintConfig.js myfile.js --no-eslintrc

级联和层次结构

ESLint 会自动在要检查文件的目录中寻找( .eslintrc.*package.json 文件),并在其直系父目录中寻找,直到文件系统的根目录(/)、当前用户的主目录(~/)或指定 root: true 时停止。

比如创建了以下结构的目录

root
├── .eslintrc.js
├── src
│ └── index.js
└─┬ tests
  ├── .eslintrc.js
  └── test.js

在根目录下执行eslint srcsrc目录没有.eslintrc.*或者package.json文件,因此往父目录上找,找到root/.eslintrc.js这个文件,因此执行这个配置。

在根目录下执行eslint teststests目录存在一个.eslintrc.js文件(在合并时优先考虑),继续找父目录,也存在一个.eslintrc.js文件,ESLint会将这两个配置文件进行合并。

配置级联的工作是基于被提示的文件的位置。如果有一个 .eslintrc 文件与被提示的文件在同一目录下,那么该配置将被优先考虑。然后 ESLint 沿着目录结构向上搜索,合并沿途发现的任何 .eslintrc 文件,直到到达 root: true.eslintrc 文件或根目录。

如果在同一目录下有 .eslintrc.*package.json 文件,.eslintrc.* 将优先使用,package.json 文件将不被使用

扩展配置文件

可以使用extends字段(详情请看下面的rules/extends部分)来继承另一个配置文件的特征(包括规则、插件和语言选项)并修改所有选项。它有三种配置,定义如下:

  • 基础配置:被扩展的配置。
  • 派生配置:扩展基础配置的配置。
  • 实际配置:将派生配置合并到基础配置的结果。

字段详解

.eslintrc.*文件中可以配置多种字段,下面来看看对每个字段的详细介绍:

root

默认情况下,ESLint 将在所有父文件夹中寻找配置文件,直到根目录(所有这些配置文件的规则都会被层叠应用。若有重复的属性配置,则离文件更近的配置文件具有更高的优先级)。要将 ESLint 限制在一个特定的项目中,在 .eslintrc.* 文件或 package.json 文件的 eslintConfig 字段内或在项目根层的 .eslintrc.* 文件中设置 "root": true。一旦 ESLint 找到 "root": true 的配置,它将停止在父文件夹中寻找。

因此建议当想要所有项目都遵循一个特定的规则时,最好给项目根目录的.eslintrc.js文件加上"root": true配置。

rules

规则是 ESLint 的核心构建模块。

ESLint 有大量的内置规则(例如:no-consoleno-var这些),开发者可以通过配置注释或配置文件来修改项目使用到的规则,也可以通过插件添加更多规则。

规则配置

规则的设置值必须为以下几个:

  • off或者0: 关闭规则
  • warn或者1: 启用并视作警告(不影响退出)。
  • error或者2: 启用并视作错误(触发时退出代码为 1)。

来个简单例子看看具体的区别:

规则就设置一个no-console,测试的js文件中就一行console.log('eslint')

  • off或者0的时候eslint校验通过。
  • warn或者1的时候会有一个警告,但是程序并未退出,继续打印done
    在这里插入图片描述
  • error或者2的时候在打印出错误后直接退出程序。
    在这里插入图片描述

使用配置注释

可以单独在文件中进行配置(以注释的方式)

/* eslint no-console: "warn" */
console.log('eslint');

插件规则

要配置定义在插件中的规则,你必须在规则 ID 前加上插件的名称和 /

{
  plugins: ["plugin1"],
  rules: {
    "plugin1/rule1": 2
  }
}

规则 plugin1/rule1 来自名为 plugin1 的插件,包含在名为 eslint-plugin-plugin1npm 包中。

禁用规则

我们在开发的过程中,有时候不想使用某些规则,可以使用配置注释禁用规则。

/* eslint-disable */
console.log("eslint")
/* eslint-enable */

注释内的所有代码不需要任何规则,在js文件的第一行添加则整个文件都禁用规则。

/* eslint-disable no-alert, no-console */
alert('eslint');
console.log('eslint');
/* eslint-disable no-alert, no-console */

单独禁用某些规则。


console.log('eslint'); // eslint-disable-line

// eslint-disable-next-line
console.log('eslint');

console.log('eslint'); /* eslint-disable-line */

/* eslint-disable-line */
console.log('eslint');

禁用某一特定行的规则。

/* eslint-disable-line no-console */
console.log('eslint');

单独禁用某一特定行的某些规则。

plugins

plugin插件主要是为eslint新增一些检查规则,虽然ESLint本身有些规则,但肯定无法包含所有语法,比如vuereact这些,因此ESLint是支持自定义规则的。

来看看eslint-plugin-vue源码,里边定制了一些eslint规则。
在这里插入图片描述

那么对于新增加的规则,如果想要在项目中使用,需要进行以下步骤:

  1. 安装对应的ESLint插件(比如eslint-plugin-vue
  2. 加载插件(在plugins中配置,赋予ESLint解析插件规则的检查能力),然后在rules中开启规则。
module.exports = {
  plugins: [
    'eslint-plugin-vue'
  ],
  rules: {
    'eslint-plugin-vue/no-v-html': 2
  }
}

plugins 属性值可以省略包名中的 eslint-plugin- 前缀,也就是说可以直接通过vue引入

"plugins": "vue",

extends

用于引入继承其他配置包中配置,然后通过合并/覆盖所有原本的配置生成最终的规则(extends可以看做是集成多个配置方案的方式,配置的内容实际就是配置好的.eslintrc.js,不然对于每一个项目都要重新一步步开始选择配置规则就比较显得不太人性)。

extends的属性值可以是:

  • 定义一个配置的字符串(配置文件的路径、可共享配置的名称,如eslint:recommendedeslint:all)。
  • 字符串数组,每个扩展都会先继承前面一个扩展的配置(允许 extends 配置多个模块,如果规则冲突,位置靠后的包将覆盖前面的。rules 中的规则相同,并且优先级恒定高于 extends,类似classextends,支持多继承)。

extends 属性值由以下内容组成:

  • plugin:
  • 包名(可以省略其前缀,如 vueeslint-plugin-vue 的缩写)
  • /
  • 配置名称(如 recommended

TODO 暂时未确定
插件包名的格式一般是eslint-plugin-<plugin-name>,就像 eslint-plugin-vue,也可能是含命名空间包的格式@<scope>/eslint-plugin-<plugin-name>,例如 @vue/eslint-config-prettier,甚至 @<scope>/eslint-plugin,如@jquery/eslint-plugin

下面是引入了vue3的配置:

"extends": "plugin:vue/vue3-essential",

eslint-plugin-vue里实现了多种配置规则,为了方便其他人使用,它默认实现了最佳实践recommened,原先还需要自己一条条选择,这样就可以直接把官方配置好的最佳实践直接拿来用。如果碰到和自己风格或者规范有冲突的规则,那直接在rules中重新定义就可以了。
在这里插入图片描述

插件实现扩展配置流程

通过extends设置的配置包加载的时候,是递归的形式去查找配置文件然后一步步派生继承的。

env

env 用于指定代码运行的环境。在不同的运行环境下,JavaScript 中可用的全局变量可能会不同,使用 env 可以让 ESLint 知道当前代码运行的环境,从而正确地识别全局变量,避免误报未定义变量等问题。

常见的 env(查看所有env) 配置如下:

  • browser:浏览器环境,可以使用浏览器中的全局变量如 windowdocument 等。
  • nodeNode.js 环境,可以使用 Node.js 中的全局变量如 processBuffer 等。
  • commonjsCommonJS 环境,可以使用 CommonJS 模块中的变量如 modulerequire 等。
  • es6ES6 环境,可以使用 ES6 中的全局变量如 SetMap 等。
  • jestJest 测试框架环境,可以使用 Jest 中的全局变量如 describetest 等。

parser

自定义解析器,从其他类型的文件中提取 JavaScript 代码,或在提示前对代码进行预处理。

也可以使用自定义解析器将 JavaScript 代码转换成抽象的语法树,供 ESLint 评估。如果你的代码与 ESLint 的默认解析器 EspreeESLint默认解析器) 不兼容,可能需要添加自定义解析器。

@typescript-eslint/parser就是把typescript转换为与 ESTree 兼容的形式的解析器。

parser: '@typescript-eslint/parser'

parserOptions

用于指定想要支持的js语言选项,Eslint默认使用 ECMAScript 5 语法,不过可以通过parserOptions来覆盖语法。

可配置值为:

  • ecmaVersion - 设置为 3、5(默认)、6、7、8、9、10、11、12 或 13,以指定你要使用的 ECMAScript 语法的版本。你也可以设置为 2015(6)、2016(7)、2017(8)、2018(9)、2019(10)、2020(11)、2021(12)或 2022(13)来使用基于年份的命名。你也可以设置 "latest" 来使用受支持的最新版本。
  • sourceType - 设置为 "script"(默认值)或 "module"(如果代码是 ECMAScript 模块)。
  • allowReserved - 允许使用保留字作为标识符(如果 ecmaVersion 为 3)。
  • ecmaFeatures - 表示你想使用哪些额外的语言特性的对象。
    • globalReturn - 允许全局范围内的 return 语句
    • impliedStrict - 启用全局严格模式(如果 ecmaVersion 是 5 或更高版本)
    • jsx - 启用 JSX

overrides

对于同一目录下的文件而已,使用的配置基本都是同一份,不过ESLint也提供了一个可以用于让同一目录下的文件使用不同配置的方式。

overrides 中提供配置,这些配置只会用于符合特定 glob 模式的文件,且使用与你在命令行中传递的相同格式(如 src/*.js)。

{
  rules: {
    'no-console': 2'no-alert': 2
  },
  overrides: [
    {
      files: ['src/*.js'],
      excludedFiles: ["src/index.js"],
      rules: {
        "no-console": 0
      }
    }
  ]
}

以上的配置是在src目录下的所有文件(除了index.js)都可以使用console.log而不会报错,因为overrides.rules中的no-console: 0规则覆盖掉了rules中的no-console: 2,而no-alert: 2没有被覆盖,仍会生效。

以下是几点overrides的工作方式:

  • 在同一配置文件中,glob 模式覆盖的优先级高于常规配置。同一个配置文件中的多个覆盖会按顺序应用。也就是说,配置文件中的最后一个覆盖块总是具有最高的优先权。
  • 针对 glob 的配置与其他 ESLint 配置的工作原理几乎相同。覆盖块可以包含任何在常规配置中有效的配置选项,但 rootignorePatterns 除外。
    • 一个 glob 特定的配置可以有一个 extends 设置,但扩展配置中的 root 属性会被忽略。扩展配置中的 ignorePatterns 属性只用于 glob 特定配置所匹配的文件。
    • 嵌套的 overrides 设置只有在父配置和子配置的 glob 模式都匹配时才会被应用。当扩展的配置设置了 overrides 时也是这样。
  • 在覆盖块中可以提供多个 glob 模式。一个文件必须至少与所提供的模式之一相匹配,才能使用该配置。
  • 覆盖块也可以指定排除在匹配之外的模式。如果一个文件与任何一个被排除的模式相匹配,则不会使用该配置。

ignorePatterns

通过配置 glob 匹配模糊让 ESLint 在检查时忽略明确的文件或目录。

可以使用下列方法忽略文件:

  • 在配置文件中添加 ignorePatterns
  • 创建包括忽略匹配模式的专用文件(默认为 .eslintignore)。
{
  ignorePatterns: ['src/*.js']
}

注意:

  • ignorePatterns 中的 glob 模式是相对于配置文件所在的目录而言的。
  • 不能在 overrides 属性中使用 ignorePatterns 属性。
  • .eslintignore 中定义的模式优先于配置文件的 ignorePatterns 属性

使用.eslintignore

.eslintignore 文件是一个纯文本文件,其中每一行都是一个 glob 模式,表示哪些路径应该被省略掉。

当运行 ESLint 时,在决定要检查的文件范围前,它会在当前工作目录中寻找 .eslintignore 文件。如果找到该文件,那么在遍历目录时就会应用这些偏好。每次只能使用一个 .eslintignore 文件,且仅会使用当前工作目录中的 .eslintignore 文件。

Glob 使用 node-ignore 进行匹配,因此有许多特性:

  • # 开头的行被视为注释,不影响忽略模式。
  • 路径是相对于当前工作目录的。这也适用于通过 --ignore-pattern命令传递的路径。
  • 前面有 ! 的行是否定模式,会重新包含被先前模式忽略的模式。
  • 忽略模式的行为与 .gitignore 规范一致。
# 忽略所有的 JavaScript 文件
**/*.js

# 有效路径  
/app/src/*.js

# 无效路径  路径必须使用正斜杠作为路径分隔符
\app\src\*.js

# src/test.js没有忽略,src/下其他js文件会被忽略
src/
!src/test.js

使用替代文件

通过 --ignore-path 选项可以配置其他目录下的.eslintignore文件(并且文件名不需要局限于.eslintignore)。

eslint --ignore-path .jshintignore file.js

错误修正

ESLint提供了几个选项来尝试修复问题:

  1. --fix
    指示 ESLint 尝试修复尽可能多的问题。这些修复是对实际文件本身进行的,只有剩余的未修复的问题才会被输出。

当然不是所有的问题都可以通过这个选项修复的,以下情况并不适用:

  • 当代码通过 pipe 传递给 ESLint 时会抛出错误。
  • 此项对使用处理器的代码没有影响,除非处理器选择了允许自动修复。
  1. --fix-dry-run
    此项与 --fix 的效果相同,但有一点不同:修复后的代码不会保存在文件系统中。因为默认格式不输出修复后的代码,你必须使用另一种格式(如 json)来获得修复内容。

这使得从 stdin 中修复代码成为可能(当与 --stdin 标志一起使用时)。

getSomeText | npx eslint --stdin --fix-dry-run --format=json
  1. --fix-type

用于在使用 --fix--fix-dry-run 时指定应用的修复类型。

有四种修复类型(可同时配置多个):

  • problem - 修复代码中的潜在错误
  • suggestion - 改进代码
  • layout - 修复不改变程序结构(AST)的问题
  • directive - 修复内联指令,如 // eslint-disable
npx eslint --fix --fix-type suggestion .
npx eslint --fix --fix-type suggestion --fix-type problem .
npx eslint --fix --fix-type suggestion,layout .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你真的理解分布式数据的分区吗?

分布式数据存储是指将数据分散存储在多个节点或服务器上的技术。而分区是将数据划分为逻辑上的片段或部分&#xff0c;每个分区可以在分布式系统中的不同节点上存储。分区主要是为了可扩展性。不同的分区可以放在不共享集群中的不同节点上&#xff0c;可以帮助实现负载均衡、高…

玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

一、前言 在设计测试案例时&#xff0c;经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法&#xff0c;然后编写在测试案例调用它。即使使用了通用方法&#xff0c;这样的工作也是有很多重复性的&#xff0c;程序员都懒&#xff0c;都希望能够少…

Liunx基础命令 - cd命令

cd命令 – 切换目录 cd命令来自英文词组“change directory”的缩写&#xff0c;其功能是用于更改当前所处的工作目录&#xff0c;路径可以是绝对路径&#xff0c;也可以是相对路径&#xff0c;若省略不写则会跳转至当前使用者的家目录。 **语法格式&#xff1a;**cd [参数] …

VMware Workstation 17 Pro安装配置CentOS 7与ssh工具链接配置

VMware Workstation 17 Pro安装配置CentOS 7与ssh工具链接配置 下载安装虚拟机VMware Workstation 17 Pro 虚拟机官网&#xff1a;点击直达 下载Cent os 7 镜像文件 123网盘地址&#xff1a;点击直达 提取码1213 在虚拟机中安装Cent os 7 第一步 点击 创建新的虚拟机 第二步 默…

解释什么是蓝绿发布?

蓝绿发布(Blue-green release)是一种软件部署策略&#xff0c;主要用于应对新版本软件在生产环境中的测试和部署。这种策略将新版本软件分为两个阶段&#xff1a;蓝色阶段和绿色阶段。蓝色阶段通常在开发和测试环境中进行&#xff0c;而绿色阶段则在生产环境中进行。 蓝色阶段…

C语言运算符:赋值与计算

目录 赋值运算符 算术运算符 赋值运算符 下表列出了 C 语言支持的赋值运算符&#xff1a; 运算符描述实例简单的赋值运算符&#xff0c;把右边操作数的值赋给左边操作数C A B 将把 A B 的值赋给 C加且赋值运算符&#xff0c;把右边操作数加上左边操作数的结果赋值给左边操…

C语言基础知识:关系运算符与逻辑运算符

目录 1、关系运算符介绍 2、应用示例 3、逻辑运算符介绍 4、逻辑表达式的书写 5、不得不说的逻辑非 1、关系运算符介绍 关系运算&#xff08;Relational Operators&#xff09;&#xff0c;用于判断条件&#xff0c;决定程序的流程。 关系数学中的表示C语言的表示小于&l…

GPT神奇应用:生成菜谱

正文共 662 字&#xff0c;阅读大约需要 2 分钟 料理新手/爱好者必备技巧&#xff0c;您将在2分钟后获得以下超能力&#xff1a; 快速生成菜谱 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图…

VMWare 虚拟机创建 + 初始化

目录 概述 1. VMware创建虚拟机 2. IP 配置 nmtui nmcli 3. Yum 源配置 光盘的Packages作为Yum源 配置开机自动挂载(光盘) 配置私有Yum仓库 跟新私有yum仓库 报错和修复 4. 文件共享系统配置 跟新配置文件/etc/hosts /etc/yum.repo.d/ftp.repo 同步配置文件 测试…

HLS入门实现一个led灯的闪烁

文章目录 前言一、HLS是什么&#xff1f;与VHDL/Verilog编程技术有什么关系?1、HLS简介2、开发流程3、HLS与VHDL/Verilog编程技术有什么关系? 二、2. HLS有哪些关键技术问题&#xff1f;目前存在什么技术局限性&#xff1f;1.关键技术问题2、技术局限性 三、使用 HLS 完成 le…

第十二章创建模式—享元模式

文章目录 享元模式概述结构 实例优缺点和使用场景使用场景JDK源码解析 结构型模式描述如何将类或对象按某种布局组成更大的结构&#xff0c;有以下两种&#xff1a; 类结构型模式&#xff1a;采用继承机制来组织接口和类。 对象结构型模式&#xff1a;釆用组合或聚合来组合对象…

渗透测试--2.漏洞探测和利用

目录 一.漏洞分类 二.漏洞探测 三.漏洞利用 四.漏洞扫描 1.Nessus 2.Web应用漏洞扫描器——DVWA 五.Metasploit漏洞利用 一.漏洞分类 网络漏洞 系统漏洞 应用漏洞 人为不当配置 二.漏洞探测 渗透测试是一种测试网络、应用程序和系统安全性的方法&#xff0c;旨在发现…

Xilinx FPGA DDR3设计(三)DDR3 IP核详解及读写测试

引言&#xff1a;本文我们介绍下Xilinx DDR3 IP核的重要架构、IP核信号管脚定义、读写操作时序、IP核详细配置以及简单的读写测试。 01.DDR3 IP核概述 7系列FPGA DDR接口解决方案如图1所示。 图1、7系列FPGA DDR3解决方案 1.1 用户FPGA逻辑&#xff08;User FPGA Logic&#…

玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

一、前言 “深入解析”对我来说的确有些难度&#xff0c;所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧&#xff0c;只能是对gtest的整体结构的一些介绍&#xff0c;想要了解更多细节最好的办法还是看gtest源码&#xff0c;如果你看过gtest源码…

麒麟操作系统软件更新灾难连篇之一:中文输入法消失

今天在麒麟操作系统开QQ总是过一会儿就闪退&#xff0c;于是进软件商店看看是否有更新。 真是不看不知道&#xff0c;一看吓一跳&#xff0c;居然有几十个软件更新&#xff0c;照常理&#xff0c;软件升级后应该是更加好用&#xff0c;于是先把QQ、五笔字型、搜狗输入法等几个常…

centos7.9搭建redis6.0.6哨兵模式

redis6.0.6哨兵模式搭建文档 1.准备工作1.1 ip规划安装依赖&#xff08;三台机器都操作&#xff09;1.3 gcc升级&#xff08;三台机器都操作&#xff09; 2.安装redis&#xff08;三台机器都操作&#xff09;2.1 获取安装包2.2 解压2.3 编译2.4 验证上一步是否正确2.5 安装2.6…

Windows10安装二进制Mysql-5.7.41和汉化

1.创建my.ini [mysqld] ##skip-grant-tables1 port 3306 basedirD:/webStudy/mysql-5.7.41 datadirE:/adata/mysqlData max_connections200 character-set-serverutf8 default-storage-engineINNODB sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysql] default-char…

Liunx基础命令 - which命令

which命令 – 查找命令文件 ​ which命令的功能是用于查找命令文件&#xff0c;能够快速搜索二进制程序所对应的位置。如果我们既不关心同名文件&#xff08;find与locate&#xff09;&#xff0c;也不关心命令所对应的源代码和帮助文件&#xff08;whereis&#xff09;&#…

C++中类的静态成员变量与静态成员函数

static声明为静态的&#xff0c;称为静态成员。 不管这个类创建了多少个对象&#xff0c;静态成员只有一个拷贝&#xff0c;这个拷贝被所有属于这个类的对象共享。 静态成员 属于类 而不是对象。 静态变量&#xff0c;是在编译阶段就分配空间&#xff0c;对象还没有创建时&…

ARM-栈帧(一)

ARM 栈帧 本系列均以 corter-A7(armv7-a) 为例 在 ARM 中&#xff0c;通常为满减栈&#xff08;Full Descending FD&#xff09;, 也就是说&#xff0c;堆栈指针指向堆栈内存中最后一个填充的位置&#xff0c;并且随着每个新数据项被压入堆栈而递减。 栈的本质 要理解栈的本…