eslint入门

现在很多框架已经集成了eslint。但是如果不懂,写几行代码就是各种警告或者错误。这就造成了很多一部分小伙伴觉得eslint不好,然后就取把eslint给禁止了。

那eslint到底有什么用呢?

看官网解释: ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误。
首先如果团队多人的情况下,团队有一套默认的规则,那对于后期维护等会减少很多沟通成功。
然后避免错误这个也很重要。比如代码里面定义了一个变量 var test=1;
然后在一定的条件下再触发获取test.但是代码写错了。写成获取 tset。那这个时候,eslint的报错就很重要了。

开始

创建一个项目

mkdir test // 创建test 文件夹
cd test // 进入文件夹
yarn init -y // 初始化项目
yarn add -D eslint // 安装eslint
mkdir src // 创建我们需要用eslint坚持的文件夹

打开 package.json 文件,增加 scripts 属性如下:

  "scripts": {
    "lint": "eslint src --fix", // fix会根据配置规格修改部分错误
    "lint:create": "eslint --init"
  }

初始eslint。 运行命令

yarn lint:create

出现一堆选项

// 你想怎么用eslint
1、How would you like to use ESLint?
  To check syntax only  // 仅仅检查
 > To check syntax and find problems // 检查并查找错误 
  To check syntax, find problems, and enforce code style // 检查并查找错误 并且强制代码风格
// 然后问我们项目用什么模块开发
What type of modules does your project use? … 
> JavaScript modules (import/export) // es6的import/exports
  CommonJS (require/exports) // node使用的require/exports
  None of these // 不要
// 项目使用的什么框架。由于我们是test,所有选择none of  thest
Which framework does your project use? … 
 React
  Vue.js
>  None of these
// 是否使用typscript
Does your project use TypeScript? › No / Yes
// 你的代码是在客户端还是node环境运行,可以多选。都选吧
Where does your code run? …  (Press <space> to select, <a> to toggle all, <i> to invert selection)
✔ Browser
✔ Node
// 用什么方式来做配置,这里其实都差不多,我们就需要js吧
What format do you want your config file to be in? … 
❯ JavaScript
  YAML
  JSON

这时就生成了配置文件.eslintrc.js了

.eslintrc.js 文件 中我添加了两条规则以便于测试,console警告,引号必须用单引号

module.exports = {
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaVersion": 12,
        "sourceType": "module"
    },
    "rules": {
        "no-console": 'warn', 
        "quotes": ['error', 'single']
    }
};

现在我们进入src文件创建一个a.js文件。

a.js

var a = "345";
b = 4;
console.log('sdf');

然后运行yarn lint;
这个时候控制台就提示了一个错误了

  1:5  error    'a' is assigned a value but never used  no-unused-vars
  2:1  error    'b' is not defined                      no-undef
  3:1  warning  Unexpected console statement            no-console

此时证明我们的eslint生效了。
然后a.js由于 有--fix所有双引号也改为了单引号

var a = '345';
b = 4;
console.log('sdf');

eslint可以配置的方式

ESLint 支持几种格式的配置文件:
JavaScript - 使用 .eslintrc.js 然后输出一个配置对象。
YAML - 使用 .eslintrc.yaml 或 .eslintrc.yml 去定义配置的结构。
JSON - 使用 .eslintrc.json 去定义配置的结构,ESLint 的 JSON 文件允许 JavaScript 风格的注释。
(弃用) - 使用 .eslintrc,可以使 JSON 也可以是 YAML。
package.json - 在 package.json 里创建一个 eslintConfig属性,在那里定义你的配置

如果同一个目录下有多个配置文件,ESLint 只会使用一个。优先级顺序如下:

.eslintrc.js
.eslintrc.yaml
.eslintrc.yml
.eslintrc.json
.eslintrc
package.json

部分配置讲解

  • Environments(env) - 指定脚本的运行环境。每种环境都有一组特定的预定义全局变量。

(比如配置文件中 browser:true。这时我们写window对象才不会报错,node:true才能用node中的全局变量global)

  • Globals - 脚本在执行期间访问的额外的全局变量。

