js代码规范之Eslint安装与配置详解


Posted in Javascript onSeptember 08, 2018

什么是 ESLint

ESLint(中文站点)是一个开源的 JavaScript 代码检查工具,使用 Node.js 编写,由 Nicholas C. Zakas 于 2013 年 6 月创建。ESLint 的初衷是为了让程序员可以创建自己的检测规则,使其可以在编码的过程中发现问题而不是在执行的过程中。ESLint 的所有规则都被设计成可插入的,为了方便使用,ESLint 内置了一些规则,在这基础上也可以增加自定义规则。

一、Eslint安装

1.全局安装

如果你想使 ESLint 适用于你所有的项目,建议全局安装 ESLint

$ npm install -g eslint

初始化配置文件

$ eslint --init

2.局部安装

$ npm install eslint --save-dev

初始化配置文件

$ ./node_modules/.bin/eslint --init

3.webpack中配置eslint

需要安装eslint-loader解析.eslint文件

{
    test: /\.(js|jsx|mjs)$/,
    enforce: 'pre',
    use: [
     {
      options: {
       formatter: eslintFormatter,
       eslintPath: require.resolve('eslint'),
       
      },
      loader: require.resolve('eslint-loader'),
     },
    ],
    include: paths.appSrc, //也可以用exclude排除不需要检查的目录或者用.eslintignore
},

二、ESlint配置

1.配置文件类型与优先级顺序

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

2.plugin属性

ESLint 支持使用第三方插件(以eslint-plugin-开头的npm包),在使用插件之前,必须使用 npm 安装。如eslint-plugin-react、eslint-plugin-vue等

module.exports = {
  "plugins": [
    "react"
  ],
  "extends": [
    "eslint:recommended"
  ],
  "rules": {
    "no-set-state": "off"
  }
}

3.extends属性

一个配置文件可以被基础配置中的已启用的规则继承。可以使用以下规则继承:

(1)"eslint:recommended"

继承Eslint中推荐的(打钩的)规则项

module.exports = {
  "extends": "eslint:recommended",
  "rules": {
    
  }
}

(2)使用别人写好的规则包(以eslint-config-开头的npm包),如eslint-config-standard

module.exports = {
  "extends": "standard",
  "rules": {
    
  }
}

(3)使用Eslint插件中命名的配置

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

(4)使用"eslint:all",继承Eslint中所有的核心规则项

module.exports = {
  "extends": "eslint:all",
  "rules": {
    // override default options
    "comma-dangle": ["error", "always"],
    "indent": ["error", 2],
    "no-cond-assign": ["error", "always"],

    // disable now, but enable in the future
    "one-var": "off", // ["error", "never"]

    // disable
    "init-declarations": "off",
    "no-console": "off",
    "no-inline-comments": "off",
  }
}

4.rules属性(根据自己的需要进行配置)

(1)Eslint部分核心规则

