当前位置:   article > 正文

【最佳实践】Eslint 配置、使用技巧、代码检查的过程、肝这一篇就够了!_eslint.config.mjs

eslint.config.mjs

大家好,我是DX3906

目录

Eslint 配置

文件配置

.eslintrc.js 或者eslint.config.mjs 文件

eslintrc 总配置参考文档,按需使用:

在vscode中使用eslint插件

配置.eslintignore 文件

在setting中搜所eslint

代码检查的过程通常如下【面试题】:

结语


ESLint 是一个插件化的静态代码分析工具,用于识别 JavaScript 代码中的问题。它在代码质量和编码风格方面有助于保持一致性。

Eslint 配置

  • 安装:npm install -g eslint
  • 初始化:eslint --init

1.这里选:To check syntax and find problems【检查语法并查找问题

2.这里选:JavaScript modules【JavaScript模块(ECMAScript Modules,简称ESM)

3.您的项目使用哪个框架?按需选择 【React或者Vue】

4.你的项目使用TypeScript吗?按需选择【Ts或者Js】

5.你的代码在哪里运行?按 a 都选上(a 选择所有,i 反选全部)

6.您想现在安装它们吗?选择 YES

7.您想使用哪个包管理器?选择 npm或者yarn

文件配置

.eslintrc.js 或者eslint.config.mjs 文件
  • 安装结束后,项目根目录下多出了新的文件 .eslintrc.js,修改如下:

  • react 项目配置

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

vscode中使用eslint插件

配置.eslintignore 文件
  • 没有则需要新建一个 .eslintignore
  1. # npm包
  2. /node_modules
  3. package-lock.json
  4. # build产物
  5. /dist
  6. /types
  7. # eslint
  8. .eslintcache
  9. # jest
  10. /coverage
  11. # docs api文档
  12. /docs
  13. # webpack 配置
  14. /scripts
  15. #webstorm
  16. .idea
  17. # 自动引入生成文件
  18. auto-imports.d.ts
  19. components.d.ts

在setting中搜所eslint

代码检查的过程通常如下【面试题】:


1、配置:首先需要为 ESLint 提供一套规则,这些规则可以在.eslintrc配置文件中定义,或者在项目的package.json文件中的eslintConfig字段里指定。规则可以继承自一套已有的规则集,如eslint:recommended,或者可以是一个流行的样式指南,如airbnb。也可以是自定义的规则集。
2、解析:当运行 ESLint 时,它会使用一个解析器(如espree,默认的解析器)来解析代码,将代码转换成一个抽象语法树(AST)。AST 是代码结构的一个树状表示,能让 ESLint 理解代码的语义结构。
3、遍历:一旦代码被转换成 AST,ESLint 则会遍历该树。它会查找树的每个节点,检查是否有任何规则适用于该节点。在遍历过程中,如果发现违反了某项规则,ESLint 将记录一个问题(通常称为“lint 错误”)。
4、报告:在遍历完整个 AST 之后,ESLint 会生成一份报告。这份报告详细说明了它在代码中找到的任何问题。这些问题会被分类为错误或警告,根据配置设置的不同,某些问题可能会阻止构建过程或者被忽略。
5、修复:对于某些类型的问题,ESLint 提供了自动修复的功能。这意味着你可以让 ESLint 尝试自动修复它所发现的问题,不需人工干预。
6、集成: ESLint 可以集成到 IDE 中,这样就可以在代码编写过程中即时提供反馈。它也可以被集成到构建工具如 Webpack 或任务运行器 Grunt、Gulp 中,作为构建过程或提交代码到版本控制系统前的一个步骤。
通过以上步骤,ESLint 帮助开发者在编码过程中遵循一致的风格和避免出现潜在的错误。

结语

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/896915
推荐阅读
相关标签