(这里我们可以定义一些全局变量,这样eslint就不会报错了)
"globals": {
"var1": "writable",
"var2": "readonly"
}
//var1 允许被重写,var2 不允许被重写。

  • Rules - 启用的规则及其各自的错误级别。(我们可以对于某些规则修改配置)这个就是我们一般需要修改的重要配置https://eslint.bootcss.com/docs/rules/建议去大概看一下这些规则

"off" 或 0 - 关闭规则
"warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
"error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

可以使用 rules 连同错误级别和任何你想使用的选项
数组的第一项总是规则的严重程度(数字或字符串)
比如: "quotes": ["error", "double"] 必须使用双引号

  • extends 一个配置文件可以被基础配置中的已启用的规则继承,其中eslint:recommended是默认规则。然后我们在rules里面修改规则,会扩展或者覆盖掉。

  • parserOptions - 指定你想要支持的 JavaScript 语言选项
    比如 ecmaVersion 指定 ECMAScript 版本;我们也可以改为支持的es6.目前是最新版本支持;
    sourceType - 设置为 "script" (默认) 或 "module"(如果你的代码是 ECMAScript 模块)
    ecmaFeatures- 这是个对象,表示你想使用的额外的语言特性比如 使用jsx等。

  • plugins 插件]是一个 npm 包,通常输出规则。一些插件也可以输出一个或多个命名的 配置。要确保这个包安装在 ESLint 能请求到的目录下。

plugins 属性值 可以省略包名的前缀 eslint-plugin-
extends 属性值可以由以下组成:

  • plugin:
  • 包名 (省略了前缀,比如,react)
  • /
  • 配置名称 (比如 recommended)

JSON 格式的一个配置文件的例子:

{
    "plugins": [
        "react"
    ],
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended"
    ],
    "rules": {
       "no-set-state": "off"
    }
}

项目中不使用根规则

your-project
├── .eslintrc
├── lib
│ └── source.js
└─┬ tests
  ├── .eslintrc
  └── test.js

我们运行eslint检测的test.js文件时,会找最近的 .eslintrc文件作为最高优先级,然后才是父目录里的配置文件;这时就寻找的tests文件夹下的.eslintrc规则。
为了将 ESLint 限制到一个特定的项目,在你项目根目录下的 package.json 文件eslintConfig 或者 .eslintrc.* 文件里设置 "root": true。ESLint 一旦发现配置文件中有 "root": true,它就会停止在父级目录中寻找

Glob 模式

有时候需要更精细的配置,比如,如果同一个目录下的文件需要有不同的配置,但是又不想创建多个.eslintrc.js。因此,你可以在配置中使用 overrides 键,它只适用于匹配特定的 glob 模式的文件,使用你在命令行上传递的格式 (e.g., app//.test.js)。
Glob 模式覆盖只能在配置文件 (.eslintrc.
或 package.json) 中进行配置
比如:

{
  "rules": {
    // 校验使用双引号
    "quotes": ["error", "double"]
  },
// bin文件夹下和lib文件夹下的js文件使用单引号,但是要排除以.test.js结尾的我那件
  "overrides": [
    {
      "files": ["bin/*.js", "lib/*.js"],
      "excludedFiles": "*.test.js",
      "rules": {
        "quotes": ["error", "single"]
      }
    }
  ]
}

git 提交前检查

我们使用pre-commit;
在刚才的基础上

git init; 初始化项目
yarn add -D pre-commit;

package.json 中增加pre-commit

{
  "name": "test",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "eslint": "^7.20.0"
  },
  "pre-commit": ["lint"], // 把eslint 加入数组中,提交前会先运行这个命令
  "scripts": {
    "lint": "eslint src --fix",
    "lint:create": "eslint --init"
  }
}

这样在我们git commit 的时候就会检查是否符合eslint了。如果不符合就会终止,修改符合之后才能提交。 或者在commit 后面添加 --no-verify

题外

如果我们的项目中有套eslint规则,但是我们vscode需要格式化就自动修复。那我们需要安装eslint插件,然后进入文件 > 首选项 > 设置- setting.json中配置

//配置eslint
  "eslint.autoFixOnSave": true, //  启用保存时自动修复,默认只支持.js文件
  "eslint.runtime": "",
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    {
      "language": "vue",
      "autoFix": true
    },
    {
      "language": "html",
      "autoFix": true
    },
  ],
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354