"rules": {
    /**
    **这些规则与 JavaScript 代码中可能的错误或逻辑错误有关
    **/
    "for-direction":"error",//强制 “for” 循环中更新子句的计数器朝着正确的方向移动
    "getter-return":"error",//强制在 getter 属性中出现一个 return 语句
    "no-await-in-loop":"error",//禁止在循环中 出现 await
    "no-compare-neg-zer":"error",//禁止与 -0 进行比较
    "no-cond-assign":[//禁止在条件语句中出现赋值操作符
      "error",
      "always"
    ],
    "no-console":[//禁用 console
      "error"
//      { "allow": ["warn", "error"] }
    ],
    "no-constant-condition":"error",//禁止在条件中使用常量表达式
    "no-control-regex":"error",//禁止在正则表达式中使用控制字符
    "no-debugger":"error",//禁用 debugger
    "no-dupe-args":"error",//禁止在 function 定义中出现重复的参数
    "no-dupe-keys":"error",//禁止在对象字面量中出现重复的键
    "no-duplicate-case":"error",//禁止重复 case 标签
    "no-empty":"error",//禁止空块语句
    "no-empty-character-class":"error",//禁止在正则表达式中出现空字符集
    "no-ex-assign":"error",//禁止对 catch 子句中的异常重新赋值
    "no-extra-boolean-cast":"error",//禁止不必要的布尔类型转换
    "no-extra-parens":"error",//禁止冗余的括号
    "no-extra-semi":"error",//禁用不必要的分号
    "no-func-assign":"error",//禁止对 function 声明重新赋值
    "no-inner-declarations":"error",//禁止在嵌套的语句块中出现变量或 function 声明
    "no-invalid-regexp":"error",//禁止在 RegExp 构造函数中出现无效的正则表达式
    "no-irregular-whitespace":"error",//禁止不规则的空白
    "no-obj-calls":"error",//禁止将全局对象当作函数进行调用
    "no-prototype-builtins":"error",//禁止直接使用 Object.prototypes 的内置属性
    "no-regex-spaces":"error",//禁止正则表达式字面量中出现多个空格
    "no-sparse-arrays": "error",//禁用稀疏数组
    "no-template-curly-in-string":"error",//禁止在常规字符串中出现模板字面量占位符语法
    "no-unexpected-multiline":"error",//禁止使用令人困惑的多行表达式
    "no-unreachable":"error",//禁止在 return、throw、continue 和 break 语句后出现不可达代码
    "no-unsafe-finally":"error",//禁止在 finally 语句块中出现控制流语句
    "no-unsafe-negation":"error",//禁止对关系运算符的左操作数使用否定操作符
    "use-isnan":"error",//要求调用 isNaN()检查 NaN
    "valid-jsdoc":"error",//强制使用有效的 JSDoc 注释
    "valid-typeof":"error",//强制 typeof 表达式与有效的字符串进行比较
    /**
    **最佳实践
    **/
    "accessor-pairs":"error",//强制getter/setter成对出现在对象中
    "array-callback-return":"error",//强制数组方法的回调函数中有 return 语句
    "block-scoped-var":"error",//把 var 语句看作是在块级作用域范围之内
    "class-methods-use-this":"error",//强制类方法使用 this
    "complexity":"error"//限制圈复杂度
    .....
  }

(2)eslint-plugin-vue中的规则

'rules': {

    /* for vue */

    // 禁止重复的二级键名

    // @off 没必要限制

    'vue/no-dupe-keys': 'off',

    // 禁止出现语法错误

    'vue/no-parsing-error': 'error',

    // 禁止覆盖保留字

    'vue/no-reservered-keys': 'error',

    // 组件的 data 属性的值必须是一个函数

    // @off 没必要限制

    'vue/no-shared-component-data': 'off',

    // 禁止 <template> 使用 key 属性

    // @off 太严格了

    'vue/no-template-key': 'off',

    // render 函数必须有返回值

    'vue/require-render-return': 'error',

    // prop 的默认值必须匹配它的类型

    // @off 太严格了

    'vue/require-valid-default-prop': 'off',

    // 计算属性必须有返回值

    'vue/return-in-computed-property': 'error',

    // template 的根节点必须合法

    'vue/valid-template-root': 'error',

    // v-bind 指令必须合法

    'vue/valid-v-bind': 'error',

    // v-cloak 指令必须合法

    'vue/valid-v-cloak': 'error',

    // v-else-if 指令必须合法

    'vue/valid-v-else-if': 'error',

    // v-else 指令必须合法

    'vue/valid-v-else': 'error',

    // v-for 指令必须合法

    'vue/valid-v-for': 'error',

    // v-html 指令必须合法

    'vue/valid-v-html': 'error',

    // v-if 指令必须合法

    'vue/valid-v-if': 'error',

    // v-model 指令必须合法

    'vue/valid-v-model': 'error',

    // v-on 指令必须合法

    'vue/valid-v-on': 'error',

    // v-once 指令必须合法

    'vue/valid-v-once': 'error',

    // v-pre 指令必须合法

    'vue/valid-v-pre': 'error',

    // v-show 指令必须合法

    'vue/valid-v-show': 'error',

    // v-text 指令必须合法

    'vue/valid-v-text': 'error',
    
    //
    // 最佳实践
    //
    // @fixable html 的结束标签必须符合规定
    // @off 有的标签不必严格符合规定,如 <br> 或 <br/> 都应该是合法的

    'vue/html-end-tags': 'off',

    // 计算属性禁止包含异步方法

    'vue/no-async-in-computed-properties': 'error',

    // 禁止出现难以理解的 v-if 和 v-for

    'vue/no-confusing-v-for-v-if': 'error',

    // 禁止出现重复的属性

    'vue/no-duplicate-attributes': 'error',

    // 禁止在计算属性中对属性修改

    // @off 太严格了

    'vue/no-side-effects-in-computed-properties': 'off',

    // 禁止在 <textarea> 中出现 {{message}}

    'vue/no-textarea-mustache': 'error',

    // 组件的属性必须为一定的顺序

    'vue/order-in-components': 'error',

    // <component> 必须有 v-bind:is

    'vue/require-component-is': 'error',

    // prop 必须有类型限制

    // @off 没必要限制

    'vue/require-prop-types': 'off',

    // v-for 指令的元素必须有 v-bind:key

    'vue/require-v-for-key': 'error',
    
    //
    // 风格问题
    //
    // @fixable 限制自定义组件的属性风格
    // @off 没必要限制

    'vue/attribute-hyphenation': 'off',

    // html 属性值必须用双引号括起来

    'vue/html-quotes': 'error',

    // @fixable 没有内容时,组件必须自闭和

    // @off 没必要限制

    'vue/html-self-closing': 'off',

    // 限制每行允许的最多属性数量

    // @off 没必要限制

    'vue/max-attributes-per-line': 'off',

    // @fixable 限制组件的 name 属性的值的风格

    // @off 没必要限制

    'vue/name-property-casing': 'off',

    // @fixable 禁止出现连续空格

    // TODO: 李德广  触发 新版本 typeerror:get 'range' of undefined

    // 'vue/no-multi-spaces': 'error',

    // @fixable 限制 v-bind 的风格

    // @off 没必要限制

    'vue/v-bind-style': 'off',

    // @fixable 限制 v-on 的风格

    // @off 没必要限制

    'vue/v-on-style': 'off',

    // 定义了的 jsx element 必须使用

    'vue/jsx-uses-vars': 'error'

  }

