[ESLint] 遇到了一个奇葩问题,我得学下ESLint

前言:我为什么要专门看下ESLint?

最近使用Vue脚手架创建了项目,使用到了ESLint,并且也安装了ESlint插件,在保存时自动lint代码。但是发现每次保存的时候都会有错,然后根据提示修改了代码,再次保存时代码又变了,又报错,于是决定花一些时间了解下ESLint。

1.什么是ESLint

ESLint官网地址:https://zh-hans.eslint.org/

ESLint是一个根据方案识别并报告ES/JS代码问题的工具,其目的是使代码风格更加一致并避免错误,帮你编写更加干净、可靠的代码。

ESLint具有高度可配置性,允许你定义自己的编码风格规则,或者选择各种预配置的规则集,比如:Airbnb\Google\Standard。也可以根据项目的具体需求自定义ESLint,强制执行一致的代码风格。

通过上面的简介,大概已经明白了ESLint的好处。并且现在的企业级项目开发中,都会使用ESLint来规范团队开发。

2. 安装使用

2.1 在项目中安装ESLint

执行以下命令进行安装和配置,在选择一些配置之后,就会在项目中导入ESLint:

npm init @eslint/config

✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser
✔ How would you like to define a style for your project? · guide
✔ Which style guide do you want to follow? · standard
✔ What format do you want your config file to be in? · JavaScript
Checking peerDependencies of eslint-config-standard@latest
Local ESLint installation not found.
The config that you've selected requires the following dependencies:

eslint-plugin-vue@latest eslint-config-standard@latest eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 || ^16.0.0  eslint-plugin-promise@^6.0.0
✔ Would you like to install them now? · No / Yes
✔ Which package manager do you want to use? · npm
Installing eslint-plugin-vue@latest, eslint-config-standard@latest, eslint@^8.0.1, eslint-plugin-import@^2.25.2, eslint-plugin-n@^15.0.0 || ^16.0.0 , eslint-plugin-promise@^6.0.0

added 211 packages, and audited 212 packages in 12s

91 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Successfully created .eslintrc.js file in /Users/xxx/Desktop/ESLintStudy

2.2 配置

在运行完npm init @eslint/config之后,项目目录下会有.eslintrc.{js,yml,json} 文件,我的是有个.eslintrc.js文件:

image.png

如果我们想要自定义一些规则,就需要修改这个文件的配置了。

2.3 执行eslint

我们先建立一个测试的js文件,代码格式很随性:

function test(params) {
    let a=10;
    let b =     10+1
    console.log(b);
}

如果保存时自动格式化了,我们需要在设置中搜索格式化,将VSCode中的配置关闭:

image.png

VSCode这个的规则可能跟ESLint的规则不一样,所以保存的时候可能会按照VSCode默认的代码格式规则进行修改,但是又不满足ESLint的规则,所以就遇到了顶部的那个奇葩问题。

🤔不知道这个配置是否正确,如果有大佬了解,可以指点一下。

然后我们使用npx eslint hello.js检查代码,4行代码,居然有14个错误:

$ npx eslint hello.js

  1:10  error  'test' is defined but never used               no-unused-vars
  1:14  error  Missing space before function parentheses      space-before-function-paren
  2:1   error  Expected indentation of 2 spaces but found 4   indent
  2:9   error  'a' is assigned a value but never used         no-unused-vars
  2:9   error  'a' is never reassigned. Use 'const' instead   prefer-const
  2:10  error  Operator '=' must be spaced                    space-infix-ops
  2:13  error  Extra semicolon                                semi
  3:1   error  Expected indentation of 2 spaces but found 4   indent
  3:9   error  'b' is never reassigned. Use 'const' instead   prefer-const
  3:12  error  Multiple spaces found before '10'              no-multi-spaces
  3:19  error  Operator '+' must be spaced                    space-infix-ops
  4:1   error  Expected indentation of 2 spaces but found 4   indent
  4:19  error  Extra semicolon                                semi
  5:2   error  Newline required at end of file but not found  eol-last

✖ 14 problems (14 errors, 0 warnings)
  12 errors and 0 warnings potentially fixable with the `--fix` option.

根据这些错误,我们就可以根据提示信息,修改我们的代码了。

这里为什么使用npx?

