关于 ESLint 介绍,以及在项目中如何配置,请参考WebStorm + React 项目,配置 ESLint

配置文件

ESLint 支持几种格式的配置文件,如果同一个目录下有多个配置文件,ESLint 只会使用一个。优先级顺序如下:

  • JavaScript - 使用 .eslintrc.js 然后输出一个配置对象。
  • YAML - 使用 .eslintrc.yaml.eslintrc.yml 去定义配置的结构。
  • JSON -使用 .eslintrc.json 去定义配置的结构,ESLintJSON 文件允许 JavaScript 风格的注释。
  • Deprecated -使用 .eslintrc,可以使 JSON 也可以是 YAML。
  • package.json - 在 package.json 里创建一个 eslintConfig 属性,在那里定义你的配置。

    配置规则格式

    规则格式是<规则名称>: <告警级别>,告警级别分为三种:
  1. “0”表示忽略问题,等同于”off”;
  2. “1”表示给出警告,等同于”warn”;
  3. “2”表示直接报错,等同于”error”。

    详细规则说明

  • eslint-plugin-react 规则

    1. /**
    2. * AlloyTeam ESLint 规则 - React
    3. *
    4. * 包含所有 ESLint 规则,以及所有 eslint-plugin-react 规则
    5. * 使用 babel-eslint 作为解析器
    6. *
    7. * @fixable 表示此配置支持 --fix
    8. * @off 表示此配置被关闭了,并且后面说明了关闭的原因
    9. */
    10. module.exports = {
    11. extends: [
    12. './index.js',
    13. ],
    14. plugins: [
    15. 'react'
    16. ],
    17. rules: {
    18. // 布尔值类型的 propTypes 的 name 必须为 is 或 has 开头
    19. // @off 不强制要求写 propTypes
    20. 'react/boolean-prop-naming': 'off',
    21. // 一个 defaultProps 必须有对应的 propTypes
    22. // @off 不强制要求写 propTypes
    23. 'react/default-props-match-prop-types': 'off',
    24. // 组件必须有 displayName 属性
    25. // @off 不强制要求写 displayName
    26. 'react/display-name': 'off',
    27. // 禁止在自定义组件中使用一些指定的 props
    28. // @off 没必要限制
    29. 'react/forbid-component-props': 'off',
    30. // 禁止使用一些指定的 elements
    31. // @off 没必要限制
    32. 'react/forbid-elements': 'off',
    33. // 禁止使用一些指定的 propTypes
    34. // @off 不强制要求写 propTypes
    35. 'react/forbid-prop-types': 'off',
    36. // 禁止直接使用别的组建的 propTypes
    37. // @off 不强制要求写 propTypes
    38. 'react/forbid-foreign-prop-types': 'off',
    39. // 禁止使用数组的 index 作为 key
    40. // @off 太严格了
    41. 'react/no-array-index-key': 'off',
    42. // 禁止使用 children 做 props
    43. 'react/no-children-prop': 'error',
    44. // 禁止使用 dangerouslySetInnerHTML
    45. // @off 没必要限制
    46. 'react/no-danger': 'off',
    47. // 禁止在使用了 dangerouslySetInnerHTML 的组建内添加 children
    48. 'react/no-danger-with-children': 'error',
    49. // 禁止使用已废弃的 api
    50. 'react/no-deprecated': 'error',
    51. // 禁止在 componentDidMount 里面使用 setState
    52. // @off 同构应用需要在 didMount 里写 setState
    53. 'react/no-did-mount-set-state': 'off',
    54. // 禁止在 componentDidUpdate 里面使用 setState
    55. 'react/no-did-update-set-state': 'error',
    56. // 禁止直接修改 this.state
    57. 'react/no-direct-mutation-state': 'error',
    58. // 禁止使用 findDOMNode
    59. 'react/no-find-dom-node': 'error',
    60. // 禁止使用 isMounted
    61. 'react/no-is-mounted': 'error',
    62. // 禁止在一个文件创建两个组件
    63. // @off 有一个 bug https://github.com/yannickcr/eslint-plugin-react/issues/1181
    64. 'react/no-multi-comp': 'off',
    65. // 禁止在 PureComponent 中使用 shouldComponentUpdate
    66. 'react/no-redundant-should-component-update': 'error',
    67. // 禁止使用 ReactDOM.render 的返回值
    68. 'react/no-render-return-value': 'error',
    69. // 禁止使用 setState
    70. // @off setState 很常用
    71. 'react/no-set-state': 'off',
    72. // 禁止拼写错误
    73. 'react/no-typos': 'error',
    74. // 禁止使用字符串 ref
    75. 'react/no-string-refs': 'error',
    76. // 禁止在组件的内部存在未转义的 >, ", ' 或 }
    77. 'react/no-unescaped-entities': 'error',
    78. // @fixable 禁止出现 HTML 中的属性,如 class
    79. 'react/no-unknown-property': 'error',
    80. // 禁止出现未使用的 propTypes
    81. // @off 不强制要求写 propTypes
    82. 'react/no-unused-prop-types': 'off',
    83. // 定义过的 state 必须使用
    84. // @off 没有官方文档,并且存在很多 bug: https://github.com/yannickcr/eslint-plugin-react/search?q=no-unused-state&type=Issues&utf8=%E2%9C%93
    85. 'react/no-unused-state': 'off',
    86. // 禁止在 componentWillUpdate 中使用 setState
    87. 'react/no-will-update-set-state': 'error',
    88. // 必须使用 Class 的形式创建组件
    89. 'react/prefer-es6-class': [
    90. 'error',
    91. 'always'
    92. ],
    93. // 必须使用 pure function
    94. // @off 没必要限制
    95. 'react/prefer-stateless-function': 'off',
    96. // 组件必须写 propTypes
    97. // @off 不强制要求写 propTypes
    98. 'react/prop-types': 'off',
    99. // 出现 jsx 的地方必须 import React
    100. // @off 已经在 no-undef 中限制了
    101. 'react/react-in-jsx-scope': 'off',
    102. // 非 required 的 prop 必须有 defaultProps
    103. // @off 不强制要求写 propTypes
    104. 'react/require-default-props': 'off',
    105. // 组件必须有 shouldComponentUpdate
    106. // @off 没必要限制
    107. 'react/require-optimization': 'off',
    108. // render 方法中必须有返回值
    109. 'react/require-render-return': 'error',
    110. // @fixable 组件内没有 children 时,必须使用自闭和写法
    111. // @off 没必要限制
    112. 'react/self-closing-comp': 'off',
    113. // @fixable 组件内方法必须按照一定规则排序
    114. 'react/sort-comp': 'error',
    115. // propTypes 的熟悉必须按照字母排序
    116. // @off 没必要限制
    117. 'react/sort-prop-types': 'off',
    118. // style 属性的取值必须是 object
    119. 'react/style-prop-object': 'error',
    120. // HTML 中的自闭和标签禁止有 children
    121. 'react/void-dom-elements-no-children': 'error',
    122. // @fixable 布尔值的属性必须显式的写 someprop={true}
    123. // @off 没必要限制
    124. 'react/jsx-boolean-value': 'off',
    125. // @fixable 自闭和标签的反尖括号必须与尖括号的那一行对齐
    126. 'react/jsx-closing-bracket-location': [
    127. 'error',
    128. {
    129. nonEmpty: false,
    130. selfClosing: 'line-aligned'
    131. }
    132. ],
    133. // @fixable 结束标签必须与开始标签的那一行对齐
    134. // @off 已经在 jsx-indent 中限制了
    135. 'react/jsx-closing-tag-location': 'off',
    136. // @fixable 大括号内前后禁止有空格
    137. 'react/jsx-curly-spacing': [
    138. 'error',
    139. {
    140. when: 'never',
    141. attributes: {
    142. allowMultiline: true
    143. },
    144. children: true,
    145. spacing: {
    146. objectLiterals: 'never'
    147. }
    148. }
    149. ],
    150. // @fixable props 与 value 之间的等号前后禁止有空格
    151. 'react/jsx-equals-spacing': [
    152. 'error',
    153. 'never'
    154. ],
    155. // 限制文件后缀
    156. // @off 没必要限制
    157. 'react/jsx-filename-extension': 'off',
    158. // @fixable 第一个 prop 必须得换行
    159. // @off 没必要限制
    160. 'react/jsx-first-prop-new-line': 'off',
    161. // handler 的名称必须是 onXXX 或 handleXXX
    162. // @off 没必要限制
    163. 'react/jsx-handler-names': 'off',
    164. // @fixable jsx 的 children 缩进必须为四个空格
    165. 'react/jsx-indent': [
    166. 'error',
    167. 4
    168. ],
    169. // @fixable jsx 的 props 缩进必须为四个空格
    170. 'react/jsx-indent-props': [
    171. 'error',
    172. 4
    173. ],
    174. // 数组中的 jsx 必须有 key
    175. 'react/jsx-key': 'error',
    176. // @fixable 限制每行的 props 数量
    177. // @off 没必要限制
    178. 'react/jsx-max-props-per-line': 'off',
    179. // jsx 中禁止使用 bind
    180. // @off 太严格了
    181. 'react/jsx-no-bind': 'off',
    182. // 禁止在 jsx 中使用像注释的字符串
    183. 'react/jsx-no-comment-textnodes': 'error',
    184. // 禁止出现重复的 props
    185. 'react/jsx-no-duplicate-props': 'error',
    186. // 禁止在 jsx 中出现字符串
    187. // @off 没必要限制
    188. 'react/jsx-no-literals': 'off',
    189. // 禁止使用 target="_blank"
    190. // @off 没必要限制
    191. 'react/jsx-no-target-blank': 'off',
    192. // 禁止使用未定义的 jsx elemet
    193. 'react/jsx-no-undef': 'error',
    194. // 禁止使用 pascal 写法的 jsx,比如 <TEST_COMPONENT>
    195. 'react/jsx-pascal-case': 'error',
    196. // @fixable props 必须排好序
    197. // @off 没必要限制
    198. 'react/jsx-sort-props': 'off',
    199. // @fixable jsx 的开始和闭合处禁止有空格
    200. 'react/jsx-tag-spacing': [
    201. 'error',
    202. {
    203. closingSlash: 'never',
    204. beforeSelfClosing: 'always',
    205. afterOpening: 'never'
    206. }
    207. ],
    208. // jsx 文件必须 import React
    209. 'react/jsx-uses-react': 'error',
    210. // 定义了的 jsx element 必须使用
    211. 'react/jsx-uses-vars': 'error',
    212. // @fixable 多行的 jsx 必须有括号包起来
    213. // @off 没必要限制
    214. 'react/jsx-wrap-multilines': 'off'
    215. }
    216. };
  • ESLint 标准规则

    1. /**
    2. * AlloyTeam ESLint 规则
    3. *
    4. * 包含所有 ESLint 规则
    5. * 使用 babel-eslint 作为解析器
    6. *
    7. * @fixable 表示此配置支持 --fix
    8. * @off 表示此配置被关闭了,并且后面说明了关闭的原因
    9. */
    10. module.exports = {
    11. parser: 'babel-eslint',
    12. parserOptions: {
    13. ecmaVersion: 2017,
    14. sourceType: 'module',
    15. ecmaFeatures: {
    16. // @TODO Deprecated https://eslint.org/docs/user-guide/configuring#deprecated
    17. experimentalObjectRestSpread: true,
    18. jsx: true,
    19. modules: true
    20. }
    21. },
    22. env: {
    23. browser: true,
    24. node: true,
    25. commonjs: true,
    26. es6: true
    27. },
    28. // 以当前目录为根目录,不再向上查找 .eslintrc.js
    29. root: true,
    30. rules: {
    31. //
    32. //
    33. // 可能的错误
    34. // 这些规则与 JavaScript 代码中可能的语法错误或逻辑错误有关
    35. //
    36. // 禁止 for 循环出现方向错误的循环,比如 for (i = 0; i < 10; i--)
    37. 'for-direction': 'error',
    38. // getter 必须有返回值,并且禁止返回空,比如 return;
    39. 'getter-return': [
    40. 'error',
    41. {
    42. allowImplicit: false
    43. }
    44. ],
    45. // 禁止将 await 写在循环里,因为这样就无法同时发送多个异步请求了
    46. // @off 要求太严格了,有时需要在循环中写 await
    47. 'no-await-in-loop': 'off',
    48. // 禁止与负零进行比较
    49. 'no-compare-neg-zero': 'error',
    50. // 禁止在测试表达式中使用赋值语句,除非这个赋值语句被括号包起来了
    51. 'no-cond-assign': [
    52. 'error',
    53. 'except-parens'
    54. ],
    55. // 禁止使用 console
    56. // @off console 的使用很常见
    57. 'no-console': 'off',
    58. // 禁止将常量作为分支条件判断中的测试表达式,但允许作为循环条件判断中的测试表达式
    59. 'no-constant-condition': [
    60. 'error',
    61. {
    62. checkLoops: false
    63. }
    64. ],
    65. // 禁止在正则表达式中出现 Ctrl 键的 ASCII 表示,即禁止使用 /\x1f/
    66. // @off 几乎不会遇到这种场景
    67. 'no-control-regex': 'off',
    68. // @fixable 禁止使用 debugger
    69. 'no-debugger': 'error',
    70. // 禁止在函数参数中出现重复名称的参数
    71. 'no-dupe-args': 'error',
    72. // 禁止在对象字面量中出现重复名称的键名
    73. 'no-dupe-keys': 'error',
    74. // 禁止在 switch 语句中出现重复测试表达式的 case
    75. 'no-duplicate-case': 'error',
    76. // 禁止出现空代码块,允许 catch 为空代码块
    77. 'no-empty': [
    78. 'error',
    79. {
    80. allowEmptyCatch: true
    81. }
    82. ],
    83. // 禁止在正则表达式中使用空的字符集 []
    84. 'no-empty-character-class': 'error',
    85. // 禁止将 catch 的第一个参数 error 重新赋值
    86. 'no-ex-assign': 'error',
    87. // @fixable 禁止不必要的布尔类型转换,比如 !! 或 Boolean
    88. 'no-extra-boolean-cast': 'error',
    89. // @fixable 禁止函数表达式中出现多余的括号,比如 let foo = (function () { return 1 })
    90. 'no-extra-parens': [
    91. 'error',
    92. 'functions'
    93. ],
    94. // @fixable 禁止出现多余的分号
    95. 'no-extra-semi': 'error',
    96. // 禁止将一个函数声明重新赋值,如:
    97. // function foo() {}
    98. // foo = bar
    99. 'no-func-assign': 'error',
    100. // 禁止在 if 代码块内出现函数声明
    101. 'no-inner-declarations': [
    102. 'error',
    103. 'both'
    104. ],
    105. // 禁止在 RegExp 构造函数中出现非法的正则表达式
    106. 'no-invalid-regexp': 'error',
    107. // 禁止使用特殊空白符(比如全角空格),除非是出现在字符串、正则表达式或模版字符串中
    108. 'no-irregular-whitespace': [
    109. 'error',
    110. {
    111. skipStrings: true,
    112. skipComments: false,
    113. skipRegExps: true,
    114. skipTemplates: true
    115. }
    116. ],
    117. // 禁止将 Math, JSON 或 Reflect 直接作为函数调用
    118. 'no-obj-calls': 'error',
    119. // 禁止使用 hasOwnProperty, isPrototypeOf 或 propertyIsEnumerable
    120. // @off hasOwnProperty 比较常用
    121. 'no-prototype-builtins': 'off',
    122. // @fixable 禁止在正则表达式中出现连续的空格,必须使用 /foo {3}bar/ 代替
    123. 'no-regex-spaces': 'error',
    124. // 禁止在数组中出现连续的逗号,如 let foo = [,,]
    125. 'no-sparse-arrays': 'error',
    126. // 禁止在普通字符串中出现模版字符串里的变量形式,如 'Hello ${name}!'
    127. 'no-template-curly-in-string': 'error',
    128. // 禁止出现难以理解的多行表达式,如:
    129. // let foo = bar
    130. // [1, 2, 3].forEach(baz);
    131. 'no-unexpected-multiline': 'error',
    132. // 禁止在 return, throw, break 或 continue 之后还有代码
    133. 'no-unreachable': 'error',
    134. // 禁止在 finally 中出现 return, throw, break 或 continue
    135. 'no-unsafe-finally': 'error',
    136. // @fixable 禁止在 in 或 instanceof 操作符的左侧使用感叹号,如 if (!key in object)
    137. 'no-unsafe-negation': 'error',
    138. // 必须使用 isNaN(foo) 而不是 foo === NaN
    139. 'use-isnan': 'error',
    140. // 注释必须符合 jsdoc 的规范
    141. // @off jsdoc 要求太严格
    142. 'valid-jsdoc': 'off',
    143. // typeof 表达式比较的对象必须是 'undefined', 'object', 'boolean', 'number', 'string', 'function' 或 'symbol'
    144. 'valid-typeof': 'error',
    145. //
    146. //
    147. // 最佳实践
    148. // 这些规则通过一些最佳实践帮助你避免问题
    149. //
    150. // setter 必须有对应的 getter,getter 可以没有对应的 setter
    151. 'accessor-pairs': [
    152. 'error',
    153. {
    154. setWithoutGet: true,
    155. getWithoutSet: false
    156. }
    157. ],
    158. // 数组的方法除了 forEach 之外,回调函数必须有返回值
    159. 'array-callback-return': 'error',
    160. // 将 var 定义的变量视为块作用域,禁止在块外使用
    161. 'block-scoped-var': 'error',
    162. // 在类的非静态方法中,必须存在对 this 的引用
    163. // @off 太严格了
    164. 'class-methods-use-this': 'off',
    165. // 禁止函数的循环复杂度超过 20,https://en.wikipedia.org/wiki/Cyclomatic_complexity
    166. 'complexity': [
    167. 'error',
    168. {
    169. max: 20
    170. }
    171. ],
    172. // 禁止函数在不同分支返回不同类型的值
    173. // @off 太严格了
    174. 'consistent-return': 'off',
    175. // @fixable if 后面必须要有 {,除非是单行 if
    176. 'curly': [
    177. 'error',
    178. 'multi-line',
    179. 'consistent'
    180. ],
    181. // switch 语句必须有 default
    182. // @off 太严格了
    183. 'default-case': 'off',
    184. // @fixable 链式调用的时候,点号必须放在第二行开头处,禁止放在第一行结尾处
    185. 'dot-location': [
    186. 'error',
    187. 'property'
    188. ],
    189. // @fixable 禁止出现 foo['bar'],必须写成 foo.bar
    190. // @off 当需要写一系列属性的时候,可以更统一
    191. 'dot-notation': 'off',
    192. // @fixable 必须使用 === 或 !==,禁止使用 == 或 !=,与 null 比较时除外
    193. 'eqeqeq': [
    194. 'error',
    195. 'always',
    196. {
    197. null: 'ignore'
    198. }
    199. ],
    200. // for in 内部必须有 hasOwnProperty
    201. 'guard-for-in': 'error',
    202. // 禁止使用 alert
    203. // @off alert 很常用
    204. 'no-alert': 'off',
    205. // 禁止使用 caller 或 callee
    206. 'no-caller': 'error',
    207. // switch 的 case 内有变量定义的时候,必须使用大括号将 case 内变成一个代码块
    208. 'no-case-declarations': 'error',
    209. // 禁止在正则表达式中出现形似除法操作符的开头,如 let a = /=foo/
    210. // @off 有代码高亮的话,在阅读这种代码时,也完全不会产生歧义或理解上的困难
    211. 'no-div-regex': 'off',
    212. // @fixable 禁止在 else 内使用 return,必须改为提前结束
    213. // @off else 中使用 return 可以使代码结构更清晰
    214. 'no-else-return': 'off',
    215. // 不允许有空函数,除非是将一个空函数设置为某个项的默认值
    216. 'no-empty-function': [
    217. 'error',
    218. {
    219. allow: [
    220. 'functions',
    221. 'arrowFunctions'
    222. ]
    223. }
    224. ],
    225. // 禁止解构中出现空 {} 或 []
    226. 'no-empty-pattern': 'error',
    227. // 禁止使用 foo == null 或 foo != null,必须使用 foo === null 或 foo !== null
    228. // @off foo == null 用于判断 foo 不是 undefined 并且不是 null,比较常用,故允许此写法
    229. 'no-eq-null': 'off',
    230. // 禁止使用 eval
    231. 'no-eval': 'error',
    232. // 禁止修改原生对象
    233. 'no-extend-native': 'error',
    234. // @fixable 禁止出现没必要的 bind
    235. 'no-extra-bind': 'error',
    236. // @fixable 禁止出现没必要的 label
    237. 'no-extra-label': 'error',
    238. // switch 的 case 内必须有 break, return 或 throw
    239. 'no-fallthrough': 'error',
    240. // @fixable 表示小数时,禁止省略 0,比如 .5
    241. 'no-floating-decimal': 'error',
    242. // 禁止对全局变量赋值
    243. 'no-global-assign': 'error',
    244. // @fixable 禁止使用 !! ~ 等难以理解的运算符
    245. // 仅允许使用 !!
    246. 'no-implicit-coercion': [
    247. 'error',
    248. {
    249. allow: [
    250. '!!'
    251. ]
    252. }
    253. ],
    254. // 禁止在全局作用域下定义变量或申明函数
    255. 'no-implicit-globals': 'error',
    256. // 禁止在 setTimeout 或 setInterval 中传入字符串,如 setTimeout('alert("Hi!")', 100);
    257. 'no-implied-eval': 'error',
    258. // 禁止在类之外的地方使用 this
    259. // @off this 的使用很灵活,事件回调中可以表示当前元素,函数也可以先用 this,等以后被调用的时候再 call
    260. 'no-invalid-this': 'off',
    261. // 禁止使用 __iterator__
    262. 'no-iterator': 'error',
    263. // 禁止使用 label
    264. 'no-labels': 'error',
    265. // 禁止使用没必要的 {} 作为代码块
    266. 'no-lone-blocks': 'error',
    267. // 禁止在循环内的函数中出现循环体条件语句中定义的变量,比如:
    268. // for (var i = 0; i < 10; i++) {
    269. // (function () { return i })();
    270. // }
    271. 'no-loop-func': 'error',
    272. // 禁止使用 magic numbers
    273. // @off 太严格了
    274. 'no-magic-numbers': 'off',
    275. // @fixable 禁止出现连续的多个空格,除非是注释前,或对齐对象的属性、变量定义、import 等
    276. 'no-multi-spaces': [
    277. 'error',
    278. {
    279. ignoreEOLComments: true,
    280. exceptions: {
    281. Property: true,
    282. BinaryExpression: false,
    283. VariableDeclarator: true,
    284. ImportDeclaration: true
    285. }
    286. }
    287. ],
    288. // 禁止使用 \ 来换行字符串
    289. 'no-multi-str': 'error',
    290. // 禁止直接 new 一个类而不赋值
    291. 'no-new': 'error',
    292. // 禁止使用 new Function,比如 let x = new Function("a", "b", "return a + b");
    293. 'no-new-func': 'error',
    294. // 禁止使用 new 来生成 String, Number 或 Boolean
    295. 'no-new-wrappers': 'error',
    296. // 禁止使用 0 开头的数字表示八进制数
    297. 'no-octal': 'error',
    298. // 禁止使用八进制的转义符
    299. 'no-octal-escape': 'error',
    300. // 禁止对函数的参数重新赋值
    301. 'no-param-reassign': 'error',
    302. // 禁止使用 __proto__
    303. 'no-proto': 'error',
    304. // 禁止重复定义变量
    305. 'no-redeclare': 'error',
    306. // 禁止使用指定的对象属性
    307. // @off 它用于限制某个具体的 api 不能使用
    308. 'no-restricted-properties': 'off',
    309. // 禁止在 return 语句里赋值
    310. 'no-return-assign': [
    311. 'error',
    312. 'always'
    313. ],
    314. // 禁止在 return 语句里使用 await
    315. 'no-return-await': 'error',
    316. // 禁止出现 location.href = 'javascript:void(0)';
    317. 'no-script-url': 'error',
    318. // 禁止将自己赋值给自己
    319. 'no-self-assign': 'error',
    320. // 禁止将自己与自己比较
    321. 'no-self-compare': 'error',
    322. // 禁止使用逗号操作符
    323. 'no-sequences': 'error',
    324. // 禁止 throw 字面量,必须 throw 一个 Error 对象
    325. 'no-throw-literal': 'error',
    326. // 循环内必须对循环条件的变量有修改
    327. 'no-unmodified-loop-condition': 'error',
    328. // 禁止无用的表达式
    329. 'no-unused-expressions': [
    330. 'error',
    331. {
    332. allowShortCircuit: true,
    333. allowTernary: true,
    334. allowTaggedTemplates: true
    335. }
    336. ],
    337. // @fixable 禁止出现没用的 label
    338. 'no-unused-labels': 'error',
    339. // 禁止出现没必要的 call 或 apply
    340. 'no-useless-call': 'error',
    341. // 禁止出现没必要的字符串连接
    342. 'no-useless-concat': 'error',
    343. // 禁止出现没必要的转义
    344. // @off 转义可以使代码更易懂
    345. 'no-useless-escape': 'off',
    346. // @fixable 禁止没必要的 return
    347. // @off 没必要限制 return
    348. 'no-useless-return': 'off',
    349. // 禁止使用 void
    350. 'no-void': 'error',
    351. // 禁止注释中出现 TODO 和 FIXME
    352. // @off TODO 很常用
    353. 'no-warning-comments': 'off',
    354. // 禁止使用 with
    355. 'no-with': 'error',
    356. // Promise 的 reject 中必须传入 Error 对象,而不是字面量
    357. 'prefer-promise-reject-errors': 'error',
    358. // parseInt 必须传入第二个参数
    359. 'radix': 'error',
    360. // async 函数中必须存在 await 语句
    361. // @off async function 中没有 await 的写法很常见,比如 koa 的示例中就有这种用法
    362. 'require-await': 'off',
    363. // var 必须在作用域的最前面
    364. // @off var 不在最前面也是很常见的用法
    365. 'vars-on-top': 'off',
    366. // @fixable 立即执行的函数必须符合如下格式 (function () { alert('Hello') })()
    367. 'wrap-iife': [
    368. 'error',
    369. 'inside',
    370. {
    371. functionPrototypeMethods: true
    372. }
    373. ],
    374. // @fixable 必须使用 if (foo === 5) 而不是 if (5 === foo)
    375. 'yoda': [
    376. 'error',
    377. 'never',
    378. {
    379. onlyEquality: true
    380. }
    381. ],
    382. //
    383. //
    384. // 严格模式
    385. // 这些规则与严格模式指令有关
    386. //
    387. // @fixable 禁止使用 'strict';
    388. 'strict': [
    389. 'error',
    390. 'never'
    391. ],
    392. //
    393. //
    394. // 变量
    395. // 这些规则与变量申明有关
    396. //
    397. // 变量必须在定义的时候赋值
    398. // @off 先定义后赋值很常见
    399. 'init-declarations': 'off',
    400. // 禁止 catch 的参数名与定义过的变量重复
    401. // @off 太严格了
    402. 'no-catch-shadow': 'off',
    403. // 禁止使用 delete
    404. 'no-delete-var': 'error',
    405. // 禁止 label 名称与定义过的变量重复
    406. 'no-label-var': 'error',
    407. // 禁止使用指定的全局变量
    408. // @off 它用于限制某个具体的变量名不能使用
    409. 'no-restricted-globals': 'off',
    410. // 禁止变量名与上层作用域内的定义过的变量重复
    411. // @off 很多时候函数的形参和传参是同名的
    412. 'no-shadow': 'off',
    413. // 禁止使用保留字作为变量名
    414. 'no-shadow-restricted-names': 'error',
    415. // 禁止使用未定义的变量
    416. 'no-undef': [
    417. 'error',
    418. {
    419. typeof: false
    420. }
    421. ],
    422. // @fixable 禁止将 undefined 赋值给变量
    423. 'no-undef-init': 'error',
    424. // 禁止对 undefined 重新赋值
    425. 'no-undefined': 'error',
    426. // 定义过的变量必须使用
    427. 'no-unused-vars': [
    428. 'error',
    429. {
    430. vars: 'all',
    431. args: 'none',
    432. caughtErrors: 'none',
    433. ignoreRestSiblings: true
    434. }
    435. ],
    436. // 变量必须先定义后使用
    437. 'no-use-before-define': [
    438. 'error',
    439. {
    440. functions: false,
    441. classes: false,
    442. variables: false
    443. }
    444. ],
    445. //
    446. //
    447. // Node.js 和 CommonJS
    448. // 这些规则与在 Node.js 中运行的代码或浏览器中使用的 CommonJS 有关
    449. //
    450. // callback 之后必须立即 return
    451. // @off Limitations 太多了
    452. 'callback-return': 'off',
    453. // require 必须在全局作用域下
    454. // @off 条件加载很常见
    455. 'global-require': 'off',
    456. // callback 中的 error 必须被处理
    457. 'handle-callback-err': 'error',
    458. // 禁止直接使用 Buffer
    459. 'no-buffer-constructor': 'error',
    460. // 相同类型的 require 必须放在一起
    461. // @off 太严格了
    462. 'no-mixed-requires': 'off',
    463. // 禁止直接 new require('foo')
    464. 'no-new-require': 'error',
    465. // 禁止对 __dirname 或 __filename 使用字符串连接
    466. 'no-path-concat': 'error',
    467. // 禁止使用 process.env.NODE_ENV
    468. // @off 使用很常见
    469. 'no-process-env': 'off',
    470. // 禁止使用 process.exit(0)
    471. // @off 使用很常见
    472. 'no-process-exit': 'off',
    473. // 禁止使用指定的模块
    474. // @off 它用于限制某个具体的模块不能使用
    475. 'no-restricted-modules': 'off',
    476. // 禁止使用 node 中的同步的方法,比如 fs.readFileSync
    477. // @off 使用很常见
    478. 'no-sync': 'off',
    479. //
    480. //
    481. // 风格问题
    482. // 这些规则与代码风格有关,所以是非常主观的
    483. //
    484. // @fixable 配置数组的中括号内前后的换行格式
    485. // @off 配置项无法配制成想要的样子
    486. 'array-bracket-newline': 'off',
    487. // @fixable 数组的括号内的前后禁止有空格
    488. 'array-bracket-spacing': [
    489. 'error',
    490. 'never'
    491. ],
    492. // @fixable 配置数组的元素之间的换行格式
    493. // @off 允许一行包含多个元素,方便大数量的数组的书写
    494. 'array-element-newline': 'off',
    495. // @fixable 代码块如果在一行内,那么大括号内的首尾必须有空格,比如 function () { alert('Hello') }
    496. 'block-spacing': [
    497. 'error',
    498. 'always'
    499. ],
    500. // @fixable if 与 else 的大括号风格必须一致
    501. // @off else 代码块可能前面需要有一行注释
    502. 'brace-style': 'off',
    503. // 变量名必须是 camelcase 风格的
    504. // @off 很多 api 或文件名都不是 camelcase
    505. 'camelcase': 'off',
    506. // @fixable 注释的首字母必须大写
    507. // @off 没必要限制
    508. 'capitalized-comments': 'off',
    509. // @fixable 对象的最后一个属性末尾必须有逗号
    510. // @off 没必要限制
    511. 'comma-dangle': 'off',
    512. // @fixable 逗号前禁止有空格,逗号后必须要有空格
    513. 'comma-spacing': [
    514. 'error',
    515. {
    516. 'before': false,
    517. 'after': true
    518. }
    519. ],
    520. // @fixable 禁止在行首写逗号
    521. 'comma-style': [
    522. 'error',
    523. 'last'
    524. ],
    525. // @fixable 用作对象的计算属性时,中括号内的首尾禁止有空格
    526. 'computed-property-spacing': [
    527. 'error',
    528. 'never'
    529. ],
    530. // 限制 this 的别名
    531. // @off 没必要限制
    532. 'consistent-this': 'off',
    533. // @fixable 文件最后一行必须有一个空行
    534. // @off 没必要限制
    535. 'eol-last': 'off',
    536. // @fixable 函数名和执行它的括号之间禁止有空格
    537. 'func-call-spacing': [
    538. 'error',
    539. 'never'
    540. ],
    541. // 函数赋值给变量的时候,函数名必须与变量名一致
    542. 'func-name-matching': [
    543. 'error',
    544. 'always',
    545. {
    546. includeCommonJSModuleExports: false
    547. }
    548. ],
    549. // 函数必须有名字
    550. // @off 没必要限制
    551. 'func-names': 'off',
    552. // 必须只使用函数声明或只使用函数表达式
    553. // @off 没必要限制
    554. 'func-style': 'off',
    555. // 禁止使用指定的标识符
    556. // @off 它用于限制某个具体的标识符不能使用
    557. 'id-blacklist': 'off',
    558. // 限制变量名长度
    559. // @off 没必要限制变量名长度
    560. 'id-length': 'off',
    561. // 限制变量名必须匹配指定的正则表达式
    562. // @off 没必要限制变量名
    563. 'id-match': 'off',
    564. // @fixable 一个缩进必须用四个空格替代
    565. 'indent': [
    566. 'error',
    567. 4,
    568. {
    569. SwitchCase: 1,
    570. flatTernaryExpressions: true
    571. }
    572. ],
    573. // @fixable jsx 中的属性必须用双引号
    574. 'jsx-quotes': [
    575. 'error',
    576. 'prefer-double'
    577. ],
    578. // @fixable 对象字面量中冒号前面禁止有空格,后面必须有空格
    579. 'key-spacing': [
    580. 'error',
    581. {
    582. beforeColon: false,
    583. afterColon: true,
    584. mode: 'strict',
    585. }
    586. ],
    587. // @fixable 关键字前后必须有空格
    588. 'keyword-spacing': [
    589. 'error',
    590. {
    591. before: true,
    592. after: true
    593. }
    594. ],
    595. // 单行注释必须写在上一行
    596. // @off 没必要限制
    597. 'line-comment-position': 'off',
    598. // @fixable 限制换行符为 LF 或 CRLF
    599. // @off 没必要限制
    600. 'linebreak-style': 'off',
    601. // @fixable 注释前后必须有空行
    602. // @off 没必要限制
    603. 'lines-around-comment': 'off',
    604. // 代码块嵌套的深度禁止超过 5 层
    605. 'max-depth': [
    606. 'error',
    607. 5
    608. ],
    609. // 限制一行的长度
    610. // @off 现在编辑器已经很智能了,不需要限制一行的长度
    611. 'max-len': 'off',
    612. // 限制一个文件最多的行数
    613. // @off 没必要限制
    614. 'max-lines': 'off',
    615. // 回调函数嵌套禁止超过 3 层,多了请用 async await 替代
    616. 'max-nested-callbacks': [
    617. 'error',
    618. 3
    619. ],
    620. // 函数的参数禁止超过 7 个
    621. 'max-params': [
    622. 'error',
    623. 7
    624. ],
    625. // 限制函数块中的语句数量
    626. // @off 没必要限制
    627. 'max-statements': 'off',
    628. // 限制一行中的语句数量
    629. // @off 没必要限制
    630. 'max-statements-per-line': 'off',
    631. // 三元表达式必须得换行
    632. // @off 三元表达式可以随意使用
    633. 'multiline-ternary': 'off',
    634. // new 后面的类名必须首字母大写
    635. 'new-cap': [
    636. 'error',
    637. {
    638. newIsCap: true,
    639. capIsNew: false,
    640. properties: true
    641. }
    642. ],
    643. // @fixable new 后面的类必须有小括号
    644. 'new-parens': 'error',
    645. // 链式调用必须换行
    646. // @off 没必要限制
    647. 'newline-per-chained-call': 'off',
    648. // 禁止使用 Array 构造函数
    649. 'no-array-constructor': 'error',
    650. // 禁止使用位运算
    651. // @off 位运算很常见
    652. 'no-bitwise': 'off',
    653. // 禁止使用 continue
    654. // @off continue 很常用
    655. 'no-continue': 'off',
    656. // 禁止在代码后添加内联注释
    657. // @off 内联注释很常用
    658. 'no-inline-comments': 'off',
    659. // @fixable 禁止 else 中只有一个单独的 if
    660. // @off 单独的 if 可以把逻辑表达的更清楚
    661. 'no-lonely-if': 'off',
    662. // 禁止混用不同的操作符,比如 let foo = a && b < 0 || c > 0 || d + 1 === 0
    663. // @off 太严格了,可以由使用者自己去判断如何混用操作符
    664. 'no-mixed-operators': 'off',
    665. // 禁止混用空格和缩进
    666. 'no-mixed-spaces-and-tabs': 'error',
    667. // 禁止连续赋值,比如 a = b = c = 5
    668. // @off 没必要限制
    669. 'no-multi-assign': 'off',
    670. // @fixable 禁止出现超过三行的连续空行
    671. 'no-multiple-empty-lines': [
    672. 'error',
    673. {
    674. max: 3,
    675. maxEOF: 1,
    676. maxBOF: 1
    677. }
    678. ],
    679. // 禁止 if 里面有否定的表达式,比如:
    680. // if (a !== b) {
    681. // doSomething();
    682. // } else {
    683. // doSomethingElse();
    684. // }
    685. // @off 否定的表达式可以把逻辑表达的更清楚
    686. 'no-negated-condition': 'off',
    687. // 禁止使用嵌套的三元表达式,比如 a ? b : c ? d : e
    688. // @off 没必要限制
    689. 'no-nested-ternary': 'off',
    690. // 禁止直接 new Object
    691. 'no-new-object': 'error',
    692. // 禁止使用 ++ 或 --
    693. // @off 没必要限制
    694. 'no-plusplus': 'off',
    695. // 禁止使用特定的语法
    696. // @off 它用于限制某个具体的语法不能使用
    697. 'no-restricted-syntax': 'off',
    698. // 禁止使用 tabs
    699. 'no-tabs': 'error',
    700. // 禁止使用三元表达式
    701. // @off 三元表达式很常用
    702. 'no-ternary': 'off',
    703. // @fixable 禁止行尾有空格
    704. 'no-trailing-spaces': 'error',
    705. // 禁止变量名出现下划线
    706. // @off 下划线在变量名中很常用
    707. 'no-underscore-dangle': 'off',
    708. // @fixable 必须使用 !a 替代 a ? false : true
    709. // @off 后者表达的更清晰
    710. 'no-unneeded-ternary': 'off',
    711. // @fixable 禁止属性前有空格,比如 foo. bar()
    712. 'no-whitespace-before-property': 'error',
    713. // @fixable 禁止 if 后面不加大括号而写两行代码
    714. 'nonblock-statement-body-position': [
    715. 'error',
    716. 'beside',
    717. {
    718. overrides: {
    719. while: 'below'
    720. }
    721. }
    722. ],
    723. // @fixable 大括号内的首尾必须有换行
    724. 'object-curly-newline': [
    725. 'error',
    726. {
    727. multiline: true,
    728. consistent: true
    729. }
    730. ],
    731. // @fixable 对象字面量只有一行时,大括号内的首尾必须有空格
    732. 'object-curly-spacing': [
    733. 'error',
    734. 'always',
    735. {
    736. arraysInObjects: true,
    737. objectsInObjects: false
    738. }
    739. ],
    740. // @fixable 对象字面量内的属性每行必须只有一个
    741. // @off 没必要限制
    742. 'object-property-newline': 'off',
    743. // 禁止变量申明时用逗号一次申明多个
    744. 'one-var': [
    745. 'error',
    746. 'never'
    747. ],
    748. // @fixable 变量申明必须每行一个
    749. 'one-var-declaration-per-line': [
    750. 'error',
    751. 'always'
    752. ],
    753. // @fixable 必须使用 x = x + y 而不是 x += y
    754. // @off 没必要限制
    755. 'operator-assignment': 'off',
    756. // @fixable 需要换行的时候,操作符必须放在行末,比如:
    757. // let foo = 1 +
    758. // 2
    759. // @off 有时放在第二行开始处更易读
    760. 'operator-linebreak': 'off',
    761. // @fixable 代码块首尾必须要空行
    762. // @off 没必要限制
    763. 'padded-blocks': 'off',
    764. // @fixable 限制语句之间的空行规则,比如变量定义完之后必须要空行
    765. // @off 没必要限制
    766. 'padding-line-between-statements': 'off',
    767. // @fixable 对象字面量的键名禁止用引号括起来
    768. // @off 没必要限制
    769. 'quote-props': 'off',
    770. // @fixable 必须使用单引号,禁止使用双引号
    771. 'quotes': [
    772. 'error',
    773. 'single',
    774. {
    775. avoidEscape: true,
    776. allowTemplateLiterals: true
    777. }
    778. ],
    779. // 必须使用 jsdoc 风格的注释
    780. // @off 太严格了
    781. 'require-jsdoc': 'off',
    782. // @fixable 结尾必须有分号
    783. 'semi': [
    784. 'error',
    785. 'always',
    786. {
    787. omitLastInOneLineBlock: true
    788. }
    789. ],
    790. // @fixable 一行有多个语句时,分号前面禁止有空格,分号后面必须有空格
    791. 'semi-spacing': [
    792. 'error',
    793. {
    794. before: false,
    795. after: true
    796. }
    797. ],
    798. // @fixable 分号必须写在行尾,禁止在行首出现
    799. 'semi-style': [
    800. 'error',
    801. 'last'
    802. ],
    803. // 对象字面量的键名必须排好序
    804. // @off 没必要限制
    805. 'sort-keys': 'off',
    806. // 变量申明必须排好序
    807. // @off 没必要限制
    808. 'sort-vars': 'off',
    809. // @fixable if, function 等的大括号之前必须要有空格,比如 if (a) {
    810. 'space-before-blocks': [
    811. 'error',
    812. 'always'
    813. ],
    814. // @fixable function 的小括号之前必须要有空格
    815. 'space-before-function-paren': [
    816. 'error',
    817. {
    818. anonymous: 'ignore',
    819. named: 'never',
    820. asyncArrow: 'always'
    821. }
    822. ],
    823. // @fixable 小括号内的首尾禁止有空格
    824. 'space-in-parens': [
    825. 'error',
    826. 'never'
    827. ],
    828. // @fixable 操作符左右必须有空格,比如 let sum = 1 + 2;
    829. 'space-infix-ops': 'error',
    830. // @fixable new, typeof 等后面必须有空格,++, -- 等禁止有空格,比如:
    831. // let foo = new Person();
    832. // bar = bar++;
    833. 'space-unary-ops': [
    834. 'error',
    835. {
    836. words: true,
    837. nonwords: false
    838. }
    839. ],
    840. // @fixable 注释的斜线或 * 后必须有空格
    841. 'spaced-comment': [
    842. 'error',
    843. 'always',
    844. {
    845. block: {
    846. exceptions: [
    847. '*'
    848. ],
    849. balanced: true
    850. }
    851. }
    852. ],
    853. // @fixable case 的冒号前禁止有空格,冒号后必须有空格
    854. 'switch-colon-spacing': [
    855. 'error',
    856. {
    857. after: true,
    858. before: false
    859. }
    860. ],
    861. // @fixable 模版字符串的 tag 之后禁止有空格,比如 tag`Hello World`
    862. 'template-tag-spacing': [
    863. 'error',
    864. 'never'
    865. ],
    866. // @fixable 文件开头禁止有 BOM
    867. 'unicode-bom': [
    868. 'error',
    869. 'never'
    870. ],
    871. // @fixable 正则表达式必须有括号包起来
    872. // @off 没必要限制
    873. 'wrap-regex': 'off',
    874. //
    875. //
    876. // ECMAScript 6
    877. // 这些规则与 ES6(即通常所说的 ES2015)有关
    878. //
    879. // @fixable 箭头函数能够省略 return 的时候,必须省略,比如必须写成 () => 0,禁止写成 () => { return 0 }
    880. // @off 箭头函数的返回值,应该允许灵活设置
    881. 'arrow-body-style': 'off',
    882. // @fixable 箭头函数只有一个参数的时候,必须加括号
    883. // @off 应该允许灵活设置
    884. 'arrow-parens': 'off',
    885. // @fixable 箭头函数的箭头前后必须有空格
    886. 'arrow-spacing': [
    887. 'error',
    888. {
    889. before: true,
    890. after: true
    891. }
    892. ],
    893. // constructor 中必须有 super
    894. 'constructor-super': 'error',
    895. // @fixable generator 的 * 前面禁止有空格,后面必须有空格
    896. 'generator-star-spacing': [
    897. 'error',
    898. {
    899. before: false,
    900. after: true
    901. }
    902. ],
    903. // 禁止对定义过的 class 重新赋值
    904. 'no-class-assign': 'error',
    905. // @fixable 禁止出现难以理解的箭头函数,比如 let x = a => 1 ? 2 : 3
    906. 'no-confusing-arrow': [
    907. 'error',
    908. {
    909. allowParens: true
    910. }
    911. ],
    912. // 禁止对使用 const 定义的常量重新赋值
    913. 'no-const-assign': 'error',
    914. // 禁止重复定义类
    915. 'no-dupe-class-members': 'error',
    916. // 禁止重复 import 模块
    917. 'no-duplicate-imports': 'error',
    918. // 禁止使用 new 来生成 Symbol
    919. 'no-new-symbol': 'error',
    920. // 禁止 import 指定的模块
    921. // @off 它用于限制某个具体的模块不能使用
    922. 'no-restricted-imports': 'off',
    923. // 禁止在 super 被调用之前使用 this 或 super
    924. 'no-this-before-super': 'error',
    925. // @fixable 禁止出现没必要的计算键名,比如 let a = { ['0']: 0 };
    926. 'no-useless-computed-key': 'error',
    927. // 禁止出现没必要的 constructor,比如 constructor(value) { super(value) }
    928. 'no-useless-constructor': 'error',
    929. // @fixable 禁止解构时出现同样名字的的重命名,比如 let { foo: foo } = bar;
    930. 'no-useless-rename': 'error',
    931. // @fixable 禁止使用 var
    932. 'no-var': 'error',
    933. // @fixable 必须使用 a = {b} 而不是 a = {b: b}
    934. // @off 没必要强制要求
    935. 'object-shorthand': 'off',
    936. // @fixable 必须使用箭头函数作为回调
    937. // @off 没必要强制要求
    938. 'prefer-arrow-callback': 'off',
    939. // @fixable 申明后不再被修改的变量必须使用 const 来申明
    940. // @off 没必要强制要求
    941. 'prefer-const': 'off',
    942. // 必须使用解构
    943. // @off 没必要强制要求
    944. 'prefer-destructuring': 'off',
    945. // @fixable 必须使用 0b11111011 而不是 parseInt('111110111', 2)
    946. // @off 没必要强制要求
    947. 'prefer-numeric-literals': 'off',
    948. // 必须使用 ...args 而不是 arguments
    949. // @off 没必要强制要求
    950. 'prefer-rest-params': 'off',
    951. // @fixable 必须使用 ... 而不是 apply,比如 foo(...args)
    952. // @off apply 很常用
    953. 'prefer-spread': 'off',
    954. // @fixable 必须使用模版字符串而不是字符串连接
    955. // @off 字符串连接很常用
    956. 'prefer-template': 'off',
    957. // generator 函数内必须有 yield
    958. 'require-yield': 'error',
    959. // @fixable ... 的后面禁止有空格
    960. 'rest-spread-spacing': [
    961. 'error',
    962. 'never'
    963. ],
    964. // @fixable import 必须按规则排序
    965. // @off 没必要强制要求
    966. 'sort-imports': 'off',
    967. // 创建 Symbol 时必须传入参数
    968. 'symbol-description': 'error',
    969. // @fixable ${name} 内的首尾禁止有空格
    970. 'template-curly-spacing': [
    971. 'error',
    972. 'never'
    973. ],
    974. // @fixable yield* 后面必须要有空格
    975. 'yield-star-spacing': [
    976. 'error',
    977. 'after'
    978. ]
    979. }
    980. };

    常用配置

    项目下新建.eslint文件,内容如下

  1. {
  2. // 环境定义了预定义的全局变量。
  3. "env": {
  4. //环境定义了预定义的全局变量。更多在官网查看
  5. "browser": true,
  6. "node": true,
  7. "commonjs": true,
  8. "amd": true,
  9. "es6": true,
  10. "mocha": true
  11. },
  12. // JavaScript 语言选项
  13. "parserOptions": {
  14. // ECMAScript 版本
  15. "ecmaVersion": 6,
  16. "sourceType": "module", //设置为 "script" (默认) 或 "module"(如果你的代码是 ECMAScript 模块)。
  17. //想使用的额外的语言特性:
  18. "ecmaFeatures": {
  19. // 允许在全局作用域下使用 return 语句
  20. "globalReturn": true,
  21. // impliedStric
  22. "impliedStrict": true,
  23. // 启用 JSX
  24. "jsx": true,
  25. "modules": true
  26. }
  27. },
  28. //-----让eslint支持 JSX start
  29. "plugins": [
  30. "react"
  31. ],
  32. "extends": [
  33. "eslint:recommended",
  34. "plugin:react/recommended"
  35. ],
  36. //-----让eslint支持 JSX end
  37. /**
  38. * "off" 或 0 - 关闭规则
  39. * "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出),
  40. * "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
  41. */
  42. "rules": {
  43. ////////////////
  44. // 可能的错误 //
  45. ////////////////
  46. // 禁止条件表达式中出现赋值操作符
  47. "no-cond-assign": 2,
  48. // 禁用 console
  49. "no-console": 0,
  50. // 禁止在条件中使用常量表达式
  51. // if (false) {
  52. // doSomethingUnfinished();
  53. // } //cuowu
  54. "no-constant-condition": 2,
  55. // 禁止在正则表达式中使用控制字符 :new RegExp("\x1f")
  56. "no-control-regex": 2,
  57. // 数组和对象键值对最后一个逗号, never参数:不能带末尾的逗号, always参数:必须带末尾的逗号,
  58. // always-multiline:多行模式必须带逗号,单行模式不能带逗号
  59. "comma-dangle": [
  60. 1,
  61. "never"
  62. ],
  63. // 禁用 debugger
  64. "no-debugger": 2,
  65. // 禁止 function 定义中出现重名参数
  66. "no-dupe-args": 2,
  67. // 禁止对象字面量中出现重复的 key
  68. "no-dupe-keys": 2,
  69. // 禁止重复的 case 标签
  70. "no-duplicate-case": 2,
  71. // 禁止空语句块
  72. "no-empty": 2,
  73. // 禁止在正则表达式中使用空字符集 (/^abc[]/)
  74. "no-empty-character-class": 2,
  75. // 禁止对 catch 子句的参数重新赋值
  76. "no-ex-assign": 2,
  77. // 禁止不必要的布尔转换
  78. "no-extra-boolean-cast": 2,
  79. // 禁止不必要的括号 //(a * b) + c;//报错
  80. "no-extra-parens": 0,
  81. // 禁止不必要的分号
  82. "no-extra-semi": 2,
  83. // 禁止对 function 声明重新赋值
  84. "no-func-assign": 2,
  85. // 禁止在嵌套的块中出现 function 或 var 声明
  86. "no-inner-declarations": [
  87. 2,
  88. "functions"
  89. ],
  90. // 禁止 RegExp 构造函数中无效的正则表达式字符串
  91. "no-invalid-regexp": 2,
  92. // 禁止在字符串和注释之外不规则的空白
  93. "no-irregular-whitespace": 2,
  94. // 禁止在 in 表达式中出现否定的左操作数
  95. "no-negated-in-lhs": 2,
  96. // 禁止把全局对象 (Math 和 JSON) 作为函数调用 错误:var math = Math();
  97. "no-obj-calls": 2,
  98. // 禁止直接使用 Object.prototypes 的内置属性
  99. "no-prototype-builtins": 0,
  100. // 禁止正则表达式字面量中出现多个空格
  101. "no-regex-spaces": 2,
  102. // 禁用稀疏数组
  103. "no-sparse-arrays": 2,
  104. // 禁止出现令人困惑的多行表达式
  105. "no-unexpected-multiline": 2,
  106. // 禁止在return、throw、continue 和 break语句之后出现不可达代码
  107. "no-unreachable": 2,
  108. // 要求使用 isNaN() 检查 NaN
  109. "use-isnan": 2,
  110. // 强制使用有效的 JSDoc 注释
  111. "valid-jsdoc": 1,
  112. // 强制 typeof 表达式与有效的字符串进行比较
  113. // typeof foo === "undefimed" 错误
  114. "valid-typeof": 2,
  115. //////////////
  116. // 最佳实践 //
  117. //////////////
  118. // 定义对象的set存取器属性时,强制定义get
  119. "accessor-pairs": 2,
  120. // 强制数组方法的回调函数中有 return 语句
  121. "array-callback-return": 0,
  122. // 强制把变量的使用限制在其定义的作用域范围内
  123. "block-scoped-var": 0,
  124. // 限制圈复杂度,也就是类似if else能连续接多少个
  125. "complexity": [
  126. 2,
  127. 9
  128. ],
  129. // 要求 return 语句要么总是指定返回的值,要么不指定
  130. "consistent-return": 0,
  131. // 强制所有控制语句使用一致的括号风格
  132. "curly": [
  133. 2,
  134. "all"
  135. ],
  136. // switch 语句强制 default 分支,也可添加 // no default 注释取消此次警告
  137. "default-case": 2,
  138. // 强制object.key 中 . 的位置,参数:
  139. // property,'.'号应与属性在同一行
  140. // object, '.' 号应与对象名在同一行
  141. "dot-location": [
  142. 2,
  143. "property"
  144. ],
  145. // 强制使用.号取属性
  146. // 参数: allowKeywords:true 使用保留字做属性名时,只能使用.方式取属性
  147. // false 使用保留字做属性名时, 只能使用[]方式取属性 e.g [2, {"allowKeywords": false}]
  148. // allowPattern: 当属性名匹配提供的正则表达式时,允许使用[]方式取值,否则只能用.号取值 e.g [2, {"allowPattern": "^[a-z]+(_[a-z]+)+$"}]
  149. "dot-notation": [
  150. 2,
  151. {
  152. "allowKeywords": false
  153. }
  154. ],
  155. // 使用 === 替代 == allow-null允许null和undefined==
  156. "eqeqeq": [
  157. 2,
  158. "allow-null"
  159. ],
  160. // 要求 for-in 循环中有一个 if 语句
  161. "guard-for-in": 2,
  162. // 禁用 alert、confirm 和 prompt
  163. "no-alert": 0,
  164. // 禁用 arguments.caller 或 arguments.callee
  165. "no-caller": 2,
  166. // 不允许在 case 子句中使用词法声明
  167. "no-case-declarations": 2,
  168. // 禁止除法操作符显式的出现在正则表达式开始的位置
  169. "no-div-regex": 2,
  170. // 禁止 if 语句中有 return 之后有 else
  171. "no-else-return": 0,
  172. // 禁止出现空函数.如果一个函数包含了一条注释,它将不会被认为有问题。
  173. "no-empty-function": 2,
  174. // 禁止使用空解构模式no-empty-pattern
  175. "no-empty-pattern": 2,
  176. // 禁止在没有类型检查操作符的情况下与 null 进行比较
  177. "no-eq-null": 1,
  178. // 禁用 eval()
  179. "no-eval": 2,
  180. // 禁止扩展原生类型
  181. "no-extend-native": 2,
  182. // 禁止不必要的 .bind() 调用
  183. "no-extra-bind": 2,
  184. // 禁用不必要的标签
  185. "no-extra-label:": 0,
  186. // 禁止 case 语句落空
  187. "no-fallthrough": 2,
  188. // 禁止数字字面量中使用前导和末尾小数点
  189. "no-floating-decimal": 2,
  190. // 禁止使用短符号进行类型转换(!!fOO)
  191. "no-implicit-coercion": 0,
  192. // 禁止在全局范围内使用 var 和命名的 function 声明
  193. "no-implicit-globals": 1,
  194. // 禁止使用类似 eval() 的方法
  195. "no-implied-eval": 2,
  196. // 禁止 this 关键字出现在类和类对象之外
  197. "no-invalid-this": 0,
  198. // 禁用 __iterator__ 属性
  199. "no-iterator": 2,
  200. // 禁用标签语句
  201. "no-labels": 2,
  202. // 禁用不必要的嵌套块
  203. "no-lone-blocks": 2,
  204. // 禁止在循环中出现 function 声明和表达式
  205. "no-loop-func": 1,
  206. // 禁用魔术数字(3.14什么的用常量代替)
  207. "no-magic-numbers": [
  208. 1,
  209. {
  210. "ignore": [
  211. 0,
  212. -1,
  213. 1
  214. ]
  215. }
  216. ],
  217. // 禁止使用多个空格
  218. "no-multi-spaces": 2,
  219. // 禁止使用多行字符串,在 JavaScript 中,可以在新行之前使用斜线创建多行字符串
  220. "no-multi-str": 2,
  221. // 禁止对原生对象赋值
  222. "no-native-reassign": 2,
  223. // 禁止在非赋值或条件语句中使用 new 操作符
  224. "no-new": 2,
  225. // 禁止对 Function 对象使用 new 操作符
  226. "no-new-func": 0,
  227. // 禁止对 String,Number 和 Boolean 使用 new 操作符
  228. "no-new-wrappers": 2,
  229. // 禁用八进制字面量
  230. "no-octal": 2,
  231. // 禁止在字符串中使用八进制转义序列
  232. "no-octal-escape": 2,
  233. // 不允许对 function 的参数进行重新赋值
  234. "no-param-reassign": 0,
  235. // 禁用 __proto__ 属性
  236. "no-proto": 2,
  237. // 禁止使用 var 多次声明同一变量
  238. "no-redeclare": 2,
  239. // 禁用指定的通过 require 加载的模块
  240. "no-return-assign": 0,
  241. // 禁止使用 javascript: url
  242. "no-script-url": 0,
  243. // 禁止自我赋值
  244. "no-self-assign": 2,
  245. // 禁止自身比较
  246. "no-self-compare": 2,
  247. // 禁用逗号操作符
  248. "no-sequences": 2,
  249. // 禁止抛出非异常字面量
  250. "no-throw-literal": 2,
  251. // 禁用一成不变的循环条件
  252. "no-unmodified-loop-condition": 2,
  253. // 禁止出现未使用过的表达式
  254. "no-unused-expressions": 0,
  255. // 禁用未使用过的标签
  256. "no-unused-labels": 2,
  257. // 禁止不必要的 .call() 和 .apply()
  258. "no-useless-call": 2,
  259. // 禁止不必要的字符串字面量或模板字面量的连接
  260. "no-useless-concat": 2,
  261. // 禁用不必要的转义字符
  262. "no-useless-escape": 0,
  263. // 禁用 void 操作符
  264. "no-void": 0,
  265. // 禁止在注释中使用特定的警告术语
  266. "no-warning-comments": 0,
  267. // 禁用 with 语句
  268. "no-with": 2,
  269. // 强制在parseInt()使用基数参数
  270. "radix": 2,
  271. // 要求所有的 var 声明出现在它们所在的作用域顶部
  272. "vars-on-top": 0,
  273. // 要求 IIFE 使用括号括起来
  274. "wrap-iife": [
  275. 2,
  276. "any"
  277. ],
  278. // 要求或禁止 “Yoda” 条件
  279. "yoda": [
  280. 2,
  281. "never"
  282. ],
  283. // 要求或禁止使用严格模式指令
  284. "strict": 0,
  285. //////////////
  286. // 变量声明 //
  287. //////////////
  288. // 要求或禁止 var 声明中的初始化(初值)
  289. "init-declarations": 0,
  290. // 不允许 catch 子句的参数与外层作用域中的变量同名
  291. "no-catch-shadow": 0,
  292. // 禁止删除变量
  293. "no-delete-var": 2,
  294. // 不允许标签与变量同名
  295. "no-label-var": 2,
  296. // 禁用特定的全局变量
  297. "no-restricted-globals": 0,
  298. // 禁止 var 声明 与外层作用域的变量同名
  299. "no-shadow": 0,
  300. // 禁止覆盖受限制的标识符
  301. "no-shadow-restricted-names": 2,
  302. // 禁用未声明的变量,除非它们在 /*global */ 注释中被提到
  303. "no-undef": 2,
  304. // 禁止将变量初始化为 undefined
  305. "no-undef-init": 2,
  306. // 禁止将 undefined 作为标识符
  307. "no-undefined": 0,
  308. // 禁止出现未使用过的变量
  309. "no-unused-vars": [
  310. 2,
  311. {
  312. "vars": "all",
  313. "args": "none"
  314. }
  315. ],
  316. // 不允许在变量定义之前使用它们
  317. "no-use-before-define": 0,
  318. //////////////////////////
  319. // Node.js and CommonJS //
  320. //////////////////////////
  321. // require return statements after callbacks
  322. "callback-return": 0,
  323. // 要求 require() 出现在顶层模块作用域中
  324. "global-require": 1,
  325. // 要求回调函数中有容错处理
  326. "handle-callback-err": [
  327. 2,
  328. "^(err|error)$"
  329. ],
  330. // 禁止混合常规 var 声明和 require 调用
  331. "no-mixed-requires": 0,
  332. // 禁止调用 require 时使用 new 操作符
  333. "no-new-require": 2,
  334. // 禁止对 __dirname 和 __filename进行字符串连接
  335. "no-path-concat": 0,
  336. // 禁用 process.env
  337. "no-process-env": 0,
  338. // 禁用 process.exit()
  339. "no-process-exit": 0,
  340. // 禁用同步方法
  341. "no-sync": 0,
  342. //////////////
  343. // 风格指南 //
  344. //////////////
  345. // 指定数组的元素之间要以空格隔开(, 后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格
  346. "array-bracket-spacing": [
  347. 2,
  348. "never"
  349. ],
  350. // 禁止或强制在单行代码块中使用空格(禁用)
  351. "block-spacing": [
  352. 1,
  353. "never"
  354. ],
  355. //强制使用一致的缩进 第二个参数为 "tab" 时,会使用tab,
  356. // if while function 后面的{必须与if在同一行,java风格。
  357. "brace-style": [
  358. 2,
  359. "1tbs",
  360. {
  361. "allowSingleLine": true
  362. }
  363. ],
  364. // 双峰驼命名格式
  365. "camelcase": 2,
  366. // 控制逗号前后的空格
  367. "comma-spacing": [
  368. 2,
  369. {
  370. "before": false,
  371. "after": true
  372. }
  373. ],
  374. // 控制逗号在行尾出现还是在行首出现 (默认行尾)
  375. // http://eslint.org/docs/rules/comma-style
  376. "comma-style": [
  377. 2,
  378. "last"
  379. ],
  380. //"SwitchCase" (默认:0) 强制 switch 语句中的 case 子句的缩进水平
  381. // 以方括号取对象属性时,[ 后面和 ] 前面是否需要空格, 可选参数 never, always
  382. "computed-property-spacing": [
  383. 2,
  384. "never"
  385. ],
  386. // 用于指统一在回调函数中指向this的变量名,箭头函数中的this已经可以指向外层调用者,应该没卵用了
  387. // e.g [0,"that"] 指定只能 var that = this. that不能指向其他任何值,this也不能赋值给that以外的其他值
  388. "consistent-this": [
  389. 1,
  390. "that"
  391. ],
  392. // 强制使用命名的 function 表达式
  393. "func-names": 0,
  394. // 文件末尾强制换行
  395. "eol-last": 2,
  396. "indent": [
  397. 2,
  398. 4,
  399. {
  400. "SwitchCase": 1
  401. }
  402. ],
  403. // 强制在对象字面量的属性中键和值之间使用一致的间距
  404. "key-spacing": [
  405. 2,
  406. {
  407. "beforeColon": false,
  408. "afterColon": true
  409. }
  410. ],
  411. // 强制使用一致的换行风格
  412. "linebreak-style": [
  413. 1,
  414. "unix"
  415. ],
  416. // 要求在注释周围有空行 ( 要求在块级注释之前有一空行)
  417. "lines-around-comment": [
  418. 1,
  419. {
  420. "beforeBlockComment": true
  421. }
  422. ],
  423. // 强制一致地使用函数声明或函数表达式,方法定义风格,参数:
  424. // declaration: 强制使用方法声明的方式,function f(){} e.g [2, "declaration"]
  425. // expression:强制使用方法表达式的方式,var f = function() {} e.g [2, "expression"]
  426. // allowArrowFunctions: declaration风格中允许箭头函数。 e.g [2, "declaration", { "allowArrowFunctions": true }]
  427. "func-style": 0,
  428. // 强制回调函数最大嵌套深度 5层
  429. "max-nested-callbacks": [
  430. 1,
  431. 5
  432. ],
  433. // 禁止使用指定的标识符
  434. "id-blacklist": 0,
  435. // 强制标识符的最新和最大长度
  436. "id-length": 0,
  437. // 要求标识符匹配一个指定的正则表达式
  438. "id-match": 0,
  439. // 强制在 JSX 属性中一致地使用双引号或单引号
  440. "jsx-quotes": 0,
  441. // 强制在关键字前后使用一致的空格 (前后腰需要)
  442. "keyword-spacing": 2,
  443. // 强制一行的最大长度
  444. "max-len": [
  445. 1,
  446. 200
  447. ],
  448. // 强制最大行数
  449. "max-lines": 0,
  450. // 强制 function 定义中最多允许的参数数量
  451. "max-params": [
  452. 1,
  453. 7
  454. ],
  455. // 强制 function 块最多允许的的语句数量
  456. "max-statements": [
  457. 1,
  458. 200
  459. ],
  460. // 强制每一行中所允许的最大语句数量
  461. "max-statements-per-line": 0,
  462. // 要求构造函数首字母大写 (要求调用 new 操作符时有首字母大小的函数,允许调用首字母大写的函数时没有 new 操作符。)
  463. "new-cap": [
  464. 2,
  465. {
  466. "newIsCap": true,
  467. "capIsNew": false
  468. }
  469. ],
  470. // 要求调用无参构造函数时有圆括号
  471. "new-parens": 2,
  472. // 要求或禁止 var 声明语句后有一行空行
  473. "newline-after-var": 0,
  474. // 禁止使用 Array 构造函数
  475. "no-array-constructor": 2,
  476. // 禁用按位运算符
  477. "no-bitwise": 0,
  478. // 要求 return 语句之前有一空行
  479. "newline-before-return": 0,
  480. // 要求方法链中每个调用都有一个换行符
  481. "newline-per-chained-call": 1,
  482. // 禁用 continue 语句
  483. "no-continue": 0,
  484. // 禁止在代码行后使用内联注释
  485. "no-inline-comments": 0,
  486. // 禁止 if 作为唯一的语句出现在 else 语句中
  487. "no-lonely-if": 0,
  488. // 禁止混合使用不同的操作符
  489. "no-mixed-operators": 0,
  490. // 不允许空格和 tab 混合缩进
  491. "no-mixed-spaces-and-tabs": 2,
  492. // 不允许多个空行
  493. "no-multiple-empty-lines": [
  494. 2,
  495. {
  496. "max": 2
  497. }
  498. ],
  499. // 不允许否定的表达式
  500. "no-negated-condition": 0,
  501. // 不允许使用嵌套的三元表达式
  502. "no-nested-ternary": 0,
  503. // 禁止使用 Object 的构造函数
  504. "no-new-object": 2,
  505. // 禁止使用一元操作符 ++ 和 --
  506. "no-plusplus": 0,
  507. // 禁止使用特定的语法
  508. "no-restricted-syntax": 0,
  509. // 禁止 function 标识符和括号之间出现空格
  510. "no-spaced-func": 2,
  511. // 不允许使用三元操作符
  512. "no-ternary": 0,
  513. // 禁用行尾空格
  514. "no-trailing-spaces": 2,
  515. // 禁止标识符中有悬空下划线_bar
  516. "no-underscore-dangle": 0,
  517. // 禁止可以在有更简单的可替代的表达式时使用三元操作符
  518. "no-unneeded-ternary": 2,
  519. // 禁止属性前有空白
  520. "no-whitespace-before-property": 0,
  521. // 强制花括号内换行符的一致性
  522. "object-curly-newline": 0,
  523. // 强制在花括号中使用一致的空格
  524. "object-curly-spacing": 0,
  525. // 强制将对象的属性放在不同的行上
  526. "object-property-newline": 0,
  527. // 强制函数中的变量要么一起声明要么分开声明
  528. "one-var": [
  529. 2,
  530. {
  531. "initialized": "never"
  532. }
  533. ],
  534. // 要求或禁止在 var 声明周围换行
  535. "one-var-declaration-per-line": 0,
  536. // 要求或禁止在可能的情况下要求使用简化的赋值操作符
  537. "operator-assignment": 0,
  538. // 强制操作符使用一致的换行符
  539. "operator-linebreak": [
  540. 2,
  541. "after",
  542. {
  543. "overrides": {
  544. "?": "before",
  545. ":": "before"
  546. }
  547. }
  548. ],
  549. // 要求或禁止块内填充
  550. "padded-blocks": 0,
  551. // 要求对象字面量属性名称用引号括起来
  552. "quote-props": 0,
  553. // 强制使用一致的反勾号、双引号或单引号
  554. "quotes": [
  555. 2,
  556. "double",
  557. "avoid-escape"
  558. ],
  559. // 要求使用 JSDoc 注释
  560. "require-jsdoc": 1,
  561. // 要求或禁止使用分号而不是 ASI(这个才是控制行尾部分号的,)
  562. "semi": [
  563. 2,
  564. "always"
  565. ],
  566. // 强制分号之前和之后使用一致的空格
  567. "semi-spacing": 0,
  568. // 要求同一个声明块中的变量按顺序排列
  569. "sort-vars": 0,
  570. // 强制在块之前使用一致的空格
  571. "space-before-blocks": [
  572. 2,
  573. "always"
  574. ],
  575. // 强制在 function的左括号之前使用一致的空格
  576. "space-before-function-paren": [
  577. 0,
  578. "always"
  579. ],
  580. // 强制在圆括号内使用一致的空格
  581. "space-in-parens": [
  582. 2,
  583. "never"
  584. ],
  585. // 要求操作符周围有空格
  586. "space-infix-ops": 2,
  587. // 强制在一元操作符前后使用一致的空格
  588. "space-unary-ops": [
  589. 2,
  590. {
  591. "words": true,
  592. "nonwords": false
  593. }
  594. ],
  595. // 强制在注释中 // 或 /* 使用一致的空格
  596. "spaced-comment": [
  597. 2,
  598. "always",
  599. {
  600. "markers": [
  601. "global",
  602. "globals",
  603. "eslint",
  604. "eslint-disable",
  605. "*package",
  606. "!"
  607. ]
  608. }
  609. ],
  610. // 要求或禁止 Unicode BOM
  611. "unicode-bom": 0,
  612. // 要求正则表达式被括号括起来
  613. "wrap-regex": 0,
  614. //////////////
  615. // ES6.相关 //
  616. //////////////
  617. // 要求箭头函数体使用大括号
  618. "arrow-body-style": 2,
  619. // 要求箭头函数的参数使用圆括号
  620. "arrow-parens": 2,
  621. "arrow-spacing": [
  622. 2,
  623. {
  624. "before": true,
  625. "after": true
  626. }
  627. ],
  628. // 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也会提示
  629. "constructor-super": 0,
  630. // 强制 generator 函数中 * 号周围使用一致的空格
  631. "generator-star-spacing": [
  632. 2,
  633. {
  634. "before": true,
  635. "after": true
  636. }
  637. ],
  638. // 禁止修改类声明的变量
  639. "no-class-assign": 2,
  640. // 不允许箭头功能,在那里他们可以混淆的比较
  641. "no-confusing-arrow": 0,
  642. // 禁止修改 const 声明的变量
  643. "no-const-assign": 2,
  644. // 禁止类成员中出现重复的名称
  645. "no-dupe-class-members": 2,
  646. // 不允许复制模块的进口
  647. "no-duplicate-imports": 0,
  648. // 禁止 Symbol 的构造函数
  649. "no-new-symbol": 2,
  650. // 允许指定模块加载时的进口
  651. "no-restricted-imports": 0,
  652. // 禁止在构造函数中,在调用 super() 之前使用 this 或 super
  653. "no-this-before-super": 2,
  654. // 禁止不必要的计算性能键对象的文字
  655. "no-useless-computed-key": 0,
  656. // 要求使用 let 或 const 而不是 var
  657. "no-var": 0,
  658. // 要求或禁止对象字面量中方法和属性使用简写语法
  659. "object-shorthand": 0,
  660. // 要求使用箭头函数作为回调
  661. "prefer-arrow-callback": 0,
  662. // 要求使用 const 声明那些声明后不再被修改的变量
  663. "prefer-const": 0,
  664. // 要求在合适的地方使用 Reflect 方法
  665. "prefer-reflect": 0,
  666. // 要求使用扩展运算符而非 .apply()
  667. "prefer-spread": 0,
  668. // 要求使用模板字面量而非字符串连接
  669. "prefer-template": 0,
  670. // Suggest using the rest parameters instead of arguments
  671. "prefer-rest-params": 0,
  672. // 要求generator 函数内有 yield
  673. "require-yield": 0,
  674. // enforce spacing between rest and spread operators and their expressions
  675. "rest-spread-spacing": 0,
  676. // 强制模块内的 import 排序
  677. "sort-imports": 0,
  678. // 要求或禁止模板字符串中的嵌入表达式周围空格的使用
  679. "template-curly-spacing": 1,
  680. // 强制在 yield* 表达式中 * 周围使用空格
  681. "yield-star-spacing": 2
  682. }
  683. }