(3)eslint-plugin-react中的规则

/**
    **react规则
    **/
    "react/boolean-prop-naming": ["error", { "rule": "^is[A-Z]([A-Za-z0-9]?)+" }],//bool类型的props强制固定命名
    "react/button-has-type": ["error", {"reset": false}],//强制按钮的type属性必须是"button","submit","reset"三者之一
    "react/default-props-match-prop-types": [2, { "allowRequiredDefaults": false }],//强制所有defaultProps有对应的non-required PropType
    "react/destructuring-assignment": [1, "always"],//强制将props,state,context解构赋值
    "react/display-name": [1, { "ignoreTranspilerName": false }],//react组件中强制定义displayName
    "react/forbid-component-props": [1],//禁止在自定义组件中使用(className, style)属性
    "react/forbid-dom-props": [1, { "forbid": ["style"] }],//禁止在dom元素上使用禁止的属性
    "react/forbid-elements": [1, { "forbid": ["button"] }],//禁止某些元素用于其他元素
    "react/forbid-prop-types": [1],//禁止某些propTypes属性类型
    "react/no-access-state-in-setstate":"error",//禁止在setState中使用this.state
    "react/no-children-prop":[1],//不要把Children当做属性
    "react/no-string-refs":[1],//不要使用string类型的ref
    "react/no-unused-state":[1],//不要在state中定义未使用的变量
    //.....
    "react/jsx-no-undef": [1, { "allowGlobals": false }],//不允许使用未声明的变量
    "react/jsx-key":[1]//遍历使用key

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery技巧总结
Jan 01 Javascript
JavaScript基础知识及常用方法总结
Jan 10 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
Aug 25 Javascript
jQuery选择器之表单元素选择器详解
Sep 19 jQuery
浅谈vue-cli加载不到dev-server.js的解决办法
Nov 24 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
Jul 18 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
Jul 30 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
Aug 20 Javascript
Node.js API详解之 console模块用法详解
May 12 Javascript
vue弹窗插件实战代码
Sep 08 #Javascript
浅谈从React渲染流程分析Diff算法
Sep 08 #Javascript
详解Webpack-dev-server的proxy用法
Sep 08 #Javascript
详解Ubuntu安装angular-cli遇到的坑
Sep 08 #Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 #Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 #Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 #jQuery
You might like
php 数组二分法查找函数代码
2010/02/16 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
js常用自定义公共函数汇总
2014/01/15 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
python实现简易淘宝购物
2019/11/22 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS