白话 Linters (EsLint)

为啥会出现ESLint TSLint stylelint 之类的 Linters 工具
当你的业务代码里出现了越来越多的if elseif elseif elseif,多到条件都是ctrl+c ctrl+v为起手技,因为历史原因又不方便重构;无意之间你的代码变成了如下形式:

1  if(a==b||a==c){
2  }else if(a==c&&c!=''){
3  }else if(c==e||c=b){
4  }else if(c==e&&c!=b){
5  }else if(...){
   }

在这简化的代码逻辑中,你可能一眼就看出了问题;也可能睁大眼睛1分钟了,长叹没毛病啊~
答案当然是有问题,在第3行的逻辑判断

//就是这里的 c=b,你的历史记忆中此处应该是c==b的判断,而不是c=b的赋值
}else if(c==e||c=b){

不知道你有没有类似的遭遇,我反正是遇到过几次,揪出问题前,怎么都想不通,直到发现问题,哎呀我去~
并且解决此类问题并没有成就感,还惹得一身不够细心
此时如果恰好有 ESLint 之类的语法校验工具,并且合理的配置了。在控制台中,将会输出问题,告知你要小心了,这里有坑啊

eslint 提示错误

但是很多初入Linters的伙伴满心欢喜的安装,上手不一会后,就放弃了。为啥~

A:啊呀,怎么报错了,满屏都是红的
B:我这也是,刚刚还好好的,现在就加了个 console.log就红了
A:算了算了,还是格式化下就好了,这个太麻烦了

这段OS(Overlapping Sound),曾出现我内心,也出现在我同事之间。
要解决这个问题,重点在于要合理的配置所用 Linters 的规则,因为很多默认的 Linters 规则,阻碍了你已养成的编码习惯,让你很不舒服;索性你就不用了。
好嘞~ 故事讲完,如果你想让 Linters 发现你或伙伴无意间留下的坑,又不想让 Linters 阻碍你编码的惯性,那么接下来再走一遍实际操作,也许会让你重拾 Linters
那么以 在vscode 启用 ESLint 为例

前置环境条件

ESLint 可以全局安装,也可以在你项目的目录单独安装;vscode里eslint插件是先在项目的目录里找eslint包,如果未找到,则在全局环境里查找eslint包

vscode中配置eslint插件参数

"eslint.run": "onSave",//eslint在保存时执行
"eslint.alwaysShowStatus": true,//在状态栏显示 eslint状态
"editor.codeActionsOnSave": {
  "eslint.run": "onSave",//在保存时自动运行eslint,检查代码;也可以选择 onType 一旦内容有变化就会运行eslint
   "source.fixAll.eslint": true// eslint 自动修复可修复的规则
},

在现有的项目,或新建项目中配置 eslint配置文件,例如我这里是用js形式配置的eslint配置文件 .eslintrc.js

//样例配置
module.exports = {
    "env": {
        "browser": true,
        "es6": true
    },
    "extends": "eslint:recommended",
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "ecmaVersion": 11
    },
    "rules": {
    }
};

至此,eslint就算用起来了,让我们来看一看效果


eslint 简单应用效果

接下来,就是配置,之所以用的不习惯就是没配置到位,在配置前,你需要整明白能配置什么。
其实官方文档里写的很详细,但没有中文文档,只关注效率的我们往往沉不下心,若不能在较短的时间内解决,便半途而废了。

.eslintrc.js 配置举例

module.exports = {
    /**
     * 指定js(运行|版本)所处环境,以便提供所指定(环境|版本)默认的变量
     * 官网详细说明 https://eslint.org/docs/user-guide/configuring#specifying-environments
     */
    "env": {
        "browser": true,//如为 false 或不配置, 在js文件中出现 window, document 等 游览器API 全局变量时,会提示 'is not defined' 警告
        "node":true,//如为 false 或不配置, 在js文件中出现 require, exports等 NODE API 全局变量时,会提示 'is not defined' 警告
        "es6": false,//如为 false 或不配置, 在js文件中出现 Promise 等es6版本新增的对象或方法时,提示错误警告
    },
    /**
     * eslint 规则继承自何处
     * 即如果未配置rules(自定义)规则,也未指定 extends(继承)规则,eslint便没有规则进行校验
     * 相当于,你买了部手机,但手机没有电,啥事也干不了
     * 官网详细说明 https://eslint.org/docs/user-guide/configuring#extending-configuration-files
     */
    "extends": "eslint:recommended",
    /**
     * 设置自定义全局变量,避免自定义全局变量出现 no-undef 警告
     * 有时候我们引入了第三方包(插件),或我们自己写的一个全局方法;其提供了一个全局变量供我们使用,例如 axios (一个请求类库)
     * eslint 会校验 变量必须声明才能使用,但是第三方库,或我们自己的全局方法,不会在每个js文件中声明引入,这个时候便会出现 no-undef 警告
     * 因此,将其在 globals中配置即可
     * 官网详细说明 https://eslint.org/docs/user-guide/configuring#specifying-globals
     * 注意:
     * false | "readable" 等同于 "readonly"  不能重新定义(赋值)
     * true | "writeable" 等同于 "writable" 可重新定义(赋值)
     */
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly",
        "requirejs":false,
        "Mock":false,
        "axios":false,
    },
    /**
     * 指定 js 语法版本,例如
     * "ecmaVersion": 5, 表明 启用es5语法进行校验,此时用 => 箭头函数会提示语法错误,因为箭头函数在es6中才能支持
     * 使用 3, 5 (默认), 6, 7, 8, 9, 10, 11 设置你预期的js语法版本
     * 也可以根据js版本的年份设置,例如
     * 2015(同 6)  2016(同 7)  2017(同 8)  2018(同 9)  2019(同 10)  2020(同 11) 
     * 官网详细说明 https://eslint.org/docs/user-guide/configuring#specifying-parser-options
     */  
    "parserOptions": {
        "ecmaVersion": 5
    },
    /**
     * 自定义 eslint 校验规则
     * off 或 0  关闭校验
     * warn 或 1 提示警告
     * error 或 2 提示错误
     * 官网详细说明 https://eslint.org/docs/user-guide/configuring#configuring-rules
     * 可配置校验规则 https://eslint.org/docs/rules/
     */
    "rules": {
        "quotes": [
            "error", //必须使用双引号
            "double"
        ],
        "semi": [
            "error",// 未分号结尾 提示错误
            "always"
        ],
        "no-console": 1, // console 提示 警告
    }
};

如上配置,eslint会在

  • 出现箭头函数 提示错误 因为 parserOptions 配置的 ecmaVersion 版本为 5
  • 出现Promise 等es6新增内置对象提示错误 因为 env 配置的 es6 为false 或未配置
  • 使用 console.log 提示警告 因为 自定义规则里 no-console 配置为 1 即提示警告

根据上面的标注的规则,调整适合自身的规则即可。至此eslint已经协助我们完成语法校验规则了,并且 eslint 在一定程度上还能自动修复问题(主要是修复 空格 之类的 ^ _ ^)
例如在上面的 vscode 配置文件中,我们设置了自动修复,则在保存后,如果出现多余的空格等,会自动修复

"editor.codeActionsOnSave": {
  "eslint.run": "onSave",//在保存时自动运行eslint,检查代码;也可以选择 onType 一旦内容有变化就会运行eslint
   "source.fixAll.eslint": true// eslint 自动修复可修复的规则
},

好了~ 至此,便如用担心手抖造成的误伤了,接下来要做的就是格式化代码;回顾下前端可能会接触到的语言即框架

稳住~ 虽然多,但是Prettier来了,通吃前端多语言的一种方案

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