一、eslint介绍

ESLint 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于2013年6月创建。代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。对大多数编程语言来说都会有代码检查,一般来说编译程序会内置检查工具。

JavaScript 是一个动态的弱类型语言,在开发中比较容易出错。因为没有编译程序,为了寻找 JavaScript 代码错误通常需要在执行过程中不断调试。像 ESLint 这样的可以让程序员在编码的过程中发现问题而不是在执行的过程中。

ESLint 的初衷是为了让程序员可以创建自己的检测规则。ESLint 的所有规则都被设计成可插拔的。为了便于人们使用,ESLint 内置了一些规则,当然,你可以在使用过程中自定义规则。所有的规则默认都是禁用的。

ESLint 使用 Node.js 编写。

二、eslint配置

配置方式:
一般都采用.eslintrc.* 的配置文件进行配置, 如果放在项目的根目录中,则会作用于整个项目。如果在项目的子目录中也包含着.eslintrc文件,则对于子目录中文件的检查会忽略掉根目录中的配置,而直接采用子目录中的配置,这就能够在不同的目录范围内应用不同的检查规则,显得比较灵活。ESLint采用逐级向上查找的方式查找.eslintrc.*文件,当找到带有 “root”: true 配置项的.eslintrc.* 文件时,将会停止向上查找。

在 package.json文件里的 eslintConfig 字段进行配置。

具体配置规则:

module.exports = {parser: 'babel-eslint', // parser指定解析器,默认的为espree。babel-eslint是一个Babel parser的包装器,这个包装器使得 Babel parser 可以和 ESLint 协调工作parserOptions: {ecmaVersion: 6,sourceType: 'module', // 设置为 "script" (默认) 或 "module"(ES6)。ecmaFeatures: { // 这是个对象,表示你想使用的额外的语言特性:jsx: true // 启用 JSX}},extends: ['eslint:recommended'], // 使用eslint推荐的规则作为基础配置,可以在rules中覆盖plugins: ['html', 'vue', 'prettier', 'import'], // vue是eslint-plugin-vue的简写,此插件的作用是可以让eslint识别.vue中的script代码rules: { // 0或者off表示规则关闭,出错也被忽略;1或者warn表示如果出错会给出警告(不会导致程序退出);2或者error表示如果出错会报出错误(会导致程序退出,退出码是1)'no-console': 'off','prefer-const': 'error','prettier/prettier': 'warn','prefer-arrow-callback': 'warn','no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0},globals: { // 允许在代码中使用全局变量location: true,setTimeout: true}
};

详情:配置eslint

引入规则方式:
1、推荐规则:“extends”引入推荐规则
2、自定义规则以文件形式引入其它的自定义规则,
3、用rules去定义个别规则,可覆盖掉”extends”中引入的规则。

