关于 ESLint
介绍,以及在项目中如何配置,请参考WebStorm + React 项目,配置 ESLint。
配置文件
ESLint
支持几种格式的配置文件,如果同一个目录下有多个配置文件,ESLint
只会使用一个。优先级顺序如下:
JavaScript
- 使用.eslintrc.js
然后输出一个配置对象。YAML
- 使用.eslintrc.yaml
或.eslintrc.yml
去定义配置的结构。JSON
-使用.eslintrc.json
去定义配置的结构,ESLint
的JSON
文件允许JavaScript
风格的注释。Deprecated
-使用.eslintrc
,可以使 JSON 也可以是 YAML。package.json
- 在package.json
里创建一个eslintConfig
属性,在那里定义你的配置。配置规则格式
规则格式是<规则名称>: <告警级别>
,告警级别分为三种:
-
/**
* AlloyTeam ESLint 规则 - React
*
* 包含所有 ESLint 规则,以及所有 eslint-plugin-react 规则
* 使用 babel-eslint 作为解析器
*
* @fixable 表示此配置支持 --fix
* @off 表示此配置被关闭了,并且后面说明了关闭的原因
*/
module.exports = {
extends: [
'./index.js',
],
plugins: [
'react'
],
rules: {
// 布尔值类型的 propTypes 的 name 必须为 is 或 has 开头
// @off 不强制要求写 propTypes
'react/boolean-prop-naming': 'off',
// 一个 defaultProps 必须有对应的 propTypes
// @off 不强制要求写 propTypes
'react/default-props-match-prop-types': 'off',
// 组件必须有 displayName 属性
// @off 不强制要求写 displayName
'react/display-name': 'off',
// 禁止在自定义组件中使用一些指定的 props
// @off 没必要限制
'react/forbid-component-props': 'off',
// 禁止使用一些指定的 elements
// @off 没必要限制
'react/forbid-elements': 'off',
// 禁止使用一些指定的 propTypes
// @off 不强制要求写 propTypes
'react/forbid-prop-types': 'off',
// 禁止直接使用别的组建的 propTypes
// @off 不强制要求写 propTypes
'react/forbid-foreign-prop-types': 'off',
// 禁止使用数组的 index 作为 key
// @off 太严格了
'react/no-array-index-key': 'off',
// 禁止使用 children 做 props
'react/no-children-prop': 'error',
// 禁止使用 dangerouslySetInnerHTML
// @off 没必要限制
'react/no-danger': 'off',
// 禁止在使用了 dangerouslySetInnerHTML 的组建内添加 children
'react/no-danger-with-children': 'error',
// 禁止使用已废弃的 api
'react/no-deprecated': 'error',
// 禁止在 componentDidMount 里面使用 setState
// @off 同构应用需要在 didMount 里写 setState
'react/no-did-mount-set-state': 'off',
// 禁止在 componentDidUpdate 里面使用 setState
'react/no-did-update-set-state': 'error',
// 禁止直接修改 this.state
'react/no-direct-mutation-state': 'error',
// 禁止使用 findDOMNode
'react/no-find-dom-node': 'error',
// 禁止使用 isMounted
'react/no-is-mounted': 'error',
// 禁止在一个文件创建两个组件
// @off 有一个 bug https://github.com/yannickcr/eslint-plugin-react/issues/1181
'react/no-multi-comp': 'off',
// 禁止在 PureComponent 中使用 shouldComponentUpdate
'react/no-redundant-should-component-update': 'error',
// 禁止使用 ReactDOM.render 的返回值
'react/no-render-return-value': 'error',
// 禁止使用 setState
// @off setState 很常用
'react/no-set-state': 'off',
// 禁止拼写错误
'react/no-typos': 'error',
// 禁止使用字符串 ref
'react/no-string-refs': 'error',
// 禁止在组件的内部存在未转义的 >, ", ' 或 }
'react/no-unescaped-entities': 'error',
// @fixable 禁止出现 HTML 中的属性,如 class
'react/no-unknown-property': 'error',
// 禁止出现未使用的 propTypes
// @off 不强制要求写 propTypes
'react/no-unused-prop-types': 'off',
// 定义过的 state 必须使用
// @off 没有官方文档,并且存在很多 bug: https://github.com/yannickcr/eslint-plugin-react/search?q=no-unused-state&type=Issues&utf8=%E2%9C%93
'react/no-unused-state': 'off',
// 禁止在 componentWillUpdate 中使用 setState
'react/no-will-update-set-state': 'error',
// 必须使用 Class 的形式创建组件
'react/prefer-es6-class': [
'error',
'always'
],
// 必须使用 pure function
// @off 没必要限制
'react/prefer-stateless-function': 'off',
// 组件必须写 propTypes
// @off 不强制要求写 propTypes
'react/prop-types': 'off',
// 出现 jsx 的地方必须 import React
// @off 已经在 no-undef 中限制了
'react/react-in-jsx-scope': 'off',
// 非 required 的 prop 必须有 defaultProps
// @off 不强制要求写 propTypes
'react/require-default-props': 'off',
// 组件必须有 shouldComponentUpdate
// @off 没必要限制
'react/require-optimization': 'off',
// render 方法中必须有返回值
'react/require-render-return': 'error',
// @fixable 组件内没有 children 时,必须使用自闭和写法
// @off 没必要限制
'react/self-closing-comp': 'off',
// @fixable 组件内方法必须按照一定规则排序
'react/sort-comp': 'error',
// propTypes 的熟悉必须按照字母排序
// @off 没必要限制
'react/sort-prop-types': 'off',
// style 属性的取值必须是 object
'react/style-prop-object': 'error',
// HTML 中的自闭和标签禁止有 children
'react/void-dom-elements-no-children': 'error',
// @fixable 布尔值的属性必须显式的写 someprop={true}
// @off 没必要限制
'react/jsx-boolean-value': 'off',
// @fixable 自闭和标签的反尖括号必须与尖括号的那一行对齐
'react/jsx-closing-bracket-location': [
'error',
{
nonEmpty: false,
selfClosing: 'line-aligned'
}
],
// @fixable 结束标签必须与开始标签的那一行对齐
// @off 已经在 jsx-indent 中限制了
'react/jsx-closing-tag-location': 'off',
// @fixable 大括号内前后禁止有空格
'react/jsx-curly-spacing': [
'error',
{
when: 'never',
attributes: {
allowMultiline: true
},
children: true,
spacing: {
objectLiterals: 'never'
}
}
],
// @fixable props 与 value 之间的等号前后禁止有空格
'react/jsx-equals-spacing': [
'error',
'never'
],
// 限制文件后缀
// @off 没必要限制
'react/jsx-filename-extension': 'off',
// @fixable 第一个 prop 必须得换行
// @off 没必要限制
'react/jsx-first-prop-new-line': 'off',
// handler 的名称必须是 onXXX 或 handleXXX
// @off 没必要限制
'react/jsx-handler-names': 'off',
// @fixable jsx 的 children 缩进必须为四个空格
'react/jsx-indent': [
'error',
4
],
// @fixable jsx 的 props 缩进必须为四个空格
'react/jsx-indent-props': [
'error',
4
],
// 数组中的 jsx 必须有 key
'react/jsx-key': 'error',
// @fixable 限制每行的 props 数量
// @off 没必要限制
'react/jsx-max-props-per-line': 'off',
// jsx 中禁止使用 bind
// @off 太严格了
'react/jsx-no-bind': 'off',
// 禁止在 jsx 中使用像注释的字符串
'react/jsx-no-comment-textnodes': 'error',
// 禁止出现重复的 props
'react/jsx-no-duplicate-props': 'error',
// 禁止在 jsx 中出现字符串
// @off 没必要限制
'react/jsx-no-literals': 'off',
// 禁止使用 target="_blank"
// @off 没必要限制
'react/jsx-no-target-blank': 'off',
// 禁止使用未定义的 jsx elemet
'react/jsx-no-undef': 'error',
// 禁止使用 pascal 写法的 jsx,比如 <TEST_COMPONENT>
'react/jsx-pascal-case': 'error',
// @fixable props 必须排好序
// @off 没必要限制
'react/jsx-sort-props': 'off',
// @fixable jsx 的开始和闭合处禁止有空格
'react/jsx-tag-spacing': [
'error',
{
closingSlash: 'never',
beforeSelfClosing: 'always',
afterOpening: 'never'
}
],
// jsx 文件必须 import React
'react/jsx-uses-react': 'error',
// 定义了的 jsx element 必须使用
'react/jsx-uses-vars': 'error',
// @fixable 多行的 jsx 必须有括号包起来
// @off 没必要限制
'react/jsx-wrap-multilines': 'off'
}
};
-
/**
* AlloyTeam ESLint 规则
*
* 包含所有 ESLint 规则
* 使用 babel-eslint 作为解析器
*
* @fixable 表示此配置支持 --fix
* @off 表示此配置被关闭了,并且后面说明了关闭的原因
*/
module.exports = {
parser: 'babel-eslint',
parserOptions: {
ecmaVersion: 2017,
sourceType: 'module',
ecmaFeatures: {
// @TODO Deprecated https://eslint.org/docs/user-guide/configuring#deprecated
experimentalObjectRestSpread: true,
jsx: true,
modules: true
}
},
env: {
browser: true,
node: true,
commonjs: true,
es6: true
},
// 以当前目录为根目录,不再向上查找 .eslintrc.js
root: true,
rules: {
//
//
// 可能的错误
// 这些规则与 JavaScript 代码中可能的语法错误或逻辑错误有关
//
// 禁止 for 循环出现方向错误的循环,比如 for (i = 0; i < 10; i--)
'for-direction': 'error',
// getter 必须有返回值,并且禁止返回空,比如 return;
'getter-return': [
'error',
{
allowImplicit: false
}
],
// 禁止将 await 写在循环里,因为这样就无法同时发送多个异步请求了
// @off 要求太严格了,有时需要在循环中写 await
'no-await-in-loop': 'off',
// 禁止与负零进行比较
'no-compare-neg-zero': 'error',
// 禁止在测试表达式中使用赋值语句,除非这个赋值语句被括号包起来了
'no-cond-assign': [
'error',
'except-parens'
],
// 禁止使用 console
// @off console 的使用很常见
'no-console': 'off',
// 禁止将常量作为分支条件判断中的测试表达式,但允许作为循环条件判断中的测试表达式
'no-constant-condition': [
'error',
{
checkLoops: false
}
],
// 禁止在正则表达式中出现 Ctrl 键的 ASCII 表示,即禁止使用 /\x1f/
// @off 几乎不会遇到这种场景
'no-control-regex': 'off',
// @fixable 禁止使用 debugger
'no-debugger': 'error',
// 禁止在函数参数中出现重复名称的参数
'no-dupe-args': 'error',
// 禁止在对象字面量中出现重复名称的键名
'no-dupe-keys': 'error',
// 禁止在 switch 语句中出现重复测试表达式的 case
'no-duplicate-case': 'error',
// 禁止出现空代码块,允许 catch 为空代码块
'no-empty': [
'error',
{
allowEmptyCatch: true
}
],
// 禁止在正则表达式中使用空的字符集 []
'no-empty-character-class': 'error',
// 禁止将 catch 的第一个参数 error 重新赋值
'no-ex-assign': 'error',
// @fixable 禁止不必要的布尔类型转换,比如 !! 或 Boolean
'no-extra-boolean-cast': 'error',
// @fixable 禁止函数表达式中出现多余的括号,比如 let foo = (function () { return 1 })
'no-extra-parens': [
'error',
'functions'
],
// @fixable 禁止出现多余的分号
'no-extra-semi': 'error',
// 禁止将一个函数声明重新赋值,如:
// function foo() {}
// foo = bar
'no-func-assign': 'error',
// 禁止在 if 代码块内出现函数声明
'no-inner-declarations': [
'error',
'both'
],
// 禁止在 RegExp 构造函数中出现非法的正则表达式
'no-invalid-regexp': 'error',
// 禁止使用特殊空白符(比如全角空格),除非是出现在字符串、正则表达式或模版字符串中
'no-irregular-whitespace': [
'error',
{
skipStrings: true,
skipComments: false,
skipRegExps: true,
skipTemplates: true
}
],
// 禁止将 Math, JSON 或 Reflect 直接作为函数调用
'no-obj-calls': 'error',
// 禁止使用 hasOwnProperty, isPrototypeOf 或 propertyIsEnumerable
// @off hasOwnProperty 比较常用
'no-prototype-builtins': 'off',
// @fixable 禁止在正则表达式中出现连续的空格,必须使用 /foo {3}bar/ 代替
'no-regex-spaces': 'error',
// 禁止在数组中出现连续的逗号,如 let foo = [,,]
'no-sparse-arrays': 'error',
// 禁止在普通字符串中出现模版字符串里的变量形式,如 'Hello ${name}!'
'no-template-curly-in-string': 'error',
// 禁止出现难以理解的多行表达式,如:
// let foo = bar
// [1, 2, 3].forEach(baz);
'no-unexpected-multiline': 'error',
// 禁止在 return, throw, break 或 continue 之后还有代码
'no-unreachable': 'error',
// 禁止在 finally 中出现 return, throw, break 或 continue
'no-unsafe-finally': 'error',
// @fixable 禁止在 in 或 instanceof 操作符的左侧使用感叹号,如 if (!key in object)
'no-unsafe-negation': 'error',
// 必须使用 isNaN(foo) 而不是 foo === NaN
'use-isnan': 'error',
// 注释必须符合 jsdoc 的规范
// @off jsdoc 要求太严格
'valid-jsdoc': 'off',
// typeof 表达式比较的对象必须是 'undefined', 'object', 'boolean', 'number', 'string', 'function' 或 'symbol'
'valid-typeof': 'error',
//
//
// 最佳实践
// 这些规则通过一些最佳实践帮助你避免问题
//
// setter 必须有对应的 getter,getter 可以没有对应的 setter
'accessor-pairs': [
'error',
{
setWithoutGet: true,
getWithoutSet: false
}
],
// 数组的方法除了 forEach 之外,回调函数必须有返回值
'array-callback-return': 'error',
// 将 var 定义的变量视为块作用域,禁止在块外使用
'block-scoped-var': 'error',
// 在类的非静态方法中,必须存在对 this 的引用
// @off 太严格了
'class-methods-use-this': 'off',
// 禁止函数的循环复杂度超过 20,https://en.wikipedia.org/wiki/Cyclomatic_complexity
'complexity': [
'error',
{
max: 20
}
],
// 禁止函数在不同分支返回不同类型的值
// @off 太严格了
'consistent-return': 'off',
// @fixable if 后面必须要有 {,除非是单行 if
'curly': [
'error',
'multi-line',
'consistent'
],
// switch 语句必须有 default
// @off 太严格了
'default-case': 'off',
// @fixable 链式调用的时候,点号必须放在第二行开头处,禁止放在第一行结尾处
'dot-location': [
'error',
'property'
],
// @fixable 禁止出现 foo['bar'],必须写成 foo.bar
// @off 当需要写一系列属性的时候,可以更统一
'dot-notation': 'off',
// @fixable 必须使用 === 或 !==,禁止使用 == 或 !=,与 null 比较时除外
'eqeqeq': [
'error',
'always',
{
null: 'ignore'
}
],
// for in 内部必须有 hasOwnProperty
'guard-for-in': 'error',
// 禁止使用 alert
// @off alert 很常用
'no-alert': 'off',
// 禁止使用 caller 或 callee
'no-caller': 'error',
// switch 的 case 内有变量定义的时候,必须使用大括号将 case 内变成一个代码块
'no-case-declarations': 'error',
// 禁止在正则表达式中出现形似除法操作符的开头,如 let a = /=foo/
// @off 有代码高亮的话,在阅读这种代码时,也完全不会产生歧义或理解上的困难
'no-div-regex': 'off',
// @fixable 禁止在 else 内使用 return,必须改为提前结束
// @off else 中使用 return 可以使代码结构更清晰
'no-else-return': 'off',
// 不允许有空函数,除非是将一个空函数设置为某个项的默认值
'no-empty-function': [
'error',
{
allow: [
'functions',
'arrowFunctions'
]
}
],
// 禁止解构中出现空 {} 或 []
'no-empty-pattern': 'error',
// 禁止使用 foo == null 或 foo != null,必须使用 foo === null 或 foo !== null
// @off foo == null 用于判断 foo 不是 undefined 并且不是 null,比较常用,故允许此写法
'no-eq-null': 'off',
// 禁止使用 eval
'no-eval': 'error',
// 禁止修改原生对象
'no-extend-native': 'error',
// @fixable 禁止出现没必要的 bind
'no-extra-bind': 'error',
// @fixable 禁止出现没必要的 label
'no-extra-label': 'error',
// switch 的 case 内必须有 break, return 或 throw
'no-fallthrough': 'error',
// @fixable 表示小数时,禁止省略 0,比如 .5
'no-floating-decimal': 'error',
// 禁止对全局变量赋值
'no-global-assign': 'error',
// @fixable 禁止使用 !! ~ 等难以理解的运算符
// 仅允许使用 !!
'no-implicit-coercion': [
'error',
{
allow: [
'!!'
]
}
],
// 禁止在全局作用域下定义变量或申明函数
'no-implicit-globals': 'error',
// 禁止在 setTimeout 或 setInterval 中传入字符串,如 setTimeout('alert("Hi!")', 100);
'no-implied-eval': 'error',
// 禁止在类之外的地方使用 this
// @off this 的使用很灵活,事件回调中可以表示当前元素,函数也可以先用 this,等以后被调用的时候再 call
'no-invalid-this': 'off',
// 禁止使用 __iterator__
'no-iterator': 'error',
// 禁止使用 label
'no-labels': 'error',
// 禁止使用没必要的 {} 作为代码块
'no-lone-blocks': 'error',
// 禁止在循环内的函数中出现循环体条件语句中定义的变量,比如:
// for (var i = 0; i < 10; i++) {
// (function () { return i })();
// }
'no-loop-func': 'error',
// 禁止使用 magic numbers
// @off 太严格了
'no-magic-numbers': 'off',
// @fixable 禁止出现连续的多个空格,除非是注释前,或对齐对象的属性、变量定义、import 等
'no-multi-spaces': [
'error',
{
ignoreEOLComments: true,
exceptions: {
Property: true,
BinaryExpression: false,
VariableDeclarator: true,
ImportDeclaration: true
}
}
],
// 禁止使用 \ 来换行字符串
'no-multi-str': 'error',
// 禁止直接 new 一个类而不赋值
'no-new': 'error',
// 禁止使用 new Function,比如 let x = new Function("a", "b", "return a + b");
'no-new-func': 'error',
// 禁止使用 new 来生成 String, Number 或 Boolean
'no-new-wrappers': 'error',
// 禁止使用 0 开头的数字表示八进制数
'no-octal': 'error',
// 禁止使用八进制的转义符
'no-octal-escape': 'error',
// 禁止对函数的参数重新赋值
'no-param-reassign': 'error',
// 禁止使用 __proto__
'no-proto': 'error',
// 禁止重复定义变量
'no-redeclare': 'error',
// 禁止使用指定的对象属性
// @off 它用于限制某个具体的 api 不能使用
'no-restricted-properties': 'off',
// 禁止在 return 语句里赋值
'no-return-assign': [
'error',
'always'
],
// 禁止在 return 语句里使用 await
'no-return-await': 'error',
// 禁止出现 location.href = 'javascript:void(0)';
'no-script-url': 'error',
// 禁止将自己赋值给自己
'no-self-assign': 'error',
// 禁止将自己与自己比较
'no-self-compare': 'error',
// 禁止使用逗号操作符
'no-sequences': 'error',
// 禁止 throw 字面量,必须 throw 一个 Error 对象
'no-throw-literal': 'error',
// 循环内必须对循环条件的变量有修改
'no-unmodified-loop-condition': 'error',
// 禁止无用的表达式
'no-unused-expressions': [
'error',
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true
}
],
// @fixable 禁止出现没用的 label
'no-unused-labels': 'error',
// 禁止出现没必要的 call 或 apply
'no-useless-call': 'error',
// 禁止出现没必要的字符串连接
'no-useless-concat': 'error',
// 禁止出现没必要的转义
// @off 转义可以使代码更易懂
'no-useless-escape': 'off',
// @fixable 禁止没必要的 return
// @off 没必要限制 return
'no-useless-return': 'off',
// 禁止使用 void
'no-void': 'error',
// 禁止注释中出现 TODO 和 FIXME
// @off TODO 很常用
'no-warning-comments': 'off',
// 禁止使用 with
'no-with': 'error',
// Promise 的 reject 中必须传入 Error 对象,而不是字面量
'prefer-promise-reject-errors': 'error',
// parseInt 必须传入第二个参数
'radix': 'error',
// async 函数中必须存在 await 语句
// @off async function 中没有 await 的写法很常见,比如 koa 的示例中就有这种用法
'require-await': 'off',
// var 必须在作用域的最前面
// @off var 不在最前面也是很常见的用法
'vars-on-top': 'off',
// @fixable 立即执行的函数必须符合如下格式 (function () { alert('Hello') })()
'wrap-iife': [
'error',
'inside',
{
functionPrototypeMethods: true
}
],
// @fixable 必须使用 if (foo === 5) 而不是 if (5 === foo)
'yoda': [
'error',
'never',
{
onlyEquality: true
}
],
//
//
// 严格模式
// 这些规则与严格模式指令有关
//
// @fixable 禁止使用 'strict';
'strict': [
'error',
'never'
],
//
//
// 变量
// 这些规则与变量申明有关
//
// 变量必须在定义的时候赋值
// @off 先定义后赋值很常见
'init-declarations': 'off',
// 禁止 catch 的参数名与定义过的变量重复
// @off 太严格了
'no-catch-shadow': 'off',
// 禁止使用 delete
'no-delete-var': 'error',
// 禁止 label 名称与定义过的变量重复
'no-label-var': 'error',
// 禁止使用指定的全局变量
// @off 它用于限制某个具体的变量名不能使用
'no-restricted-globals': 'off',
// 禁止变量名与上层作用域内的定义过的变量重复
// @off 很多时候函数的形参和传参是同名的
'no-shadow': 'off',
// 禁止使用保留字作为变量名
'no-shadow-restricted-names': 'error',
// 禁止使用未定义的变量
'no-undef': [
'error',
{
typeof: false
}
],
// @fixable 禁止将 undefined 赋值给变量
'no-undef-init': 'error',
// 禁止对 undefined 重新赋值
'no-undefined': 'error',
// 定义过的变量必须使用
'no-unused-vars': [
'error',
{
vars: 'all',
args: 'none',
caughtErrors: 'none',
ignoreRestSiblings: true
}
],
// 变量必须先定义后使用
'no-use-before-define': [
'error',
{
functions: false,
classes: false,
variables: false
}
],
//
//
// Node.js 和 CommonJS
// 这些规则与在 Node.js 中运行的代码或浏览器中使用的 CommonJS 有关
//
// callback 之后必须立即 return
// @off Limitations 太多了
'callback-return': 'off',
// require 必须在全局作用域下
// @off 条件加载很常见
'global-require': 'off',
// callback 中的 error 必须被处理
'handle-callback-err': 'error',
// 禁止直接使用 Buffer
'no-buffer-constructor': 'error',
// 相同类型的 require 必须放在一起
// @off 太严格了
'no-mixed-requires': 'off',
// 禁止直接 new require('foo')
'no-new-require': 'error',
// 禁止对 __dirname 或 __filename 使用字符串连接
'no-path-concat': 'error',
// 禁止使用 process.env.NODE_ENV
// @off 使用很常见
'no-process-env': 'off',
// 禁止使用 process.exit(0)
// @off 使用很常见
'no-process-exit': 'off',
// 禁止使用指定的模块
// @off 它用于限制某个具体的模块不能使用
'no-restricted-modules': 'off',
// 禁止使用 node 中的同步的方法,比如 fs.readFileSync
// @off 使用很常见
'no-sync': 'off',
//
//
// 风格问题
// 这些规则与代码风格有关,所以是非常主观的
//
// @fixable 配置数组的中括号内前后的换行格式
// @off 配置项无法配制成想要的样子
'array-bracket-newline': 'off',
// @fixable 数组的括号内的前后禁止有空格
'array-bracket-spacing': [
'error',
'never'
],
// @fixable 配置数组的元素之间的换行格式
// @off 允许一行包含多个元素,方便大数量的数组的书写
'array-element-newline': 'off',
// @fixable 代码块如果在一行内,那么大括号内的首尾必须有空格,比如 function () { alert('Hello') }
'block-spacing': [
'error',
'always'
],
// @fixable if 与 else 的大括号风格必须一致
// @off else 代码块可能前面需要有一行注释
'brace-style': 'off',
// 变量名必须是 camelcase 风格的
// @off 很多 api 或文件名都不是 camelcase
'camelcase': 'off',
// @fixable 注释的首字母必须大写
// @off 没必要限制
'capitalized-comments': 'off',
// @fixable 对象的最后一个属性末尾必须有逗号
// @off 没必要限制
'comma-dangle': 'off',
// @fixable 逗号前禁止有空格,逗号后必须要有空格
'comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
// @fixable 禁止在行首写逗号
'comma-style': [
'error',
'last'
],
// @fixable 用作对象的计算属性时,中括号内的首尾禁止有空格
'computed-property-spacing': [
'error',
'never'
],
// 限制 this 的别名
// @off 没必要限制
'consistent-this': 'off',
// @fixable 文件最后一行必须有一个空行
// @off 没必要限制
'eol-last': 'off',
// @fixable 函数名和执行它的括号之间禁止有空格
'func-call-spacing': [
'error',
'never'
],
// 函数赋值给变量的时候,函数名必须与变量名一致
'func-name-matching': [
'error',
'always',
{
includeCommonJSModuleExports: false
}
],
// 函数必须有名字
// @off 没必要限制
'func-names': 'off',
// 必须只使用函数声明或只使用函数表达式
// @off 没必要限制
'func-style': 'off',
// 禁止使用指定的标识符
// @off 它用于限制某个具体的标识符不能使用
'id-blacklist': 'off',
// 限制变量名长度
// @off 没必要限制变量名长度
'id-length': 'off',
// 限制变量名必须匹配指定的正则表达式
// @off 没必要限制变量名
'id-match': 'off',
// @fixable 一个缩进必须用四个空格替代
'indent': [
'error',
4,
{
SwitchCase: 1,
flatTernaryExpressions: true
}
],
// @fixable jsx 中的属性必须用双引号
'jsx-quotes': [
'error',
'prefer-double'
],
// @fixable 对象字面量中冒号前面禁止有空格,后面必须有空格
'key-spacing': [
'error',
{
beforeColon: false,
afterColon: true,
mode: 'strict',
}
],
// @fixable 关键字前后必须有空格
'keyword-spacing': [
'error',
{
before: true,
after: true
}
],
// 单行注释必须写在上一行
// @off 没必要限制
'line-comment-position': 'off',
// @fixable 限制换行符为 LF 或 CRLF
// @off 没必要限制
'linebreak-style': 'off',
// @fixable 注释前后必须有空行
// @off 没必要限制
'lines-around-comment': 'off',
// 代码块嵌套的深度禁止超过 5 层
'max-depth': [
'error',
5
],
// 限制一行的长度
// @off 现在编辑器已经很智能了,不需要限制一行的长度
'max-len': 'off',
// 限制一个文件最多的行数
// @off 没必要限制
'max-lines': 'off',
// 回调函数嵌套禁止超过 3 层,多了请用 async await 替代
'max-nested-callbacks': [
'error',
3
],
// 函数的参数禁止超过 7 个
'max-params': [
'error',
7
],
// 限制函数块中的语句数量
// @off 没必要限制
'max-statements': 'off',
// 限制一行中的语句数量
// @off 没必要限制
'max-statements-per-line': 'off',
// 三元表达式必须得换行
// @off 三元表达式可以随意使用
'multiline-ternary': 'off',
// new 后面的类名必须首字母大写
'new-cap': [
'error',
{
newIsCap: true,
capIsNew: false,
properties: true
}
],
// @fixable new 后面的类必须有小括号
'new-parens': 'error',
// 链式调用必须换行
// @off 没必要限制
'newline-per-chained-call': 'off',
// 禁止使用 Array 构造函数
'no-array-constructor': 'error',
// 禁止使用位运算
// @off 位运算很常见
'no-bitwise': 'off',
// 禁止使用 continue
// @off continue 很常用
'no-continue': 'off',
// 禁止在代码后添加内联注释
// @off 内联注释很常用
'no-inline-comments': 'off',
// @fixable 禁止 else 中只有一个单独的 if
// @off 单独的 if 可以把逻辑表达的更清楚
'no-lonely-if': 'off',
// 禁止混用不同的操作符,比如 let foo = a && b < 0 || c > 0 || d + 1 === 0
// @off 太严格了,可以由使用者自己去判断如何混用操作符
'no-mixed-operators': 'off',
// 禁止混用空格和缩进
'no-mixed-spaces-and-tabs': 'error',
// 禁止连续赋值,比如 a = b = c = 5
// @off 没必要限制
'no-multi-assign': 'off',
// @fixable 禁止出现超过三行的连续空行
'no-multiple-empty-lines': [
'error',
{
max: 3,
maxEOF: 1,
maxBOF: 1
}
],
// 禁止 if 里面有否定的表达式,比如:
// if (a !== b) {
// doSomething();
// } else {
// doSomethingElse();
// }
// @off 否定的表达式可以把逻辑表达的更清楚
'no-negated-condition': 'off',
// 禁止使用嵌套的三元表达式,比如 a ? b : c ? d : e
// @off 没必要限制
'no-nested-ternary': 'off',
// 禁止直接 new Object
'no-new-object': 'error',
// 禁止使用 ++ 或 --
// @off 没必要限制
'no-plusplus': 'off',
// 禁止使用特定的语法
// @off 它用于限制某个具体的语法不能使用
'no-restricted-syntax': 'off',
// 禁止使用 tabs
'no-tabs': 'error',
// 禁止使用三元表达式
// @off 三元表达式很常用
'no-ternary': 'off',
// @fixable 禁止行尾有空格
'no-trailing-spaces': 'error',
// 禁止变量名出现下划线
// @off 下划线在变量名中很常用
'no-underscore-dangle': 'off',
// @fixable 必须使用 !a 替代 a ? false : true
// @off 后者表达的更清晰
'no-unneeded-ternary': 'off',
// @fixable 禁止属性前有空格,比如 foo. bar()
'no-whitespace-before-property': 'error',
// @fixable 禁止 if 后面不加大括号而写两行代码
'nonblock-statement-body-position': [
'error',
'beside',
{
overrides: {
while: 'below'
}
}
],
// @fixable 大括号内的首尾必须有换行
'object-curly-newline': [
'error',
{
multiline: true,
consistent: true
}
],
// @fixable 对象字面量只有一行时,大括号内的首尾必须有空格
'object-curly-spacing': [
'error',
'always',
{
arraysInObjects: true,
objectsInObjects: false
}
],
// @fixable 对象字面量内的属性每行必须只有一个
// @off 没必要限制
'object-property-newline': 'off',
// 禁止变量申明时用逗号一次申明多个
'one-var': [
'error',
'never'
],
// @fixable 变量申明必须每行一个
'one-var-declaration-per-line': [
'error',
'always'
],
// @fixable 必须使用 x = x + y 而不是 x += y
// @off 没必要限制
'operator-assignment': 'off',
// @fixable 需要换行的时候,操作符必须放在行末,比如:
// let foo = 1 +
// 2
// @off 有时放在第二行开始处更易读
'operator-linebreak': 'off',
// @fixable 代码块首尾必须要空行
// @off 没必要限制
'padded-blocks': 'off',
// @fixable 限制语句之间的空行规则,比如变量定义完之后必须要空行
// @off 没必要限制
'padding-line-between-statements': 'off',
// @fixable 对象字面量的键名禁止用引号括起来
// @off 没必要限制
'quote-props': 'off',
// @fixable 必须使用单引号,禁止使用双引号
'quotes': [
'error',
'single',
{
avoidEscape: true,
allowTemplateLiterals: true
}
],
// 必须使用 jsdoc 风格的注释
// @off 太严格了
'require-jsdoc': 'off',
// @fixable 结尾必须有分号
'semi': [
'error',
'always',
{
omitLastInOneLineBlock: true
}
],
// @fixable 一行有多个语句时,分号前面禁止有空格,分号后面必须有空格
'semi-spacing': [
'error',
{
before: false,
after: true
}
],
// @fixable 分号必须写在行尾,禁止在行首出现
'semi-style': [
'error',
'last'
],
// 对象字面量的键名必须排好序
// @off 没必要限制
'sort-keys': 'off',
// 变量申明必须排好序
// @off 没必要限制
'sort-vars': 'off',
// @fixable if, function 等的大括号之前必须要有空格,比如 if (a) {
'space-before-blocks': [
'error',
'always'
],
// @fixable function 的小括号之前必须要有空格
'space-before-function-paren': [
'error',
{
anonymous: 'ignore',
named: 'never',
asyncArrow: 'always'
}
],
// @fixable 小括号内的首尾禁止有空格
'space-in-parens': [
'error',
'never'
],
// @fixable 操作符左右必须有空格,比如 let sum = 1 + 2;
'space-infix-ops': 'error',
// @fixable new, typeof 等后面必须有空格,++, -- 等禁止有空格,比如:
// let foo = new Person();
// bar = bar++;
'space-unary-ops': [
'error',
{
words: true,
nonwords: false
}
],
// @fixable 注释的斜线或 * 后必须有空格
'spaced-comment': [
'error',
'always',
{
block: {
exceptions: [
'*'
],
balanced: true
}
}
],
// @fixable case 的冒号前禁止有空格,冒号后必须有空格
'switch-colon-spacing': [
'error',
{
after: true,
before: false
}
],
// @fixable 模版字符串的 tag 之后禁止有空格,比如 tag`Hello World`
'template-tag-spacing': [
'error',
'never'
],
// @fixable 文件开头禁止有 BOM
'unicode-bom': [
'error',
'never'
],
// @fixable 正则表达式必须有括号包起来
// @off 没必要限制
'wrap-regex': 'off',
//
//
// ECMAScript 6
// 这些规则与 ES6(即通常所说的 ES2015)有关
//
// @fixable 箭头函数能够省略 return 的时候,必须省略,比如必须写成 () => 0,禁止写成 () => { return 0 }
// @off 箭头函数的返回值,应该允许灵活设置
'arrow-body-style': 'off',
// @fixable 箭头函数只有一个参数的时候,必须加括号
// @off 应该允许灵活设置
'arrow-parens': 'off',
// @fixable 箭头函数的箭头前后必须有空格
'arrow-spacing': [
'error',
{
before: true,
after: true
}
],
// constructor 中必须有 super
'constructor-super': 'error',
// @fixable generator 的 * 前面禁止有空格,后面必须有空格
'generator-star-spacing': [
'error',
{
before: false,
after: true
}
],
// 禁止对定义过的 class 重新赋值
'no-class-assign': 'error',
// @fixable 禁止出现难以理解的箭头函数,比如 let x = a => 1 ? 2 : 3
'no-confusing-arrow': [
'error',
{
allowParens: true
}
],
// 禁止对使用 const 定义的常量重新赋值
'no-const-assign': 'error',
// 禁止重复定义类
'no-dupe-class-members': 'error',
// 禁止重复 import 模块
'no-duplicate-imports': 'error',
// 禁止使用 new 来生成 Symbol
'no-new-symbol': 'error',
// 禁止 import 指定的模块
// @off 它用于限制某个具体的模块不能使用
'no-restricted-imports': 'off',
// 禁止在 super 被调用之前使用 this 或 super
'no-this-before-super': 'error',
// @fixable 禁止出现没必要的计算键名,比如 let a = { ['0']: 0 };
'no-useless-computed-key': 'error',
// 禁止出现没必要的 constructor,比如 constructor(value) { super(value) }
'no-useless-constructor': 'error',
// @fixable 禁止解构时出现同样名字的的重命名,比如 let { foo: foo } = bar;
'no-useless-rename': 'error',
// @fixable 禁止使用 var
'no-var': 'error',
// @fixable 必须使用 a = {b} 而不是 a = {b: b}
// @off 没必要强制要求
'object-shorthand': 'off',
// @fixable 必须使用箭头函数作为回调
// @off 没必要强制要求
'prefer-arrow-callback': 'off',
// @fixable 申明后不再被修改的变量必须使用 const 来申明
// @off 没必要强制要求
'prefer-const': 'off',
// 必须使用解构
// @off 没必要强制要求
'prefer-destructuring': 'off',
// @fixable 必须使用 0b11111011 而不是 parseInt('111110111', 2)
// @off 没必要强制要求
'prefer-numeric-literals': 'off',
// 必须使用 ...args 而不是 arguments
// @off 没必要强制要求
'prefer-rest-params': 'off',
// @fixable 必须使用 ... 而不是 apply,比如 foo(...args)
// @off apply 很常用
'prefer-spread': 'off',
// @fixable 必须使用模版字符串而不是字符串连接
// @off 字符串连接很常用
'prefer-template': 'off',
// generator 函数内必须有 yield
'require-yield': 'error',
// @fixable ... 的后面禁止有空格
'rest-spread-spacing': [
'error',
'never'
],
// @fixable import 必须按规则排序
// @off 没必要强制要求
'sort-imports': 'off',
// 创建 Symbol 时必须传入参数
'symbol-description': 'error',
// @fixable ${name} 内的首尾禁止有空格
'template-curly-spacing': [
'error',
'never'
],
// @fixable yield* 后面必须要有空格
'yield-star-spacing': [
'error',
'after'
]
}
};
常用配置
项目下新建.eslint文件,内容如下
{
// 环境定义了预定义的全局变量。
"env": {
//环境定义了预定义的全局变量。更多在官网查看
"browser": true,
"node": true,
"commonjs": true,
"amd": true,
"es6": true,
"mocha": true
},
// JavaScript 语言选项
"parserOptions": {
// ECMAScript 版本
"ecmaVersion": 6,
"sourceType": "module", //设置为 "script" (默认) 或 "module"(如果你的代码是 ECMAScript 模块)。
//想使用的额外的语言特性:
"ecmaFeatures": {
// 允许在全局作用域下使用 return 语句
"globalReturn": true,
// impliedStric
"impliedStrict": true,
// 启用 JSX
"jsx": true,
"modules": true
}
},
//-----让eslint支持 JSX start
"plugins": [
"react"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
//-----让eslint支持 JSX end
/**
* "off" 或 0 - 关闭规则
* "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出),
* "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
*/
"rules": {
////////////////
// 可能的错误 //
////////////////
// 禁止条件表达式中出现赋值操作符
"no-cond-assign": 2,
// 禁用 console
"no-console": 0,
// 禁止在条件中使用常量表达式
// if (false) {
// doSomethingUnfinished();
// } //cuowu
"no-constant-condition": 2,
// 禁止在正则表达式中使用控制字符 :new RegExp("\x1f")
"no-control-regex": 2,
// 数组和对象键值对最后一个逗号, never参数:不能带末尾的逗号, always参数:必须带末尾的逗号,
// always-multiline:多行模式必须带逗号,单行模式不能带逗号
"comma-dangle": [
1,
"never"
],
// 禁用 debugger
"no-debugger": 2,
// 禁止 function 定义中出现重名参数
"no-dupe-args": 2,
// 禁止对象字面量中出现重复的 key
"no-dupe-keys": 2,
// 禁止重复的 case 标签
"no-duplicate-case": 2,
// 禁止空语句块
"no-empty": 2,
// 禁止在正则表达式中使用空字符集 (/^abc[]/)
"no-empty-character-class": 2,
// 禁止对 catch 子句的参数重新赋值
"no-ex-assign": 2,
// 禁止不必要的布尔转换
"no-extra-boolean-cast": 2,
// 禁止不必要的括号 //(a * b) + c;//报错
"no-extra-parens": 0,
// 禁止不必要的分号
"no-extra-semi": 2,
// 禁止对 function 声明重新赋值
"no-func-assign": 2,
// 禁止在嵌套的块中出现 function 或 var 声明
"no-inner-declarations": [
2,
"functions"
],
// 禁止 RegExp 构造函数中无效的正则表达式字符串
"no-invalid-regexp": 2,
// 禁止在字符串和注释之外不规则的空白
"no-irregular-whitespace": 2,
// 禁止在 in 表达式中出现否定的左操作数
"no-negated-in-lhs": 2,
// 禁止把全局对象 (Math 和 JSON) 作为函数调用 错误:var math = Math();
"no-obj-calls": 2,
// 禁止直接使用 Object.prototypes 的内置属性
"no-prototype-builtins": 0,
// 禁止正则表达式字面量中出现多个空格
"no-regex-spaces": 2,
// 禁用稀疏数组
"no-sparse-arrays": 2,
// 禁止出现令人困惑的多行表达式
"no-unexpected-multiline": 2,
// 禁止在return、throw、continue 和 break语句之后出现不可达代码
"no-unreachable": 2,
// 要求使用 isNaN() 检查 NaN
"use-isnan": 2,
// 强制使用有效的 JSDoc 注释
"valid-jsdoc": 1,
// 强制 typeof 表达式与有效的字符串进行比较
// typeof foo === "undefimed" 错误
"valid-typeof": 2,
//////////////
// 最佳实践 //
//////////////
// 定义对象的set存取器属性时,强制定义get
"accessor-pairs": 2,
// 强制数组方法的回调函数中有 return 语句
"array-callback-return": 0,
// 强制把变量的使用限制在其定义的作用域范围内
"block-scoped-var": 0,
// 限制圈复杂度,也就是类似if else能连续接多少个
"complexity": [
2,
9
],
// 要求 return 语句要么总是指定返回的值,要么不指定
"consistent-return": 0,
// 强制所有控制语句使用一致的括号风格
"curly": [
2,
"all"
],
// switch 语句强制 default 分支,也可添加 // no default 注释取消此次警告
"default-case": 2,
// 强制object.key 中 . 的位置,参数:
// property,'.'号应与属性在同一行
// object, '.' 号应与对象名在同一行
"dot-location": [
2,
"property"
],
// 强制使用.号取属性
// 参数: allowKeywords:true 使用保留字做属性名时,只能使用.方式取属性
// false 使用保留字做属性名时, 只能使用[]方式取属性 e.g [2, {"allowKeywords": false}]
// allowPattern: 当属性名匹配提供的正则表达式时,允许使用[]方式取值,否则只能用.号取值 e.g [2, {"allowPattern": "^[a-z]+(_[a-z]+)+$"}]
"dot-notation": [
2,
{
"allowKeywords": false
}
],
// 使用 === 替代 == allow-null允许null和undefined==
"eqeqeq": [
2,
"allow-null"
],
// 要求 for-in 循环中有一个 if 语句
"guard-for-in": 2,
// 禁用 alert、confirm 和 prompt
"no-alert": 0,
// 禁用 arguments.caller 或 arguments.callee
"no-caller": 2,
// 不允许在 case 子句中使用词法声明
"no-case-declarations": 2,
// 禁止除法操作符显式的出现在正则表达式开始的位置
"no-div-regex": 2,
// 禁止 if 语句中有 return 之后有 else
"no-else-return": 0,
// 禁止出现空函数.如果一个函数包含了一条注释,它将不会被认为有问题。
"no-empty-function": 2,
// 禁止使用空解构模式no-empty-pattern
"no-empty-pattern": 2,
// 禁止在没有类型检查操作符的情况下与 null 进行比较
"no-eq-null": 1,
// 禁用 eval()
"no-eval": 2,
// 禁止扩展原生类型
"no-extend-native": 2,
// 禁止不必要的 .bind() 调用
"no-extra-bind": 2,
// 禁用不必要的标签
"no-extra-label:": 0,
// 禁止 case 语句落空
"no-fallthrough": 2,
// 禁止数字字面量中使用前导和末尾小数点
"no-floating-decimal": 2,
// 禁止使用短符号进行类型转换(!!fOO)
"no-implicit-coercion": 0,
// 禁止在全局范围内使用 var 和命名的 function 声明
"no-implicit-globals": 1,
// 禁止使用类似 eval() 的方法
"no-implied-eval": 2,
// 禁止 this 关键字出现在类和类对象之外
"no-invalid-this": 0,
// 禁用 __iterator__ 属性
"no-iterator": 2,
// 禁用标签语句
"no-labels": 2,
// 禁用不必要的嵌套块
"no-lone-blocks": 2,
// 禁止在循环中出现 function 声明和表达式
"no-loop-func": 1,
// 禁用魔术数字(3.14什么的用常量代替)
"no-magic-numbers": [
1,
{
"ignore": [
0,
-1,
1
]
}
],
// 禁止使用多个空格
"no-multi-spaces": 2,
// 禁止使用多行字符串,在 JavaScript 中,可以在新行之前使用斜线创建多行字符串
"no-multi-str": 2,
// 禁止对原生对象赋值
"no-native-reassign": 2,
// 禁止在非赋值或条件语句中使用 new 操作符
"no-new": 2,
// 禁止对 Function 对象使用 new 操作符
"no-new-func": 0,
// 禁止对 String,Number 和 Boolean 使用 new 操作符
"no-new-wrappers": 2,
// 禁用八进制字面量
"no-octal": 2,
// 禁止在字符串中使用八进制转义序列
"no-octal-escape": 2,
// 不允许对 function 的参数进行重新赋值
"no-param-reassign": 0,
// 禁用 __proto__ 属性
"no-proto": 2,
// 禁止使用 var 多次声明同一变量
"no-redeclare": 2,
// 禁用指定的通过 require 加载的模块
"no-return-assign": 0,
// 禁止使用 javascript: url
"no-script-url": 0,
// 禁止自我赋值
"no-self-assign": 2,
// 禁止自身比较
"no-self-compare": 2,
// 禁用逗号操作符
"no-sequences": 2,
// 禁止抛出非异常字面量
"no-throw-literal": 2,
// 禁用一成不变的循环条件
"no-unmodified-loop-condition": 2,
// 禁止出现未使用过的表达式
"no-unused-expressions": 0,
// 禁用未使用过的标签
"no-unused-labels": 2,
// 禁止不必要的 .call() 和 .apply()
"no-useless-call": 2,
// 禁止不必要的字符串字面量或模板字面量的连接
"no-useless-concat": 2,
// 禁用不必要的转义字符
"no-useless-escape": 0,
// 禁用 void 操作符
"no-void": 0,
// 禁止在注释中使用特定的警告术语
"no-warning-comments": 0,
// 禁用 with 语句
"no-with": 2,
// 强制在parseInt()使用基数参数
"radix": 2,
// 要求所有的 var 声明出现在它们所在的作用域顶部
"vars-on-top": 0,
// 要求 IIFE 使用括号括起来
"wrap-iife": [
2,
"any"
],
// 要求或禁止 “Yoda” 条件
"yoda": [
2,
"never"
],
// 要求或禁止使用严格模式指令
"strict": 0,
//////////////
// 变量声明 //
//////////////
// 要求或禁止 var 声明中的初始化(初值)
"init-declarations": 0,
// 不允许 catch 子句的参数与外层作用域中的变量同名
"no-catch-shadow": 0,
// 禁止删除变量
"no-delete-var": 2,
// 不允许标签与变量同名
"no-label-var": 2,
// 禁用特定的全局变量
"no-restricted-globals": 0,
// 禁止 var 声明 与外层作用域的变量同名
"no-shadow": 0,
// 禁止覆盖受限制的标识符
"no-shadow-restricted-names": 2,
// 禁用未声明的变量,除非它们在 /*global */ 注释中被提到
"no-undef": 2,
// 禁止将变量初始化为 undefined
"no-undef-init": 2,
// 禁止将 undefined 作为标识符
"no-undefined": 0,
// 禁止出现未使用过的变量
"no-unused-vars": [
2,
{
"vars": "all",
"args": "none"
}
],
// 不允许在变量定义之前使用它们
"no-use-before-define": 0,
//////////////////////////
// Node.js and CommonJS //
//////////////////////////
// require return statements after callbacks
"callback-return": 0,
// 要求 require() 出现在顶层模块作用域中
"global-require": 1,
// 要求回调函数中有容错处理
"handle-callback-err": [
2,
"^(err|error)$"
],
// 禁止混合常规 var 声明和 require 调用
"no-mixed-requires": 0,
// 禁止调用 require 时使用 new 操作符
"no-new-require": 2,
// 禁止对 __dirname 和 __filename进行字符串连接
"no-path-concat": 0,
// 禁用 process.env
"no-process-env": 0,
// 禁用 process.exit()
"no-process-exit": 0,
// 禁用同步方法
"no-sync": 0,
//////////////
// 风格指南 //
//////////////
// 指定数组的元素之间要以空格隔开(, 后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格
"array-bracket-spacing": [
2,
"never"
],
// 禁止或强制在单行代码块中使用空格(禁用)
"block-spacing": [
1,
"never"
],
//强制使用一致的缩进 第二个参数为 "tab" 时,会使用tab,
// if while function 后面的{必须与if在同一行,java风格。
"brace-style": [
2,
"1tbs",
{
"allowSingleLine": true
}
],
// 双峰驼命名格式
"camelcase": 2,
// 控制逗号前后的空格
"comma-spacing": [
2,
{
"before": false,
"after": true
}
],
// 控制逗号在行尾出现还是在行首出现 (默认行尾)
// http://eslint.org/docs/rules/comma-style
"comma-style": [
2,
"last"
],
//"SwitchCase" (默认:0) 强制 switch 语句中的 case 子句的缩进水平
// 以方括号取对象属性时,[ 后面和 ] 前面是否需要空格, 可选参数 never, always
"computed-property-spacing": [
2,
"never"
],
// 用于指统一在回调函数中指向this的变量名,箭头函数中的this已经可以指向外层调用者,应该没卵用了
// e.g [0,"that"] 指定只能 var that = this. that不能指向其他任何值,this也不能赋值给that以外的其他值
"consistent-this": [
1,
"that"
],
// 强制使用命名的 function 表达式
"func-names": 0,
// 文件末尾强制换行
"eol-last": 2,
"indent": [
2,
4,
{
"SwitchCase": 1
}
],
// 强制在对象字面量的属性中键和值之间使用一致的间距
"key-spacing": [
2,
{
"beforeColon": false,
"afterColon": true
}
],
// 强制使用一致的换行风格
"linebreak-style": [
1,
"unix"
],
// 要求在注释周围有空行 ( 要求在块级注释之前有一空行)
"lines-around-comment": [
1,
{
"beforeBlockComment": true
}
],
// 强制一致地使用函数声明或函数表达式,方法定义风格,参数:
// declaration: 强制使用方法声明的方式,function f(){} e.g [2, "declaration"]
// expression:强制使用方法表达式的方式,var f = function() {} e.g [2, "expression"]
// allowArrowFunctions: declaration风格中允许箭头函数。 e.g [2, "declaration", { "allowArrowFunctions": true }]
"func-style": 0,
// 强制回调函数最大嵌套深度 5层
"max-nested-callbacks": [
1,
5
],
// 禁止使用指定的标识符
"id-blacklist": 0,
// 强制标识符的最新和最大长度
"id-length": 0,
// 要求标识符匹配一个指定的正则表达式
"id-match": 0,
// 强制在 JSX 属性中一致地使用双引号或单引号
"jsx-quotes": 0,
// 强制在关键字前后使用一致的空格 (前后腰需要)
"keyword-spacing": 2,
// 强制一行的最大长度
"max-len": [
1,
200
],
// 强制最大行数
"max-lines": 0,
// 强制 function 定义中最多允许的参数数量
"max-params": [
1,
7
],
// 强制 function 块最多允许的的语句数量
"max-statements": [
1,
200
],
// 强制每一行中所允许的最大语句数量
"max-statements-per-line": 0,
// 要求构造函数首字母大写 (要求调用 new 操作符时有首字母大小的函数,允许调用首字母大写的函数时没有 new 操作符。)
"new-cap": [
2,
{
"newIsCap": true,
"capIsNew": false
}
],
// 要求调用无参构造函数时有圆括号
"new-parens": 2,
// 要求或禁止 var 声明语句后有一行空行
"newline-after-var": 0,
// 禁止使用 Array 构造函数
"no-array-constructor": 2,
// 禁用按位运算符
"no-bitwise": 0,
// 要求 return 语句之前有一空行
"newline-before-return": 0,
// 要求方法链中每个调用都有一个换行符
"newline-per-chained-call": 1,
// 禁用 continue 语句
"no-continue": 0,
// 禁止在代码行后使用内联注释
"no-inline-comments": 0,
// 禁止 if 作为唯一的语句出现在 else 语句中
"no-lonely-if": 0,
// 禁止混合使用不同的操作符
"no-mixed-operators": 0,
// 不允许空格和 tab 混合缩进
"no-mixed-spaces-and-tabs": 2,
// 不允许多个空行
"no-multiple-empty-lines": [
2,
{
"max": 2
}
],
// 不允许否定的表达式
"no-negated-condition": 0,
// 不允许使用嵌套的三元表达式
"no-nested-ternary": 0,
// 禁止使用 Object 的构造函数
"no-new-object": 2,
// 禁止使用一元操作符 ++ 和 --
"no-plusplus": 0,
// 禁止使用特定的语法
"no-restricted-syntax": 0,
// 禁止 function 标识符和括号之间出现空格
"no-spaced-func": 2,
// 不允许使用三元操作符
"no-ternary": 0,
// 禁用行尾空格
"no-trailing-spaces": 2,
// 禁止标识符中有悬空下划线_bar
"no-underscore-dangle": 0,
// 禁止可以在有更简单的可替代的表达式时使用三元操作符
"no-unneeded-ternary": 2,
// 禁止属性前有空白
"no-whitespace-before-property": 0,
// 强制花括号内换行符的一致性
"object-curly-newline": 0,
// 强制在花括号中使用一致的空格
"object-curly-spacing": 0,
// 强制将对象的属性放在不同的行上
"object-property-newline": 0,
// 强制函数中的变量要么一起声明要么分开声明
"one-var": [
2,
{
"initialized": "never"
}
],
// 要求或禁止在 var 声明周围换行
"one-var-declaration-per-line": 0,
// 要求或禁止在可能的情况下要求使用简化的赋值操作符
"operator-assignment": 0,
// 强制操作符使用一致的换行符
"operator-linebreak": [
2,
"after",
{
"overrides": {
"?": "before",
":": "before"
}
}
],
// 要求或禁止块内填充
"padded-blocks": 0,
// 要求对象字面量属性名称用引号括起来
"quote-props": 0,
// 强制使用一致的反勾号、双引号或单引号
"quotes": [
2,
"double",
"avoid-escape"
],
// 要求使用 JSDoc 注释
"require-jsdoc": 1,
// 要求或禁止使用分号而不是 ASI(这个才是控制行尾部分号的,)
"semi": [
2,
"always"
],
// 强制分号之前和之后使用一致的空格
"semi-spacing": 0,
// 要求同一个声明块中的变量按顺序排列
"sort-vars": 0,
// 强制在块之前使用一致的空格
"space-before-blocks": [
2,
"always"
],
// 强制在 function的左括号之前使用一致的空格
"space-before-function-paren": [
0,
"always"
],
// 强制在圆括号内使用一致的空格
"space-in-parens": [
2,
"never"
],
// 要求操作符周围有空格
"space-infix-ops": 2,
// 强制在一元操作符前后使用一致的空格
"space-unary-ops": [
2,
{
"words": true,
"nonwords": false
}
],
// 强制在注释中 // 或 /* 使用一致的空格
"spaced-comment": [
2,
"always",
{
"markers": [
"global",
"globals",
"eslint",
"eslint-disable",
"*package",
"!"
]
}
],
// 要求或禁止 Unicode BOM
"unicode-bom": 0,
// 要求正则表达式被括号括起来
"wrap-regex": 0,
//////////////
// ES6.相关 //
//////////////
// 要求箭头函数体使用大括号
"arrow-body-style": 2,
// 要求箭头函数的参数使用圆括号
"arrow-parens": 2,
"arrow-spacing": [
2,
{
"before": true,
"after": true
}
],
// 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也会提示
"constructor-super": 0,
// 强制 generator 函数中 * 号周围使用一致的空格
"generator-star-spacing": [
2,
{
"before": true,
"after": true
}
],
// 禁止修改类声明的变量
"no-class-assign": 2,
// 不允许箭头功能,在那里他们可以混淆的比较
"no-confusing-arrow": 0,
// 禁止修改 const 声明的变量
"no-const-assign": 2,
// 禁止类成员中出现重复的名称
"no-dupe-class-members": 2,
// 不允许复制模块的进口
"no-duplicate-imports": 0,
// 禁止 Symbol 的构造函数
"no-new-symbol": 2,
// 允许指定模块加载时的进口
"no-restricted-imports": 0,
// 禁止在构造函数中,在调用 super() 之前使用 this 或 super
"no-this-before-super": 2,
// 禁止不必要的计算性能键对象的文字
"no-useless-computed-key": 0,
// 要求使用 let 或 const 而不是 var
"no-var": 0,
// 要求或禁止对象字面量中方法和属性使用简写语法
"object-shorthand": 0,
// 要求使用箭头函数作为回调
"prefer-arrow-callback": 0,
// 要求使用 const 声明那些声明后不再被修改的变量
"prefer-const": 0,
// 要求在合适的地方使用 Reflect 方法
"prefer-reflect": 0,
// 要求使用扩展运算符而非 .apply()
"prefer-spread": 0,
// 要求使用模板字面量而非字符串连接
"prefer-template": 0,
// Suggest using the rest parameters instead of arguments
"prefer-rest-params": 0,
// 要求generator 函数内有 yield
"require-yield": 0,
// enforce spacing between rest and spread operators and their expressions
"rest-spread-spacing": 0,
// 强制模块内的 import 排序
"sort-imports": 0,
// 要求或禁止模板字符串中的嵌入表达式周围空格的使用
"template-curly-spacing": 1,
// 强制在 yield* 表达式中 * 周围使用空格
"yield-star-spacing": 2
}
}
配置讲解
/**
* 参考文档
* 【eslint英文文档】https://eslint.org/docs/user-guide/configuring
* 【eslint中文文档】http://eslint.cn/docs/rules/
*/
/**
* eslint有三种使用方式
* 【1】js代码中通过注释的方式使用
* 【2】通过webpack的eslintConfig字段设置,eslint会自动搜索项目的package.json文件中的配置
* 【3】通过配置文件的方式使用,配置文件有多种文件方式,如JavaScript、JSON 或者 YAML等
*/
/**
* 文件忽略
* 【】让eslint跳过特定文件的检测
* 【】通过当前工作目录下 「.eslintignore」 文件进行设置
* 其使用的是Glob路径书写方式,与「.gitignore」的使用方法相同
* 【】也可以在 package.json 文件中,通过 eslintIgnore 参数进行设置
*/
/**
* 文件内局部设置
* 【】eslint可以具体文件中设置特定代码的规则,常用于跳过某条语句的检测。
* 【】注销全部规则,在代码前新建一行,添加注销 /* eslint-disable *\/ 。如果没有恢复设置的语句,则下列全部代码都会跳过检测。
* 【】恢复eslint,在代码前新建一行,添加注销 /* eslint-enable *\/
* 【】指定忽略的规则,/* eslint-disable no-alert, no-console *\/
* 【】在特定行禁用,// eslint-disable-line
* 【】在下一行禁用,// eslint-disable-next-line
*/
module.exports = {
/**
* 根目录标识
* http://eslint.cn/docs/user-guide/configuring#using-configuration-files
* http://eslint.cn/docs/user-guide/configuring#configuration-cascading-and-hierarchy
* 【】标识当前配置文件为最底层的文件,无需往更上一级的文件目录中进行搜索
* 【】默认eslint的配置文件搜索方式是,从目标文件夹进行搜索,遍历内部每一个文件夹,找到配置文件并层叠使用。再跳出本项目,往祖先文件夹进行遍历
* 【】注意「~/.eslintrc」的意义,「~」是指linux上的家目录,「~/.eslintrc」是指家目录下的eslint配置文件,用于私人开发者,用于整个电脑全局约束的。这个配置通过本配置项root去设置,设置了root,eslint检测时将不会再往上搜索
* 【】eslint的生效规则是就近使用,越近的配置项优先级越高,覆盖其他配置项。如一个项目中,可以在不同文件夹中都添加配置文件,这些规则将重叠组合生效
*/
root: true, // 标识当前配置文件为eslint的根配置文件,让其停止在父级目录中继续寻找。
/**
* 解析器
* http://eslint.cn/docs/user-guide/configuring#specifying-parser
* 【】ESLint 默认使用Espree作为其解析器
* 【】解析器必须是本地安装的一个 npm 模块。即必须按照在本地的node_module中
* 【】解析器是用于解析js代码的,怎么去理解每一个表达式,有点C++中编译器的概念,会对js进行一些语法分析,语义分析什么的,才能判断语句符不符合规范。而不是通过简单的字符串对比。
* 【】解析器有很多,但兼容eslint的解析器有以下几个
* Espree:默认解析器,一个从Esprima中分离出来的解析器,做了一些优化
* Esprima:js标准解析器
* Babel-ESLint: 一个对Babel解析器的包装,babel本身也是js解析器的一种(不然怎么能转化为兼容性代码呢?首先需要进行js解析,才能转化)。如果我们的代码需要经过babel转化,则对应使用这个解析器
* typescript-eslint-parser(实验) - 一个把 TypeScript 转换为 ESTree 兼容格式的解析器
* 【】但是通常在vue项目中,并不会写在 parser 字段中,而是写在 parserOptions -> parser。具体原因在 parserOptions 一栏中介绍
*/
// parser: 'babel-eslint',
/**
* 解析器配置项
* http://eslint.cn/docs/user-guide/configuring#specifying-parser-options
* 【】这里设置的配置项将会传递到解析器中,被解析器获取到,进行一定的处理。具体被利用到,要看解析器的源码有没有对其进行利用。这里仅仅做了参数定义,做了规定,告诉解析器的开发者可能有这些参数
* 【】配置项目有:
* "sourceType": "module", // 指定JS代码来源的类型,script(script标签引入?) | module(es6的module模块),默认为script。为什么vue的会使用script呢?因为vue是通过babel-loader编译的,而babel编译后的代码就是script方式
* "ecmaVersion": 6, // 支持的ES语法版本,默认为5。注意只是语法,不包括ES的全局变量。全局变量需要在env选项中进行定义
* "ecmaFeatures": { // Features是特征的意思,这里用于指定要使用其他那些语言对象
"experimentalObjectRestSpread": true, //启用对对象的扩展
"jsx": true, //启用jsx语法
"globalReturn":true, //允许return在全局使用
"impliedStrict":true //启用严格校验模式
}
*/
parserOptions: {
/**
* 这里出现 parser 的原因
* 【】首先明确一点,官方说明中,parserOptions的配置参数是不包括 parser 的
* 【】这里的写 parser 是 eslint-plugin-vue 的要求,是 eslint-plugin-vue 的自定义参数
* 【】根据官方文档,eslint-plugin-vue 插件依赖 「vue-eslint-parser」解析器。「vue-eslint-parser」解析器,只解析 .vue 中html部分的内容,不会检测<script>中的JS内容。
* 【】由于解析器只有一个,用了「vue-eslint-parser」就不能用「babel-eslint」。所以「vue-eslint-parser」的做法是,在解析器选项中,再传入一个解析器选项parser。从而在内部处理「babel-eslint」,检测<script>中的js代码
* 【】所以这里出现了 parser
* 【】相关文档地址,https://vuejs.github.io/eslint-plugin-vue/user-guide/#usage
*/
parser: 'babel-eslint',
},
/**
* 运行环境
* http://eslint.cn/docs/user-guide/configuring#specifying-environments
* 【】一个环境定义了一组预定义的全局变量
* 【】获得了特定环境的全局定义,就不会认为是开发定义的,跳过对其的定义检测。否则会被认为改变量未定义
* 【】常见的运行环境有以下这些,更多的可查看官网
* browser - 浏览器环境中的全局变量。
* node - Node.js 全局变量和 Node.js 作用域。
* es6 - 启用除了 modules 以外的所有 ECMAScript 6 特性(该选项会自动设置 ecmaVersion 解析器选项为 6)。
* amd - 将 require() 和 define() 定义为像 amd 一样的全局变量。
* commonjs - CommonJS 全局变量和 CommonJS 作用域 (用于 Browserify/WebPack 打包的只在浏览器中运行的代码)。
* jquery - jQuery 全局变量。
* mongo - MongoDB 全局变量。
* worker - Web Workers 全局变量。
* serviceworker - Service Worker 全局变量。
*/
env: {
browser: true, // 浏览器环境
},
/**
* 全局变量
* http://eslint.cn/docs/user-guide/configuring#specifying-globals
* 【】定义额外的全局,开发者自定义的全局变量,让其跳过no-undef 规则
* 【】key值就是额外添加的全局变量
* 【】value值用于标识该变量能否被重写,类似于const的作用。true为允许变量被重写
* 【】注意:要启用no-global-assign规则来禁止对只读的全局变量进行修改。
*/
globals: {
// gTool: true, // 例如定义gTool这个全局变量,且这个变量可以被重写
},
/**
* 插件
* http://eslint.cn/docs/user-guide/configuring#configuring-plugins
* 【】插件同样需要在node_module中下载
* 【】注意插件名忽略了「eslint-plugin-」前缀,所以在package.json中,对应的项目名是「eslint-plugin-vue」
* 【】插件的作用类似于解析器,用以扩展解析器的功能,用于检测非常规的js代码。也可能会新增一些特定的规则。
* 【】如 eslint-plugin-vue,是为了帮助我们检测.vue文件中 <template> 和 <script> 中的js代码
*/
plugins: ['vue'],
/**
* 规则继承
* http://eslint.cn/docs/user-guide/configuring#extending-configuration-files
*【】可继承的方式有以下几种
*【】eslint内置推荐规则,就只有一个,即「eslint:recommended」
*【】可共享的配置, 是一个 npm 包,它输出一个配置对象。即通过npm安装到node_module中
* 可共享的配置可以省略包名的前缀 eslint-config-,即实际设置安装的包名是 eslint-config-airbnb-base
*【】从插件中获取的规则,书写规则为 「plugin:插件包名/配置名」,其中插件报名也是可以忽略「eslint-plugin-」前缀。如'plugin:vue/essential'
*【】从配置文件中继承,即继承另外的一个配置文件,如'./node_modules/coding-standard/eslintDefaults.js'
*/
extends: [
/**
* vue 的额外添加的规则是 v-if, v-else 等指令检测
*/
'plugin:vue/essential', // 额外添加的规则可查看 https://vuejs.github.io/eslint-plugin-vue/rules/
/**
* 「airbnb,爱彼迎」
* 【】有两种eslint规范,一种是自带了react插件的「eslint-config-airbnb」,一种是基础款「eslint-config-airbnb-base」,
* 【】airbnb-base 包括了ES6的语法检测,需要依赖 「eslint-plugin-import」
* 【】所以在使用airbnb-base时,需要用npm额外下载 eslint-plugin-import
* 【】所以eslint实际上已经因为 airbnb-base 基础配置项目,添加上了 eslint-plugin-import 插件配置
* 【】所以在setting和rules里,都有 'import/xxx' 项目,这里修改的就是 eslint-plugin-import 配置
*/
// 'airbnb-base',
],
/**
* 规则共享参数
* http://eslint.cn/docs/user-guide/configuring#adding-shared-settings
* 【】提供给具体规则项,每个参数值,每个规则项都会被注入该变量,但对应规则而言,有没有用,就看各个规则的设置了,就好比 parserOptions,解析器用不用它就不知道了。这里只是提供这个方法
* 【】不用怀疑,经源码验证,这就是传递给每个规则项的,会当做参数传递过去,但用不用,就是具体规则的事情
*/
settings: {
/**
*
* 注意,「import/resolver」并不是eslint规则项,与rules中的「import/extensions」不同。它不是规则项
* 这里只是一个参数名,叫「import/resolver」,会传递给每个规则项。
* settings并没有具体的书写规则,「import/」只是import模块自己起的名字,原则上,它直接命名为「resolver」也可以,加上「import」只是为了更好地区分。不是强制设置的。
* 因为「import」插件很多规则项都用的这个配置项,所以并没有通过rules设置,而是通过settings共享
* 具体使用方法可参考https://github.com/benmosher/eslint-plugin-import
*/
'import/resolver': {
/**
* 这里传入webpack并不是import插件能识别webpack,而且通过npm安装了「eslint-import-resolver-webpack」,
* 「import」插件通过「eslint-import-resolver-」+「webpack」找到该插件并使用,就能解析webpack配置项。使用里面的参数。
* 主要是使用以下这些参数,共享给import规则,让其正确识别import路径
* extensions: ['.js', '.vue', '.json'],
* alias: {
* 'vue$': 'vue/dist/vue.esm.js',
* '@': resolve('src'),
* 'static': resolve('static')
* }
*/
webpack: {
config: 'build/webpack.base.conf.js'
}
}
},
/**
* 针对特定文件的配置
* 【】可以通过overrides对特定文件进行特定的eslint检测
* 【】特定文件的路径书写使用Glob格式,一个类似正则的路径规则,可以匹配不同的文件
* 【】配置几乎与 ESLint 的其他配置相同。覆盖块可以包含常规配置中的除了 extends、overrides 和 root 之外的其他任何有效配置选项,
*/
// overrides: [
// {
// 'files': ['bin/*.js', 'lib/*.js'],
// 'excludedFiles': '*.test.js',
// 'rules': {
// 'quotes': [2, 'single']
// }
// }
// ],
/**
* 自定义规则
* http://eslint.cn/docs/user-guide/configuring#configuring-rules
* 【】基本使用方式
* "off" 或者0 关闭规则
* "warn" 或者1 将规则打开为警告(不影响退出代码)
* "error" 或者2 将规则打开为错误(触发时退出代码为1)
* 如:'no-restricted-syntax': 0, // 表示关闭该规则
* 【】如果某项规则,有额外的选项,可以通过数组进行传递,而数组的第一位必须是错误级别。如0,1,2
* 如 'semi': ['error', 'never'], never就是额外的配置项
*/
rules: {
/**
* 具体规则
* 【】具体的规则太多,就不做介绍了,有兴趣的同学可以上eslint官网查
* 【】注意 xxx/aaa 这些规则是 xxx 插件自定的规则,在eslint官网是查不到的。需要到相应的插件官网中查阅
* 【】如 import/extensions,这是「eslint-plugin-import」自定义的规则,需要到其官网查看 https://github.com/benmosher/eslint-plugin-import
*/
/**
* 逻辑错误及最佳实践的规则
*/
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止debugger
'no-console': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止console
'no-alert': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止console
"for-direction": 2, // 禁止for无限循环
"no-compare-neg-zero": 2, // 禁止与-0进行比较
'no-cond-assign': 2, // 禁止条件语句中出现赋值语句
"no-control-regex": 2, // 在 ASCII 中,0-31 范围内的控制字符是特殊的、不可见的字符。这些字符很少被用在 JavaScript 字符串中,所以一个正则表达式如果包含这些字符的,很有可能一个错误。
"no-dupe-args": 2, // 禁止在函数定义或表达中出现重名参数
"no-dupe-keys": 2, // 禁止在对象字面量中出现重复的键
"no-duplicate-case": 2, // 禁止重复 case 标签
"no-empty": 2, // 禁止空块语句
"no-empty-character-class": 2, // 禁止在正则表达式中出现空字符集
"no-ex-assign": 2, // 禁止对 catch 子句中的异常重新赋值。因为catch出来的都是错误信息,不需要重新赋值
"no-extra-boolean-cast": 2, // 禁止不必要的布尔类型转换,如 !!true
"no-extra-semi": 2, // 禁用不必要的分号
"no-inner-declarations": 2, // ??? 禁止在嵌套的语句块中出现变量
"no-regex-spaces": 2, // 禁止正则表达式字面量中出现多个空格
"no-obj-calls": 2, // 禁止将全局对象当作函数进行调用
"no-prototype-builtins": 2, // ??? 禁止直接在对象实例上调用 Object.prototype 的一些方法。
"no-template-curly-in-string": 2, // 禁止在常规字符串中出现模板字面量占位符语法
"semi": [2, 'never'], // ??? 强制是否使用分号。
"no-unexpected-multiline": 2, // 禁止使用令人困惑的多行表达式
"no-unreachable": 2, // 禁止在 return、throw、continue 和 break 语句后出现不可达代码
"use-isnan": 2, // 要求调用 isNaN()检查 NaN
"no-unsafe-negation": 2, // 禁止对关系运算符的左操作数使用否定操作符
"valid-jsdoc": 2, // 强制使用有效的 JSDoc 注释
"valid-typeof": 2, // 强制 typeof 表达式与有效的字符串进行比较
"array-callback-return": 2, // 强制数组方法的回调函数中有 return 语句
"block-scoped-var": 2, // 把 var 语句看作是在块级作用域范围之内
"complexity": [1, 6], // 添加复杂度
"curly": 2, // ??? 要求遵循大括号约定
"default-case": 1, // 要求 Switch 语句中有 Default 分支
"dot-location": [2, 'property'], // 强制在点号之前换行
"dot-notation": 2, // 点号和字面量,优先使用点号
"eqeqeq": [2, 'smart'], // ??? 要求使用 === 和 !==
"guard-for-in": 2, // ??? 需要约束 for-in
"no-caller": 2, // 禁用 caller 或 callee
"no-empty-function": 2, // 禁止出现空函数
"no-empty-pattern": 2, // 禁止使用空解构模式
"no-eval": 2, // 禁用 eval()
"no-global-assign": 2, // 禁止对原生对象或只读的全局对象进行赋值
"no-floating-decimal": 2, // ?? 禁止浮点小数
"no-fallthrough": 2, // 禁止 case 语句落空
"no-labels": 2, // 禁用标签语句
"no-extra-label": 2, // 禁用不必要的标签
"no-extra-bind": 2, // 禁止不必要的函数绑定
"no-iterator": 2, // 禁用迭代器
"no-lone-blocks": 2, // 禁用不必要的嵌套块
"no-loop-func": 2, // 禁止循环中存在函数
"no-magic-numbers": [2, {
ignoreArrayIndexes: true,
ignore: [-1, 0, 1, 2],
}], // 禁止使用魔术数字,魔术数字是在代码中多次出现的没有明确含义的数字。它最好由命名常量取代。
"no-multi-spaces": 2, // 禁止出现多个空格
"no-multi-str": 2, // 禁止多行字符串
"no-new": 2, // 禁止在不保存实例的情况下使用new
"no-new-func": 2, // 禁用Function构造函数
"no-new-wrappers": 2, // 禁止原始包装实例
"no-octal": 2, // 禁用八进制字面量
"no-octal-escape": 2, // 禁止在字符串字面量中使用八进制转义序列
"no-param-reassign": 2, // ??? 禁止对函数参数再赋值
"no-proto": 2, // 禁用__proto__,改用 getPrototypeOf 方法替代 __proto__。
"no-redeclare": 2, // 禁止重新声明变量
"no-return-assign": 2, // 禁止在返回语句中赋值
"no-return-await": 2, // 禁用不必要的 return await
"no-script-url": 2, // 禁用 Script URL
"no-self-assign": 2, // 禁止自身赋值
"no-sequences": 2, // ??? 不允许使用逗号操作符
"no-throw-literal": 2, // 限制可以被抛出的异常
"no-unmodified-loop-condition": 2, // 禁用一成不变的循环条件
"no-useless-call": 2, // 禁用不必要的 .call() 和 .apply()
"no-useless-concat": 2, // 禁止没有必要的字符拼接
"no-useless-escape": 2, // 禁用不必要的转义
"no-useless-return": 2, // 禁止多余的 return 语句
"no-void": 2, // 禁止使用void操作符
"no-with": 2, // 禁用 with 语句
"prefer-promise-reject-errors": 1, // ??? 要求使用 Error 对象作为 Promise 拒绝的原因
"radix": 1, // 要求必须有基数
"require-await": 2, // 禁止使用不带 await 表达式的 async 函数
"vars-on-top": 2, // 要求将变量声明放在它们作用域的顶部
"wrap-iife": [2, 'inside'], // 需要把立即执行的函数包裹起来
"strict": [2, 'global'], // 要求或禁止使用严格模式指令
/**
* 变量相关的规则
*/
"init-declarations": 2, // ??? 强制或禁止变量声明语句中初始化
"no-delete-var": 2, // 禁止删除变量
"no-shadow": 2, // 禁止变量声明覆盖外层作用域的变量
"no-shadow-restricted-names": 2, // 关键字不能被遮蔽
"no-undef": 2, // 禁用未声明的变量
"no-unused-vars": 1, // ??? 禁止未使用过的变量
"no-use-before-define": 2, // 禁止定义前使用
// 代码风格
"array-bracket-newline": [2, 'consistent'], // 在数组开括号后和闭括号前强制换行
"array-bracket-spacing": 2, // 强制在括号内前后使用空格
"array-element-newline": [2, { multiline: true }], // ??? 强制数组元素间出现换行
"block-spacing": 2, // 强制在代码块中开括号前和闭括号后有空格
"brace-style": 2, // 大括号风格要求
"camelcase": 2, // 要求使用骆驼拼写法
"comma-dangle": [2, 'always-multiline'], // 要求或禁止使用拖尾逗号
"comma-spacing": 2, // 强制在逗号周围使用空格
"comma-style": 2, // 逗号风格
"computed-property-spacing": 2, // 禁止或强制在计算属性中使用空格
"consistent-this": [2, 'self'], // ??? 要求一致的 This
"eol-last": [1, 'always'], // ??? 要求或禁止文件末尾保留一行空行
"func-call-spacing": 2, // 要求或禁止在函数标识符和其调用之间有空格
"func-style": [2, 'declaration'], // ??? 强制 function 声明或表达式的一致性
"function-paren-newline": [1, 'multiline'], // 强制在函数括号内使用一致的换行
"indent": [2, 2], // 强制使用一致的缩进
"jsx-quotes": 2, // 强制在 JSX 属性中一致地使用双引号或单引号
"key-spacing": 2, // 强制在对象字面量的键和值之间使用一致的空格
"keyword-spacing": 2, // 强制关键字周围空格的一致性
"linebreak-style": 2, // 强制使用一致的换行符风格,用\n,不用\r\n
"lines-around-comment": 2, // 强制注释周围有空行
"lines-between-class-members": 2, // 要求在类成员之间出现空行
"max-depth": 2, // 强制块语句的最大可嵌套深度
"max-len": [2, { // 强制行的最大长度
"code": 100,
"tabWidth": 4,
"ignoreUrls": true,
"ignoreTrailingComments": true,
"ignoreTemplateLiterals": true,
}], //
"max-lines": [2, 1000], // ??? 强制文件的最大行数
"max-nested-callbacks": [2, 5], // 强制回调函数最大嵌套深度
"max-statements-per-line": 2, // 强制每一行中所允许的最大语句数量
"multiline-comment-style": 1, // 强制对多行注释使用特定风格
"new-cap": 2, // 要求构造函数首字母大写
"new-parens": 2, // 要求调用无参构造函数时带括号
"newline-per-chained-call": 2, // 要求方法链中每个调用都有一个换行符
"no-bitwise": 2, // 禁止使用按位操作符
"no-inline-comments": 0, // ??? 禁止使用内联注释
"no-lonely-if": 2, // 禁止 if 语句作为唯一语句出现在 else 语句块中
"no-mixed-spaces-and-tabs": 2, // 禁止使用 空格 和 tab 混合缩进
"no-multiple-empty-lines": 1, // ??? 不允许多个空行
"no-negated-condition": 2, // 禁用否定表达式
"no-nested-ternary": 2, // 禁止使用嵌套的三元表达式
"no-new-object": 2, // 禁止使用 Object 构造函数
"no-trailing-spaces": 2, // 禁用行尾空白
"no-underscore-dangle": 2, // 禁止标识符中有悬空下划线
"quotes": [2, 'single'], // 强制使用一致的单引号
"quote-props": [2, 'as-needed'], // ??? 要求对象字面量属性名称使用引号
"operator-linebreak": [2, 'before'], // 强制操作符使用一致的换行符风格
"one-var": [2, 'never'], // ??? 强制函数中的变量在一起声明或分开声明
"object-property-newline": 1, // ??? 强制将对象的属性放在不同的行上
"object-curly-spacing": [2, 'always'], // 强制在花括号中使用一致的空格
"object-curly-newline": [1, { // ??? 对象属性换行
multiline: true,
}], //
"no-whitespace-before-property": 2, // 禁止属性前有空白
"no-unneeded-ternary": 2, // 禁止可以表达为更简单结构的三元操作符
"semi-spacing": 2, // 强制分号前后有空格
"semi-style": 2, // 分号风格
"space-before-blocks": [2, 'always'], // 禁止语句块之前的空格
"space-before-function-paren": [2, 'never'], // 禁止函数圆括号之前有一个空格
"space-in-parens": 2, // 禁止或强制圆括号内的空格
"space-infix-ops": 2, // 要求中缀操作符周围有空格
"space-unary-ops": 2, // 禁止在一元操作符之前或之后存在空格
"spaced-comment": 2, // 要求在注释前有空白
"switch-colon-spacing": 2, // 强制在 switch 的冒号左右有空格
"template-tag-spacing": 2, // 要求在模板标记和它们的字面量之间有空格
/**
* ES6相关规则
*/
"arrow-parens": [2, 'as-needed'], // 要求箭头函数的参数使用圆括号
"arrow-body-style": 2, // 要求箭头函数体使用大括号
"arrow-spacing": 2, // 要求箭头函数的箭头之前或之后有空格
"generator-star-spacing": 2, // ??? 强制 generator 函数中 * 号周围有空格
"no-class-assign": 2, // 不允许修改类声明的变量
"no-confusing-arrow": 2, // 禁止在可能与比较操作符相混淆的地方使用箭头函数
"no-const-assign": 2, // 不允许改变用const声明的变量
"no-dupe-class-members": 2, // 不允许类成员中有重复的名称
"no-duplicate-imports": 2, // 禁止重复导入
"no-new-symbol": 0, // 禁止 Symbol 操作符和 new 一起使用lines-between
"no-useless-computed-key": 2, // 禁止在对象中使用不必要的计算属性
"no-useless-constructor": 2, // 禁用不必要的构造函数
"no-useless-rename": 2, // 禁止在 import 和 export 和解构赋值时将引用重命名为相同的名字
"no-var": 2, // 要求使用 let 或 const 而不是 var
"object-shorthand": 2, // 要求对象字面量简写语法
"prefer-arrow-callback": 2, // 要求使用箭头函数作为回调
"prefer-const": 1, // ??? 建议使用const
"prefer-destructuring": [2, { // 优先使用数组和对象解构
"array": false,
"object": true
}],
"prefer-rest-params": 2, // 使用剩余参数代替 arguments
"prefer-spread": 2, // 建议使用扩展运算符而非.apply()
"prefer-template": 2, // 建议使用模板而非字符串连接
"require-yield": 2, // 禁用函数内没有yield的 generator 函数
"rest-spread-spacing": 2, // 强制剩余和扩展运算符及其表达式之间有空格
"template-curly-spacing": 2, // 强制模板字符串中空格的使用
"sort-imports": [0, { // ??? import 排序 问题是要以字母排序
ignoreCase: true,
ignoreMemberSort: true,
memberSyntaxSortOrder: ['all', 'single', 'multiple', 'none']
}], //
}
};