因为我们并没有在全局安装ESLint,所以是没有eslint这个命令的,需要使用npx。npx是npm5.2引入的工具,可以临时安装可执行依赖包,并且执行依赖包中的命令,安装完成之后会自动运行,用完后会删除。

3.ESLint扩展安装

我们肯定不想每次敲完代码都手动执行检查命令,如果我们开发时能够在文件保存时自动按照配置的ESLint规则格式化代码,这样就能够大大的提高开发效率了,我们可以使用VSCode中的ESLint插件来实现此需求。

在VSCode的扩展面板中直接搜索ESLint,然后安装下载量最多的那个即可:

image.png

3.1 开启自动保存修复

每次修改完代码,可以在保存的时候对代码进行修复,Mac下点击Code -> 首选项 -> 设置 打开设置页面:

image.png

然后选择用户 -> 扩展 -> ESLint -> 打开setting.json文件:

image.png

添加以下配置,设置该配置项仅为ESLint打开:

    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": "explicit"
    }

如下图所示:


image.png

可能在其他文章,关于这个配置有一些不同,这是因为ESLint插件的版本不同,我们可以在其插件的介绍或者github中看到相关的说明,使用最新的配置即可:https://github.com/Microsoft/vscode-eslint

4.忽略指定文件和目录

如果项目中有些文件或者目录不希望让ESLint去做校验,可以在根目录下创建.eslintignore文件,来告诉ESLint跳过校验,比如忽略dist文件中的代码,参考:https://zh-hans.eslint.org/docs/latest/use/configure/ignore

dist/* 
public/*.js

除了这种针对文件或者文件夹忽略的方式,还可以通过在代码中加入注释来告诉ESLint是否需要校验代码:

/* eslint-disable */        // 文件最顶部,整个文件都不校验
console.log('Hello Word')

/* eslint-disable */        
console.log('Hello Word')
/* eslint-enable */     // 忽略被注释包起来的代码

  

/* eslint-disable no-console */
console.log('Hello Word')       // 全局针对指定规则进行禁用



// 只针对当前行  eslint-disable-next-line 后跟规则

console.log('Hello Word')    // eslint-disable-next-line no-console

// eslint-disable-next-line no-console 
console.log('Hello Word')

5. ESLint基础配置

5.1 rules

规则是 ESLint 的核心构建模块。规则验证你的代码是否符合某个期望,以及如果不符合该期望该怎么做。规则还可以包含针对该规则的额外配置选项。

如果想要改变规则的设置,需要把规则ID设置为以下值:

  • off 或 0,关闭规则
  • warn 或 1,启用并视作警告
  • error 或 2,启用并视作错误

通常会将规则设置为error,以便在集成测试、pre-commit检查和拉取请求合并中强制遵守规则。

5.1.1 使用配置注释

在下边这个例子中,关闭eqeqeq,启用了curly并视作错误:

/* eslint eqeqeq: "off", curly: "error" */

还可以增加一些注释描述,解释为什么注释是必要的:

/* eslint eqeqeq: "off", curly: "error" -- Here's a description about why this configuration is necessary. */

5.1.2 使用配置文件

要在配置文件中配置规则,则使用rules键和一个错误级别以及任何想要使用的选项,比如:

{
    "rules": {
        "eqeqeq": "off",
        "curly": "error",
        "quotes": ["error", "double"]
    }
}

上面只是按照官方文档截取的一些基础配置,更完善的配置可以看:

关于ESLint的其它配置,可以在有需要的时候查看官方文档进行配置,这里只学习最基础的ESLint的使用,不深入研究了,毕竟面试时也没人会问这个吧。。。

6. Vue脚手架中使用

在使用Vue-CLI创建项目时,可以选择配置ESLint,一共有三个相关的配置,如下

// 使用Standard(标准)的配置
Pick a linter / formatter config: Standard
// 在保存文件时进行Lint
Pick additional lint features: Lint on save
// 使用单独的文件存储ESLint的配置
Where do you prefer placing config for Babel, ESLint, etc.:In dedicated config

等项目创建完成,Vue-CLI会自动的帮我们引入和配置ESLint:

image.png

然后可以根据自己的开发习惯或者公司的规范进行配置了。

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

推荐阅读更多精彩内容