{"extends": ["./node_modules/coding-standard/eslintDefaults.js",// Override eslintDefaults.js"./node_modules/coding-standard/.eslintrc-es6",// Override .eslintrc-es6"./node_modules/coding-standard/.eslintrc-jsx",],"rules": {"eqeqeq": "warn"}
}

4、注释配置规则:代码文件内以注释配置的规则会覆盖配置文件里的规则,即优先级要更高。常用的就是 `eslint-disable-next-line(忽略掉下一行的lint报错)

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

三、忽略检查

1、项目目录下建立.eslintignore文件,并在其中配置忽略掉对哪些文件的检查。需要注意的是,不管你有没有在.eslintignore中进行配置,eslint都会默认忽略掉对/node_modules/** 的检查。
2、在package.json文件的 eslintIgnore 字段进行配置

四、eslint检查原理

大部分编译器工作时的三个阶段

解析:将未经处理的代码解析成更为抽象的表达式,通常为抽象语法树,即 AST。
转换:通过修改解析后的代码表达式,将其转换为符合预期的新格式。
代码生成:将转换后的表达式生成为新的目标代码。

对于eslint来说,规则校验发生在将JavaScript 代码解析为 AST 之后,遍历 AST 的过程中。eslint采用 Espree 来生成AST。
code path
指的是程序的执行路径。程序可以由若干 code path 表达,一个 code path 可能包括两种类型的对象 CodePath 和CodePathSegment。
ESLint的规则可以使用代码路径。代码路径是程序的执行路径。

if (a && b) {foo();
}
bar();

如果 a 为真 - 检测 b 是否为 真
如果 b 为真 — 执行 foo() — 执行 bar()
如果 b 非真 — 执行 bar()
如果 a 非真,执行 bar()

转换为 AST 的表达方式

ESLint 将 code path 抽象为 5 个事件。

  • onCodePathStart:
  • onCodePathEnd
  • onCodePathSegmentStart
  • onCodePathSegmentEnd
  • onCodePathSegmentLoop

可参考源码 code-path-analyzer.js,官方文档中 Code Path Analysis Details 中对 JS 中的 code path 也有很详细的描述,可以参考。

rules工作原理
eslint中的rules源码存在于lib/rules下。
每一个rules都是一个node模块,用module.exports导出一个meta对象及一个create函数。

module.exports = {meta: {type: "suggestion",docs: {description: "disallow unnecessary semicolons",category: "Possible Errors",recommended: true,url: "https://eslint.org/docs/rules/no-extra-semi"},fixable: "code",schema: [] // no options},create: function(context) {return {// callback functions};}
};

meta 代表了这条规则的元数据,如这条规则的类别,文档,可接收的参数 schema 等等。
create 返回一个对象,其中定义了一些在 AST 遍历访问到对应节点需要执行的方法等等。函数接受一个context对象作为参数,里面包含了例如可以报告错误或者警告的context.report()、可以获取源代码的context.getSourceCode()等方法,可以简化规则的编写。详情:使用规则

五、如何自定义rules

栗子?:禁止块级注释,当代码中使用了块级注释,eslint将报错。

// lib/rules/no-block-comments.js
module.exports = {meta: {docs: {description: '禁止块级注释',category: 'Stylistic Issues',recommended: true}},create (context) {// 获取源代码const sourceCode = context.getSourceCode()return {Program () {// 获取源代码中所有的注释const comments = sourceCode.getAllComments()const blockComments = comments.filter(({ type }) => type === 'Block')blockComments.length && context.report({node: node,message: 'No block comments'})}}}
}

如何使用自定义的rules
编写好的rules需要发布到npm上,作为一个eslint-plugin,在项目中下载下来才能够使用

no-block-comments.js

module.exports = {"extends": ["../../eslintrc.vue.js"],"plugins": ["no-block-comments"// 可省略eslint-plugin],"rules": {"no-block-comments/no-block-comments": 1  引用no-block-comments插件中的no-block-comments规则}
};

main.js

/*** @author Renlingling* @date 2019-08-26* @Description:*/import Vue from 'vue'
import App from './App'
import router from './router'Vue.config.productionTip = falsenew Vue({el: '#app',router,components: {App},template: '<App/>',
})

结果:

/Users/renlingling/eslint-config-sgfe/tests/my-project/src/main.js3:1  warning  No block comments  no-block-comments/no-block-comments

eslint自定义配置相关推荐

  1. vscode中vue-cli项目es-lint的配置

    前言 由于公司保密政策,无法通过任何聊天工具将每天get到的新技能带回家,希望就此养成写文章的好习惯,塞翁失马,焉知非福? 本文主要介绍vscode中 vue项目es-lint的配置,有任何错误的地方 ...

  2. vue自定义配置运行run命令

    vue自定义配置运行run命令 1.vuecli3以下 package.json build/build.js webpack.prod.conf.js build/utils.js build/we ...

  3. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  4. app.config自定义配置节点

    本来一直用xml保存配置文件的,但有一个组件就写一个好麻烦.于是想起了自定义配置节点哈哈~~我撒娇了复习了下 首先我在ConfigManager.Instance使用单例模式,其次Reflection ...

  5. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色自定义配置)实战

    R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色自定义配置)实战 目录 R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框 ...

  6. R语言ggplot2可视化、在可视化区域中自定义添加多个大小不同矩形阴影区域、自定义配置大小不同矩形阴影区域的颜色(Adding multiple shadows/rectangles)

    R语言ggplot2可视化.在可视化区域中自定义添加多个大小不同矩形阴影区域.自定义配置大小不同矩形阴影区域的颜色(Adding multiple shadows/rectangles) 目录

  7. R语言ggplot2可视化基本散点图(设置X轴使用对数坐标)、并把成对的数据点用线条(line)连接起来、自定义配置线条颜色(Connecting Paired Points with lines)

    R语言ggplot2可视化基本散点图(设置X轴使用对数坐标).并把成对的数据点用线条(line)连接起来.自定义配置线条颜色(Customizing Scatterplot Connecting Pa ...

  8. R语言ggplot2可视化并自定义配置图例的位置到可视化图像的顶部、配置折叠成两行显示图例、并添加图像形状的子图(ggplot2 legend in two rows with guides fill

    R语言ggplot2可视化并自定义配置图例的位置到可视化图像的顶部(legend position in top).并且配置折叠成两行显示图例.并添加图像形状的子图(ggplot2 legend in ...

  9. Spring Security 进阶干货:自定义配置类入口WebSecurityConfigurerAdapter

    1. 前言 今天我们要进一步的的学习如何自定义配置 Spring Security 我们已经多次提到了 WebSecurityConfigurerAdapter ,而且我们知道 Spring Boot ...

最新文章

  1. 自己动手实现20G中文预训练语言模型示例
  2. 在C#里怎样获得当前Windows操作系统的语言种类?以及如何知道当前Windows版本?...
  3. 八城联动丨神策 2020 数据驱动用户大会「武汉站」即将重磅开幕!
  4. 如何给网红变现?Instagram正在尝试一种全新的方式
  5. 规则引擎Easy-rules
  6. C++ Primer 5 CH4 表达式
  7. 【算法分析与设计】埃氏筛素数算法
  8. 第二代计算机网络主要贡献,2010级计算机网络试题
  9. 【转载】C/C++预处理指令
  10. Swift之动画总结
  11. 24.Plugin System
  12. 对‘pthread_create’未定义的引用_2018年度‘龙虎榜’统计分析(一)
  13. 正确的java学习顺序--刚入门的同学可以看这里
  14. Real-Time Rendering 4th Edition 实时渲染第四版 读书及翻译计划
  15. 【FPGA】Vivado综合停滞、死机(PID Not Specified)解决方法
  16. COSCon'20 Apache Roadshow- China 精彩收官!|会场精彩回顾篇
  17. mysql快速建表工具_我所知道的MYSQL快速建表的3种方法
  18. 用Jupyter-Notebook爬取网页数据实例4
  19. 手机端的多图片剪辑上传支持手势支持预览
  20. 图数据库初探相关——1.Simulating Mobile Money Fraud pt.1(模拟移动支付诈骗)翻译

热门文章

  1. win10远程桌面设置计算机,win10开启远程桌面的两种方法
  2. 参考文献处理有bibtex转换到biber过程中出现的问题
  3. 快手市值排互联网前五!推荐一个Java大数据公众号
  4. 想变道的网易有道,能用词典笔摆脱宿命吗?
  5. iPhone手机装机必备的5个APP,每个都让你欲罢不能,瞬间逼格满满!
  6. 突然断电或强制关机的不良后果
  7. vectorvn1610报价_意大利Vector 通讯模块
  8. 活动?创作两周年纪念日,浅记经验感想
  9. python爬去朋友圈_爬取朋友圈的内容
  10. 内网穿透netapp