配置讲解

  1. /**
  2. * 参考文档
  3. * 【eslint英文文档】https://eslint.org/docs/user-guide/configuring
  4. * 【eslint中文文档】http://eslint.cn/docs/rules/
  5. */
  6. /**
  7. * eslint有三种使用方式
  8. * 【1】js代码中通过注释的方式使用
  9. * 【2】通过webpack的eslintConfig字段设置,eslint会自动搜索项目的package.json文件中的配置
  10. * 【3】通过配置文件的方式使用,配置文件有多种文件方式,如JavaScript、JSON 或者 YAML等
  11. */
  12. /**
  13. * 文件忽略
  14. * 【】让eslint跳过特定文件的检测
  15. * 【】通过当前工作目录下 「.eslintignore」 文件进行设置
  16. * 其使用的是Glob路径书写方式,与「.gitignore」的使用方法相同
  17. * 【】也可以在 package.json 文件中,通过 eslintIgnore 参数进行设置
  18. */
  19. /**
  20. * 文件内局部设置
  21. * 【】eslint可以具体文件中设置特定代码的规则,常用于跳过某条语句的检测。
  22. * 【】注销全部规则,在代码前新建一行,添加注销 /* eslint-disable *\/ 。如果没有恢复设置的语句,则下列全部代码都会跳过检测。
  23. * 【】恢复eslint,在代码前新建一行,添加注销 /* eslint-enable *\/
  24. * 【】指定忽略的规则,/* eslint-disable no-alert, no-console *\/
  25. * 【】在特定行禁用,// eslint-disable-line
  26. * 【】在下一行禁用,// eslint-disable-next-line
  27. */
  28. module.exports = {
  29. /**
  30. * 根目录标识
  31. * http://eslint.cn/docs/user-guide/configuring#using-configuration-files
  32. * http://eslint.cn/docs/user-guide/configuring#configuration-cascading-and-hierarchy
  33. * 【】标识当前配置文件为最底层的文件,无需往更上一级的文件目录中进行搜索
  34. * 【】默认eslint的配置文件搜索方式是,从目标文件夹进行搜索,遍历内部每一个文件夹,找到配置文件并层叠使用。再跳出本项目,往祖先文件夹进行遍历
  35. * 【】注意「~/.eslintrc」的意义,「~」是指linux上的家目录,「~/.eslintrc」是指家目录下的eslint配置文件,用于私人开发者,用于整个电脑全局约束的。这个配置通过本配置项root去设置,设置了root,eslint检测时将不会再往上搜索
  36. * 【】eslint的生效规则是就近使用,越近的配置项优先级越高,覆盖其他配置项。如一个项目中,可以在不同文件夹中都添加配置文件,这些规则将重叠组合生效
  37. */
  38. root: true, // 标识当前配置文件为eslint的根配置文件,让其停止在父级目录中继续寻找。
  39. /**
  40. * 解析器
  41. * http://eslint.cn/docs/user-guide/configuring#specifying-parser
  42. * 【】ESLint 默认使用Espree作为其解析器
  43. * 【】解析器必须是本地安装的一个 npm 模块。即必须按照在本地的node_module中
  44. * 【】解析器是用于解析js代码的,怎么去理解每一个表达式,有点C++中编译器的概念,会对js进行一些语法分析,语义分析什么的,才能判断语句符不符合规范。而不是通过简单的字符串对比。
  45. * 【】解析器有很多,但兼容eslint的解析器有以下几个
  46. * Espree:默认解析器,一个从Esprima中分离出来的解析器,做了一些优化
  47. * Esprima:js标准解析器
  48. * Babel-ESLint: 一个对Babel解析器的包装,babel本身也是js解析器的一种(不然怎么能转化为兼容性代码呢?首先需要进行js解析,才能转化)。如果我们的代码需要经过babel转化,则对应使用这个解析器
  49. * typescript-eslint-parser(实验) - 一个把 TypeScript 转换为 ESTree 兼容格式的解析器
  50. * 【】但是通常在vue项目中,并不会写在 parser 字段中,而是写在 parserOptions -> parser。具体原因在 parserOptions 一栏中介绍
  51. */
  52. // parser: 'babel-eslint',
  53. /**
  54. * 解析器配置项
  55. * http://eslint.cn/docs/user-guide/configuring#specifying-parser-options
  56. * 【】这里设置的配置项将会传递到解析器中,被解析器获取到,进行一定的处理。具体被利用到,要看解析器的源码有没有对其进行利用。这里仅仅做了参数定义,做了规定,告诉解析器的开发者可能有这些参数
  57. * 【】配置项目有:
  58. * "sourceType": "module", // 指定JS代码来源的类型,script(script标签引入?) | module(es6的module模块),默认为script。为什么vue的会使用script呢?因为vue是通过babel-loader编译的,而babel编译后的代码就是script方式
  59. * "ecmaVersion": 6, // 支持的ES语法版本,默认为5。注意只是语法,不包括ES的全局变量。全局变量需要在env选项中进行定义
  60. * "ecmaFeatures": { // Features是特征的意思,这里用于指定要使用其他那些语言对象
  61. "experimentalObjectRestSpread": true, //启用对对象的扩展
  62. "jsx": true, //启用jsx语法
  63. "globalReturn":true, //允许return在全局使用
  64. "impliedStrict":true //启用严格校验模式
  65. }
  66. */
  67. parserOptions: {
  68. /**
  69. * 这里出现 parser 的原因
  70. * 【】首先明确一点,官方说明中,parserOptions的配置参数是不包括 parser 的
  71. * 【】这里的写 parser 是 eslint-plugin-vue 的要求,是 eslint-plugin-vue 的自定义参数
  72. * 【】根据官方文档,eslint-plugin-vue 插件依赖 「vue-eslint-parser」解析器。「vue-eslint-parser」解析器,只解析 .vue 中html部分的内容,不会检测<script>中的JS内容。
  73. * 【】由于解析器只有一个,用了「vue-eslint-parser」就不能用「babel-eslint」。所以「vue-eslint-parser」的做法是,在解析器选项中,再传入一个解析器选项parser。从而在内部处理「babel-eslint」,检测<script>中的js代码
  74. * 【】所以这里出现了 parser
  75. * 【】相关文档地址,https://vuejs.github.io/eslint-plugin-vue/user-guide/#usage
  76. */
  77. parser: 'babel-eslint',
  78. },
  79. /**
  80. * 运行环境
  81. * http://eslint.cn/docs/user-guide/configuring#specifying-environments
  82. * 【】一个环境定义了一组预定义的全局变量
  83. * 【】获得了特定环境的全局定义,就不会认为是开发定义的,跳过对其的定义检测。否则会被认为改变量未定义
  84. * 【】常见的运行环境有以下这些,更多的可查看官网
  85. * browser - 浏览器环境中的全局变量。
  86. * node - Node.js 全局变量和 Node.js 作用域。
  87. * es6 - 启用除了 modules 以外的所有 ECMAScript 6 特性(该选项会自动设置 ecmaVersion 解析器选项为 6)。
  88. * amd - 将 require() 和 define() 定义为像 amd 一样的全局变量。
  89. * commonjs - CommonJS 全局变量和 CommonJS 作用域 (用于 Browserify/WebPack 打包的只在浏览器中运行的代码)。
  90. * jquery - jQuery 全局变量。
  91. * mongo - MongoDB 全局变量。
  92. * worker - Web Workers 全局变量。
  93. * serviceworker - Service Worker 全局变量。
  94. */
  95. env: {
  96. browser: true, // 浏览器环境
  97. },
  98. /**
  99. * 全局变量
  100. * http://eslint.cn/docs/user-guide/configuring#specifying-globals
  101. * 【】定义额外的全局,开发者自定义的全局变量,让其跳过no-undef 规则
  102. * 【】key值就是额外添加的全局变量
  103. * 【】value值用于标识该变量能否被重写,类似于const的作用。true为允许变量被重写
  104. * 【】注意:要启用no-global-assign规则来禁止对只读的全局变量进行修改。
  105. */
  106. globals: {
  107. // gTool: true, // 例如定义gTool这个全局变量,且这个变量可以被重写
  108. },
  109. /**
  110. * 插件
  111. * http://eslint.cn/docs/user-guide/configuring#configuring-plugins
  112. * 【】插件同样需要在node_module中下载
  113. * 【】注意插件名忽略了「eslint-plugin-」前缀,所以在package.json中,对应的项目名是「eslint-plugin-vue」
  114. * 【】插件的作用类似于解析器,用以扩展解析器的功能,用于检测非常规的js代码。也可能会新增一些特定的规则。
  115. * 【】如 eslint-plugin-vue,是为了帮助我们检测.vue文件中 <template> 和 <script> 中的js代码
  116. */
  117. plugins: ['vue'],
  118. /**
  119. * 规则继承
  120. * http://eslint.cn/docs/user-guide/configuring#extending-configuration-files
  121. *【】可继承的方式有以下几种
  122. *【】eslint内置推荐规则,就只有一个,即「eslint:recommended」
  123. *【】可共享的配置, 是一个 npm 包,它输出一个配置对象。即通过npm安装到node_module中
  124. * 可共享的配置可以省略包名的前缀 eslint-config-,即实际设置安装的包名是 eslint-config-airbnb-base
  125. *【】从插件中获取的规则,书写规则为 「plugin:插件包名/配置名」,其中插件报名也是可以忽略「eslint-plugin-」前缀。如'plugin:vue/essential'
  126. *【】从配置文件中继承,即继承另外的一个配置文件,如'./node_modules/coding-standard/eslintDefaults.js'
  127. */
  128. extends: [
  129. /**
  130. * vue 的额外添加的规则是 v-if, v-else 等指令检测
  131. */
  132. 'plugin:vue/essential', // 额外添加的规则可查看 https://vuejs.github.io/eslint-plugin-vue/rules/
  133. /**
  134. * 「airbnb,爱彼迎」
  135. * 【】有两种eslint规范,一种是自带了react插件的「eslint-config-airbnb」,一种是基础款「eslint-config-airbnb-base」,
  136. * 【】airbnb-base 包括了ES6的语法检测,需要依赖 「eslint-plugin-import」
  137. * 【】所以在使用airbnb-base时,需要用npm额外下载 eslint-plugin-import
  138. * 【】所以eslint实际上已经因为 airbnb-base 基础配置项目,添加上了 eslint-plugin-import 插件配置
  139. * 【】所以在setting和rules里,都有 'import/xxx' 项目,这里修改的就是 eslint-plugin-import 配置
  140. */
  141. // 'airbnb-base',
  142. ],
  143. /**
  144. * 规则共享参数
  145. * http://eslint.cn/docs/user-guide/configuring#adding-shared-settings
  146. * 【】提供给具体规则项,每个参数值,每个规则项都会被注入该变量,但对应规则而言,有没有用,就看各个规则的设置了,就好比 parserOptions,解析器用不用它就不知道了。这里只是提供这个方法
  147. * 【】不用怀疑,经源码验证,这就是传递给每个规则项的,会当做参数传递过去,但用不用,就是具体规则的事情
  148. */
  149. settings: {
  150. /**
  151. *
  152. * 注意,「import/resolver」并不是eslint规则项,与rules中的「import/extensions」不同。它不是规则项
  153. * 这里只是一个参数名,叫「import/resolver」,会传递给每个规则项。
  154. * settings并没有具体的书写规则,「import/」只是import模块自己起的名字,原则上,它直接命名为「resolver」也可以,加上「import」只是为了更好地区分。不是强制设置的。
  155. * 因为「import」插件很多规则项都用的这个配置项,所以并没有通过rules设置,而是通过settings共享
  156. * 具体使用方法可参考https://github.com/benmosher/eslint-plugin-import
  157. */
  158. 'import/resolver': {
  159. /**
  160. * 这里传入webpack并不是import插件能识别webpack,而且通过npm安装了「eslint-import-resolver-webpack」,
  161. * 「import」插件通过「eslint-import-resolver-」+「webpack」找到该插件并使用,就能解析webpack配置项。使用里面的参数。
  162. * 主要是使用以下这些参数,共享给import规则,让其正确识别import路径
  163. * extensions: ['.js', '.vue', '.json'],
  164. * alias: {
  165. * 'vue$': 'vue/dist/vue.esm.js',
  166. * '@': resolve('src'),
  167. * 'static': resolve('static')
  168. * }
  169. */
  170. webpack: {
  171. config: 'build/webpack.base.conf.js'
  172. }
  173. }
  174. },
  175. /**
  176. * 针对特定文件的配置
  177. * 【】可以通过overrides对特定文件进行特定的eslint检测
  178. * 【】特定文件的路径书写使用Glob格式,一个类似正则的路径规则,可以匹配不同的文件
  179. * 【】配置几乎与 ESLint 的其他配置相同。覆盖块可以包含常规配置中的除了 extends、overrides 和 root 之外的其他任何有效配置选项,
  180. */
  181. // overrides: [
  182. // {
  183. // 'files': ['bin/*.js', 'lib/*.js'],
  184. // 'excludedFiles': '*.test.js',
  185. // 'rules': {
  186. // 'quotes': [2, 'single']
  187. // }
  188. // }
  189. // ],
  190. /**
  191. * 自定义规则
  192. * http://eslint.cn/docs/user-guide/configuring#configuring-rules
  193. * 【】基本使用方式
  194. * "off" 或者0 关闭规则
  195. * "warn" 或者1 将规则打开为警告(不影响退出代码)
  196. * "error" 或者2 将规则打开为错误(触发时退出代码为1)
  197. * 如:'no-restricted-syntax': 0, // 表示关闭该规则
  198. * 【】如果某项规则,有额外的选项,可以通过数组进行传递,而数组的第一位必须是错误级别。如0,1,2
  199. * 如 'semi': ['error', 'never'], never就是额外的配置项
  200. */
  201. rules: {
  202. /**
  203. * 具体规则
  204. * 【】具体的规则太多,就不做介绍了,有兴趣的同学可以上eslint官网查
  205. * 【】注意 xxx/aaa 这些规则是 xxx 插件自定的规则,在eslint官网是查不到的。需要到相应的插件官网中查阅
  206. * 【】如 import/extensions,这是「eslint-plugin-import」自定义的规则,需要到其官网查看 https://github.com/benmosher/eslint-plugin-import
  207. */
  208. /**
  209. * 逻辑错误及最佳实践的规则
  210. */
  211. 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止debugger
  212. 'no-console': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止console
  213. 'no-alert': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止console
  214. "for-direction": 2, // 禁止for无限循环
  215. "no-compare-neg-zero": 2, // 禁止与-0进行比较
  216. 'no-cond-assign': 2, // 禁止条件语句中出现赋值语句
  217. "no-control-regex": 2, // 在 ASCII 中,0-31 范围内的控制字符是特殊的、不可见的字符。这些字符很少被用在 JavaScript 字符串中,所以一个正则表达式如果包含这些字符的,很有可能一个错误。
  218. "no-dupe-args": 2, // 禁止在函数定义或表达中出现重名参数
  219. "no-dupe-keys": 2, // 禁止在对象字面量中出现重复的键
  220. "no-duplicate-case": 2, // 禁止重复 case 标签
  221. "no-empty": 2, // 禁止空块语句
  222. "no-empty-character-class": 2, // 禁止在正则表达式中出现空字符集
  223. "no-ex-assign": 2, // 禁止对 catch 子句中的异常重新赋值。因为catch出来的都是错误信息,不需要重新赋值
  224. "no-extra-boolean-cast": 2, // 禁止不必要的布尔类型转换,如 !!true
  225. "no-extra-semi": 2, // 禁用不必要的分号
  226. "no-inner-declarations": 2, // ??? 禁止在嵌套的语句块中出现变量
  227. "no-regex-spaces": 2, // 禁止正则表达式字面量中出现多个空格
  228. "no-obj-calls": 2, // 禁止将全局对象当作函数进行调用
  229. "no-prototype-builtins": 2, // ??? 禁止直接在对象实例上调用 Object.prototype 的一些方法。
  230. "no-template-curly-in-string": 2, // 禁止在常规字符串中出现模板字面量占位符语法
  231. "semi": [2, 'never'], // ??? 强制是否使用分号。
  232. "no-unexpected-multiline": 2, // 禁止使用令人困惑的多行表达式
  233. "no-unreachable": 2, // 禁止在 return、throw、continue 和 break 语句后出现不可达代码
  234. "use-isnan": 2, // 要求调用 isNaN()检查 NaN
  235. "no-unsafe-negation": 2, // 禁止对关系运算符的左操作数使用否定操作符
  236. "valid-jsdoc": 2, // 强制使用有效的 JSDoc 注释
  237. "valid-typeof": 2, // 强制 typeof 表达式与有效的字符串进行比较
  238. "array-callback-return": 2, // 强制数组方法的回调函数中有 return 语句
  239. "block-scoped-var": 2, // 把 var 语句看作是在块级作用域范围之内
  240. "complexity": [1, 6], // 添加复杂度
  241. "curly": 2, // ??? 要求遵循大括号约定
  242. "default-case": 1, // 要求 Switch 语句中有 Default 分支
  243. "dot-location": [2, 'property'], // 强制在点号之前换行
  244. "dot-notation": 2, // 点号和字面量,优先使用点号
  245. "eqeqeq": [2, 'smart'], // ??? 要求使用 === 和 !==
  246. "guard-for-in": 2, // ??? 需要约束 for-in
  247. "no-caller": 2, // 禁用 caller 或 callee
  248. "no-empty-function": 2, // 禁止出现空函数
  249. "no-empty-pattern": 2, // 禁止使用空解构模式
  250. "no-eval": 2, // 禁用 eval()
  251. "no-global-assign": 2, // 禁止对原生对象或只读的全局对象进行赋值
  252. "no-floating-decimal": 2, // ?? 禁止浮点小数
  253. "no-fallthrough": 2, // 禁止 case 语句落空
  254. "no-labels": 2, // 禁用标签语句
  255. "no-extra-label": 2, // 禁用不必要的标签
  256. "no-extra-bind": 2, // 禁止不必要的函数绑定
  257. "no-iterator": 2, // 禁用迭代器
  258. "no-lone-blocks": 2, // 禁用不必要的嵌套块
  259. "no-loop-func": 2, // 禁止循环中存在函数
  260. "no-magic-numbers": [2, {
  261. ignoreArrayIndexes: true,
  262. ignore: [-1, 0, 1, 2],
  263. }], // 禁止使用魔术数字,魔术数字是在代码中多次出现的没有明确含义的数字。它最好由命名常量取代。
  264. "no-multi-spaces": 2, // 禁止出现多个空格
  265. "no-multi-str": 2, // 禁止多行字符串
  266. "no-new": 2, // 禁止在不保存实例的情况下使用new
  267. "no-new-func": 2, // 禁用Function构造函数
  268. "no-new-wrappers": 2, // 禁止原始包装实例
  269. "no-octal": 2, // 禁用八进制字面量
  270. "no-octal-escape": 2, // 禁止在字符串字面量中使用八进制转义序列
  271. "no-param-reassign": 2, // ??? 禁止对函数参数再赋值
  272. "no-proto": 2, // 禁用__proto__,改用 getPrototypeOf 方法替代 __proto__。
  273. "no-redeclare": 2, // 禁止重新声明变量
  274. "no-return-assign": 2, // 禁止在返回语句中赋值
  275. "no-return-await": 2, // 禁用不必要的 return await
  276. "no-script-url": 2, // 禁用 Script URL
  277. "no-self-assign": 2, // 禁止自身赋值
  278. "no-sequences": 2, // ??? 不允许使用逗号操作符
  279. "no-throw-literal": 2, // 限制可以被抛出的异常
  280. "no-unmodified-loop-condition": 2, // 禁用一成不变的循环条件
  281. "no-useless-call": 2, // 禁用不必要的 .call() 和 .apply()
  282. "no-useless-concat": 2, // 禁止没有必要的字符拼接
  283. "no-useless-escape": 2, // 禁用不必要的转义
  284. "no-useless-return": 2, // 禁止多余的 return 语句
  285. "no-void": 2, // 禁止使用void操作符
  286. "no-with": 2, // 禁用 with 语句
  287. "prefer-promise-reject-errors": 1, // ??? 要求使用 Error 对象作为 Promise 拒绝的原因
  288. "radix": 1, // 要求必须有基数
  289. "require-await": 2, // 禁止使用不带 await 表达式的 async 函数
  290. "vars-on-top": 2, // 要求将变量声明放在它们作用域的顶部
  291. "wrap-iife": [2, 'inside'], // 需要把立即执行的函数包裹起来
  292. "strict": [2, 'global'], // 要求或禁止使用严格模式指令
  293. /**
  294. * 变量相关的规则
  295. */
  296. "init-declarations": 2, // ??? 强制或禁止变量声明语句中初始化
  297. "no-delete-var": 2, // 禁止删除变量
  298. "no-shadow": 2, // 禁止变量声明覆盖外层作用域的变量
  299. "no-shadow-restricted-names": 2, // 关键字不能被遮蔽
  300. "no-undef": 2, // 禁用未声明的变量
  301. "no-unused-vars": 1, // ??? 禁止未使用过的变量
  302. "no-use-before-define": 2, // 禁止定义前使用
  303. // 代码风格
  304. "array-bracket-newline": [2, 'consistent'], // 在数组开括号后和闭括号前强制换行
  305. "array-bracket-spacing": 2, // 强制在括号内前后使用空格
  306. "array-element-newline": [2, { multiline: true }], // ??? 强制数组元素间出现换行
  307. "block-spacing": 2, // 强制在代码块中开括号前和闭括号后有空格
  308. "brace-style": 2, // 大括号风格要求
  309. "camelcase": 2, // 要求使用骆驼拼写法
  310. "comma-dangle": [2, 'always-multiline'], // 要求或禁止使用拖尾逗号
  311. "comma-spacing": 2, // 强制在逗号周围使用空格
  312. "comma-style": 2, // 逗号风格
  313. "computed-property-spacing": 2, // 禁止或强制在计算属性中使用空格
  314. "consistent-this": [2, 'self'], // ??? 要求一致的 This
  315. "eol-last": [1, 'always'], // ??? 要求或禁止文件末尾保留一行空行
  316. "func-call-spacing": 2, // 要求或禁止在函数标识符和其调用之间有空格
  317. "func-style": [2, 'declaration'], // ??? 强制 function 声明或表达式的一致性
  318. "function-paren-newline": [1, 'multiline'], // 强制在函数括号内使用一致的换行
  319. "indent": [2, 2], // 强制使用一致的缩进
  320. "jsx-quotes": 2, // 强制在 JSX 属性中一致地使用双引号或单引号
  321. "key-spacing": 2, // 强制在对象字面量的键和值之间使用一致的空格
  322. "keyword-spacing": 2, // 强制关键字周围空格的一致性
  323. "linebreak-style": 2, // 强制使用一致的换行符风格,用\n,不用\r\n
  324. "lines-around-comment": 2, // 强制注释周围有空行
  325. "lines-between-class-members": 2, // 要求在类成员之间出现空行
  326. "max-depth": 2, // 强制块语句的最大可嵌套深度
  327. "max-len": [2, { // 强制行的最大长度
  328. "code": 100,
  329. "tabWidth": 4,
  330. "ignoreUrls": true,
  331. "ignoreTrailingComments": true,
  332. "ignoreTemplateLiterals": true,
  333. }], //
  334. "max-lines": [2, 1000], // ??? 强制文件的最大行数
  335. "max-nested-callbacks": [2, 5], // 强制回调函数最大嵌套深度
  336. "max-statements-per-line": 2, // 强制每一行中所允许的最大语句数量
  337. "multiline-comment-style": 1, // 强制对多行注释使用特定风格
  338. "new-cap": 2, // 要求构造函数首字母大写
  339. "new-parens": 2, // 要求调用无参构造函数时带括号
  340. "newline-per-chained-call": 2, // 要求方法链中每个调用都有一个换行符
  341. "no-bitwise": 2, // 禁止使用按位操作符
  342. "no-inline-comments": 0, // ??? 禁止使用内联注释
  343. "no-lonely-if": 2, // 禁止 if 语句作为唯一语句出现在 else 语句块中
  344. "no-mixed-spaces-and-tabs": 2, // 禁止使用 空格 和 tab 混合缩进
  345. "no-multiple-empty-lines": 1, // ??? 不允许多个空行
  346. "no-negated-condition": 2, // 禁用否定表达式
  347. "no-nested-ternary": 2, // 禁止使用嵌套的三元表达式
  348. "no-new-object": 2, // 禁止使用 Object 构造函数
  349. "no-trailing-spaces": 2, // 禁用行尾空白
  350. "no-underscore-dangle": 2, // 禁止标识符中有悬空下划线
  351. "quotes": [2, 'single'], // 强制使用一致的单引号
  352. "quote-props": [2, 'as-needed'], // ??? 要求对象字面量属性名称使用引号
  353. "operator-linebreak": [2, 'before'], // 强制操作符使用一致的换行符风格
  354. "one-var": [2, 'never'], // ??? 强制函数中的变量在一起声明或分开声明
  355. "object-property-newline": 1, // ??? 强制将对象的属性放在不同的行上
  356. "object-curly-spacing": [2, 'always'], // 强制在花括号中使用一致的空格
  357. "object-curly-newline": [1, { // ??? 对象属性换行
  358. multiline: true,
  359. }], //
  360. "no-whitespace-before-property": 2, // 禁止属性前有空白
  361. "no-unneeded-ternary": 2, // 禁止可以表达为更简单结构的三元操作符
  362. "semi-spacing": 2, // 强制分号前后有空格
  363. "semi-style": 2, // 分号风格
  364. "space-before-blocks": [2, 'always'], // 禁止语句块之前的空格
  365. "space-before-function-paren": [2, 'never'], // 禁止函数圆括号之前有一个空格
  366. "space-in-parens": 2, // 禁止或强制圆括号内的空格
  367. "space-infix-ops": 2, // 要求中缀操作符周围有空格
  368. "space-unary-ops": 2, // 禁止在一元操作符之前或之后存在空格
  369. "spaced-comment": 2, // 要求在注释前有空白
  370. "switch-colon-spacing": 2, // 强制在 switch 的冒号左右有空格
  371. "template-tag-spacing": 2, // 要求在模板标记和它们的字面量之间有空格
  372. /**
  373. * ES6相关规则
  374. */
  375. "arrow-parens": [2, 'as-needed'], // 要求箭头函数的参数使用圆括号
  376. "arrow-body-style": 2, // 要求箭头函数体使用大括号
  377. "arrow-spacing": 2, // 要求箭头函数的箭头之前或之后有空格
  378. "generator-star-spacing": 2, // ??? 强制 generator 函数中 * 号周围有空格
  379. "no-class-assign": 2, // 不允许修改类声明的变量
  380. "no-confusing-arrow": 2, // 禁止在可能与比较操作符相混淆的地方使用箭头函数
  381. "no-const-assign": 2, // 不允许改变用const声明的变量
  382. "no-dupe-class-members": 2, // 不允许类成员中有重复的名称
  383. "no-duplicate-imports": 2, // 禁止重复导入
  384. "no-new-symbol": 0, // 禁止 Symbol 操作符和 new 一起使用lines-between
  385. "no-useless-computed-key": 2, // 禁止在对象中使用不必要的计算属性
  386. "no-useless-constructor": 2, // 禁用不必要的构造函数
  387. "no-useless-rename": 2, // 禁止在 import 和 export 和解构赋值时将引用重命名为相同的名字
  388. "no-var": 2, // 要求使用 let 或 const 而不是 var
  389. "object-shorthand": 2, // 要求对象字面量简写语法
  390. "prefer-arrow-callback": 2, // 要求使用箭头函数作为回调
  391. "prefer-const": 1, // ??? 建议使用const
  392. "prefer-destructuring": [2, { // 优先使用数组和对象解构
  393. "array": false,
  394. "object": true
  395. }],
  396. "prefer-rest-params": 2, // 使用剩余参数代替 arguments
  397. "prefer-spread": 2, // 建议使用扩展运算符而非.apply()
  398. "prefer-template": 2, // 建议使用模板而非字符串连接
  399. "require-yield": 2, // 禁用函数内没有yield的 generator 函数
  400. "rest-spread-spacing": 2, // 强制剩余和扩展运算符及其表达式之间有空格
  401. "template-curly-spacing": 2, // 强制模板字符串中空格的使用
  402. "sort-imports": [0, { // ??? import 排序 问题是要以字母排序
  403. ignoreCase: true,
  404. ignoreMemberSort: true,
  405. memberSyntaxSortOrder: ['all', 'single', 'multiple', 'none']
  406. }], //
  407. }
  408. };