vlambda博客
学习文章列表

vscode统一项目代码规范

代码规范对于团队合作开发来说是一件非常重要的事,利用vscode,vetur,prettier,eslint来统一检测代码。

vscode 的 format

ctrl+, 打开首选项,输入 format,可以看到vscode提供了 html, js的 format 功能。

需要其他语言的format功能?

可以通过Extensions来扩展vscode的code format功能,vscode marketplace提供了丰富的Extensions来满足开发者的需求。

Prettier

Prettier is an opinionated code formatter. It enforces a consistent style by parsing your code and re-printing it with its own rules that take the maximum line length into account, wrapping code when necessary.

JavaScript·TypeScript·Flow·JSX·JSONCSS·SCSS·LessTML·Vue·AngularGraphQL·Markdown·YAML...

vscode 默认的 code formatter 与 prettier 产生冲突?

settings.json设置

 
   
   
 
  1. {

  2. // 为所有类型文件都应用prettierformatter

  3. "editor.defaultFormatter": "esbenp.prettier-vscode",

  4. // 为指定的类型文件设置

  5. "[javascript]": {

  6. "editor.defaultFormatter": "esbenp.prettier-vscode"

  7. }

  8. }

Eslint

ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误。代码的风格检测个语法检测。

项目中安装eslint及相关的包,并且给 vscode 安装 eslint 插件
 
   
   
 
  1. npm install eslint --save-dev

 
   
   
 
  1. npx eslint --init

运行 npx eslint--init 之后, .eslintrc 文件会在你的项目中自动创建。此时在vscode中的终端 问题里面是没有的检测问题输出的,需要安装Eslint来扩展支持的。

注意:

  1. ESLint 支持使用第三方插件。在使用插件之前,你必须使用 npm 安装它

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

vscode

pretter 与 eslint 冲突

关于这个问题,Prettier团队成员给出的解决方案https://github.com/prettier/prettier-vscode/issues/958

 
   
   
 
  1. npm install --save-dev prettier-eslint

Eslint配置详细解析

 
   
   
 
  1. /**

  2. * 参考文档

  3. * eslint英文文档】https://eslint.org/docs/user-guide/configuring

  4. * eslint中文文档】http://eslint.cn/docs/rules/

  5. */

  6. /**

  7. * eslint有三种使用方式

  8. * 1js代码中通过注释的方式使用

  9. * 2】通过webpackeslintConfig字段设置,eslint会自动搜索项目的package.json文件中的配置

  10. * 3】通过配置文件的方式使用,配置文件有多种文件方式,如JavaScriptJSON 或者 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. * Esprimajs标准解析器

  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标签引入?) | modulees6module模块),默认为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. */

  76. parser: 'babel-eslint',

  77. },

  78. /**

  79. * 运行环境

  80. * http://eslint.cn/docs/user-guide/configuring#specifying-environments

  81. * 【】一个环境定义了一组预定义的全局变量

  82. * 【】获得了特定环境的全局定义,就不会认为是开发定义的,跳过对其的定义检测。否则会被认为改变量未定义

  83. * 【】常见的运行环境有以下这些,更多的可查看官网

  84. * browser - 浏览器环境中的全局变量。

  85. * node - Node.js 全局变量和 Node.js 作用域。

  86. * es6 - 启用除了 modules 以外的所有 ECMAScript 6 特性(该选项会自动设置 ecmaVersion 解析器选项为 6)。

  87. * amd - require() define() 定义为像 amd 一样的全局变量。

  88. * commonjs - CommonJS 全局变量和 CommonJS 作用域 (用于 Browserify/WebPack 打包的只在浏览器中运行的代码)。

  89. * jquery - jQuery 全局变量。

  90. * mongo - MongoDB 全局变量。

  91. * worker - Web Workers 全局变量。

  92. * serviceworker - Service Worker 全局变量。

  93. */

  94. env: {

  95. browser: true, // 浏览器环境

  96. },

  97. /**

  98. * 全局变量

  99. * http://eslint.cn/docs/user-guide/configuring#specifying-globals

  100. * 【】定义额外的全局,开发者自定义的全局变量,让其跳过no-undef 规则

  101. * 【】key值就是额外添加的全局变量

  102. * 【】value值用于标识该变量能否被重写,类似于const的作用。true为允许变量被重写

  103. * 【】注意:要启用no-global-assign规则来禁止对只读的全局变量进行修改。

  104. */

  105. globals: {

  106. // gTool: true, // 例如定义gTool这个全局变量,且这个变量可以被重写

  107. },

  108. /**

  109. * 插件

  110. * http://eslint.cn/docs/user-guide/configuring#configuring-plugins

  111. * 【】插件同样需要在node_module中下载

  112. * 【】注意插件名忽略了「eslint-plugin-」前缀,所以在package.json中,对应的项目名是「eslint-plugin-vue

  113. * 【】插件的作用类似于解析器,用以扩展解析器的功能,用于检测非常规的js代码。也可能会新增一些特定的规则。

  114. * 【】如 eslint-plugin-vue,是为了帮助我们检测.vue文件中 <template> <script> 中的js代码

  115. */

  116. plugins: ['vue'],

  117. /**

  118. * 规则继承

  119. * http://eslint.cn/docs/user-guide/configuring#extending-configuration-files

  120. *【】可继承的方式有以下几种

  121. *【】eslint内置推荐规则,就只有一个,即「eslint:recommended

  122. *【】可共享的配置, 是一个 npm 包,它输出一个配置对象。即通过npm安装到node_module

  123. * 可共享的配置可以省略包名的前缀 eslint-config-,即实际设置安装的包名是 eslint-config-airbnb-base

  124. *【】从插件中获取的规则,书写规则为 plugin:插件包名/配置名」,其中插件报名也是可以忽略「eslint-plugin-」前缀。如'plugin:vue/essential'

  125. *【】从配置文件中继承,即继承另外的一个配置文件,如'./node_modules/coding-standard/eslintDefaults.js'

  126. */

  127. extends: [

  128. /**

  129. * vue 的额外添加的规则是 v-if, v-else 等指令检测

  130. */

  131. 'plugin:vue/essential', // 额外添加的规则可查看 https://vuejs.github.io/eslint-plugin-vue/rules/

  132. /**

  133. * airbnb,爱彼迎」

  134. * 【】有两种eslint规范,一种是自带了react插件的「eslint-config-airbnb」,一种是基础款「eslint-config-airbnb-base」,

  135. * 【】airbnb-base 包括了ES6的语法检测,需要依赖 eslint-plugin-import

  136. * 【】所以在使用airbnb-base时,需要用npm额外下载 eslint-plugin-import

  137. * 【】所以eslint实际上已经因为 airbnb-base 基础配置项目,添加上了 eslint-plugin-import 插件配置

  138. * 【】所以在settingrules里,都有 'import/xxx' 项目,这里修改的就是 eslint-plugin-import 配置

  139. */

  140. // 'airbnb-base',

  141. ],

  142. /**

  143. * 规则共享参数

  144. * http://eslint.cn/docs/user-guide/configuring#adding-shared-settings

  145. * 【】提供给具体规则项,每个参数值,每个规则项都会被注入该变量,但对应规则而言,有没有用,就看各个规则的设置了,就好比 parserOptions,解析器用不用它就不知道了。这里只是提供这个方法

  146. * 【】不用怀疑,经源码验证,这就是传递给每个规则项的,会当做参数传递过去,但用不用,就是具体规则的事情

  147. */

  148. settings: {

  149. /**

  150. *

  151. * 注意,「import/resolver」并不是eslint规则项,与rules中的「import/extensions」不同。它不是规则项

  152. * 这里只是一个参数名,叫「import/resolver」,会传递给每个规则项。

  153. * settings并没有具体的书写规则,「import/」只是import模块自己起的名字,原则上,它直接命名为「resolver」也可以,加上「import」只是为了更好地区分。不是强制设置的。

  154. * 因为「import」插件很多规则项都用的这个配置项,所以并没有通过rules设置,而是通过settings共享

  155. * 具体使用方法可参考https://github.com/benmosher/eslint-plugin-import

  156. */

  157. 'import/resolver': {

  158. /**

  159. * 这里传入webpack并不是import插件能识别webpack,而且通过npm安装了「eslint-import-resolver-webpack」,

  160. * import」插件通过「eslint-import-resolver-」+「webpack」找到该插件并使用,就能解析webpack配置项。使用里面的参数。

  161. * 主要是使用以下这些参数,共享给import规则,让其正确识别import路径

  162. * extensions: ['.js', '.vue', '.json'],

  163. * alias: {

  164. * 'vue$': 'vue/dist/vue.esm.js',

  165. * '@': resolve('src'),

  166. * 'static': resolve('static')

  167. * }

  168. */

  169. webpack: {

  170. config: 'build/webpack.base.conf.js'

  171. }

  172. }

  173. },

  174. /**

  175. * 针对特定文件的配置

  176. * 【】可以通过overrides对特定文件进行特定的eslint检测

  177. * 【】特定文件的路径书写使用Glob格式,一个类似正则的路径规则,可以匹配不同的文件

  178. * 【】配置几乎与 ESLint 的其他配置相同。覆盖块可以包含常规配置中的除了 extendsoverrides root 之外的其他任何有效配置选项,

  179. */

  180. // overrides: [

  181. // {

  182. // 'files': ['bin/*.js', 'lib/*.js'],

  183. // 'excludedFiles': '*.test.js',

  184. // 'rules': {

  185. // 'quotes': [2, 'single']

  186. // }

  187. // }

  188. // ],

  189. /**

  190. * 自定义规则

  191. * http://eslint.cn/docs/user-guide/configuring#configuring-rules

  192. * 【】基本使用方式

  193. * "off" 或者0 关闭规则

  194. * "warn" 或者1 将规则打开为警告(不影响退出代码)

  195. * "error" 或者2 将规则打开为错误(触发时退出代码为1

  196. * 如:'no-restricted-syntax': 0, // 表示关闭该规则

  197. * 【】如果某项规则,有额外的选项,可以通过数组进行传递,而数组的第一位必须是错误级别。如0,1,2

  198. * 'semi': ['error', 'never'], never就是额外的配置项

  199. */

  200. rules: {

  201. /**

  202. * 具体规则

  203. * 【】具体的规则太多,就不做介绍了,有兴趣的同学可以上eslint官网查

  204. * 【】注意 xxx/aaa 这些规则是 xxx 插件自定的规则,在eslint官网是查不到的。需要到相应的插件官网中查阅

  205. * 【】如 import/extensions,这是「eslint-plugin-import」自定义的规则,需要到其官网查看 https://github.com/benmosher/eslint-plugin-import

  206. */

  207. /**

  208. * 逻辑错误及最佳实践的规则

  209. */

  210. 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止debugger

  211. 'no-console': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止console

  212. 'no-alert': process.env.NODE_ENV === 'production' ? 2 : 0, // 打包时禁止console

  213. "for-direction": 2, // 禁止for无限循环

  214. "no-compare-neg-zero": 2, // 禁止与-0进行比较

  215. 'no-cond-assign': 2, // 禁止条件语句中出现赋值语句

  216. "no-control-regex": 2, // ASCII 中,0-31 范围内的控制字符是特殊的、不可见的字符。这些字符很少被用在 JavaScript 字符串中,所以一个正则表达式如果包含这些字符的,很有可能一个错误。

  217. "no-dupe-args": 2, // 禁止在函数定义或表达中出现重名参数

  218. "no-dupe-keys": 2, // 禁止在对象字面量中出现重复的键

  219. "no-duplicate-case": 2, // 禁止重复 case 标签

  220. "no-empty": 2, // 禁止空块语句

  221. "no-empty-character-class": 2, // 禁止在正则表达式中出现空字符集

  222. "no-ex-assign": 2, // 禁止对 catch 子句中的异常重新赋值。因为catch出来的都是错误信息,不需要重新赋值

  223. "no-extra-boolean-cast": 2, // 禁止不必要的布尔类型转换,如 !!true

  224. "no-extra-semi": 2, // 禁用不必要的分号

  225. "no-inner-declarations": 2, // ??? 禁止在嵌套的语句块中出现变量

  226. "no-regex-spaces": 2, // 禁止正则表达式字面量中出现多个空格

  227. "no-obj-calls": 2, // 禁止将全局对象当作函数进行调用

  228. "no-prototype-builtins": 2, // ??? 禁止直接在对象实例上调用 Object.prototype 的一些方法。

  229. "no-template-curly-in-string": 2, // 禁止在常规字符串中出现模板字面量占位符语法

  230. "semi": [2, 'never'], // ??? 强制是否使用分号。

  231. "no-unexpected-multiline": 2, // 禁止使用令人困惑的多行表达式

  232. "no-unreachable": 2, // 禁止在 returnthrowcontinue break 语句后出现不可达代码

  233. "use-isnan": 2, // 要求调用 isNaN()检查 NaN

  234. "no-unsafe-negation": 2, // 禁止对关系运算符的左操作数使用否定操作符

  235. "valid-jsdoc": 2, // 强制使用有效的 JSDoc 注释

  236. "valid-typeof": 2, // 强制 typeof 表达式与有效的字符串进行比较

  237. "array-callback-return": 2, // 强制数组方法的回调函数中有 return 语句

  238. "block-scoped-var": 2, // var 语句看作是在块级作用域范围之内

  239. "complexity": [1, 6], // 添加复杂度

  240. "curly": 2, // ??? 要求遵循大括号约定

  241. "default-case": 1, // 要求 Switch 语句中有 Default 分支

  242. "dot-location": [2, 'property'], // 强制在点号之前换行

  243. "dot-notation": 2, // 点号和字面量,优先使用点号

  244. "eqeqeq": [2, 'smart'], // ??? 要求使用 === !==

  245. "guard-for-in": 2, // ??? 需要约束 for-in

  246. "no-caller": 2, // 禁用 caller callee

  247. "no-empty-function": 2, // 禁止出现空函数

  248. "no-empty-pattern": 2, // 禁止使用空解构模式

  249. "no-eval": 2, // 禁用 eval()

  250. "no-global-assign": 2, // 禁止对原生对象或只读的全局对象进行赋值

  251. "no-floating-decimal": 2, // ?? 禁止浮点小数

  252. "no-fallthrough": 2, // 禁止 case 语句落空

  253. "no-labels": 2, // 禁用标签语句

  254. "no-extra-label": 2, // 禁用不必要的标签

  255. "no-extra-bind": 2, // 禁止不必要的函数绑定

  256. "no-iterator": 2, // 禁用迭代器

  257. "no-lone-blocks": 2, // 禁用不必要的嵌套块

  258. "no-loop-func": 2, // 禁止循环中存在函数

  259. "no-magic-numbers": [2, {

  260. ignoreArrayIndexes: true,

  261. ignore: [-1, 0, 1, 2],

  262. }], // 禁止使用魔术数字,魔术数字是在代码中多次出现的没有明确含义的数字。它最好由命名常量取代。

  263. "no-multi-spaces": 2, // 禁止出现多个空格

  264. "no-multi-str": 2, // 禁止多行字符串

  265. "no-new": 2, // 禁止在不保存实例的情况下使用new

  266. "no-new-func": 2, // 禁用Function构造函数

  267. "no-new-wrappers": 2, // 禁止原始包装实例

  268. "no-octal": 2, // 禁用八进制字面量

  269. "no-octal-escape": 2, // 禁止在字符串字面量中使用八进制转义序列

  270. "no-param-reassign": 2, // ??? 禁止对函数参数再赋值

  271. "no-proto": 2, // 禁用__proto__,改用 getPrototypeOf 方法替代 __proto__

  272. "no-redeclare": 2, // 禁止重新声明变量

  273. "no-return-assign": 2, // 禁止在返回语句中赋值

  274. "no-return-await": 2, // 禁用不必要的 return await

  275. "no-script-url": 2, // 禁用 Script URL

  276. "no-self-assign": 2, // 禁止自身赋值

  277. "no-sequences": 2, // ??? 不允许使用逗号操作符

  278. "no-throw-literal": 2, // 限制可以被抛出的异常

  279. "no-unmodified-loop-condition": 2, // 禁用一成不变的循环条件

  280. "no-useless-call": 2, // 禁用不必要的 .call() .apply()

  281. "no-useless-concat": 2, // 禁止没有必要的字符拼接

  282. "no-useless-escape": 2, // 禁用不必要的转义

  283. "no-useless-return": 2, // 禁止多余的 return 语句

  284. "no-void": 2, // 禁止使用void操作符

  285. "no-with": 2, // 禁用 with 语句

  286. "prefer-promise-reject-errors": 1, // ??? 要求使用 Error 对象作为 Promise 拒绝的原因

  287. "radix": 1, // 要求必须有基数

  288. "require-await": 2, // 禁止使用不带 await 表达式的 async 函数

  289. "vars-on-top": 2, // 要求将变量声明放在它们作用域的顶部

  290. "wrap-iife": [2, 'inside'], // 需要把立即执行的函数包裹起来

  291. "strict": [2, 'global'], // 要求或禁止使用严格模式指令

  292. /**

  293. * 变量相关的规则

  294. */

  295. "init-declarations": 2, // ??? 强制或禁止变量声明语句中初始化

  296. "no-delete-var": 2, // 禁止删除变量

  297. "no-shadow": 2, // 禁止变量声明覆盖外层作用域的变量

  298. "no-shadow-restricted-names": 2, // 关键字不能被遮蔽

  299. "no-undef": 2, // 禁用未声明的变量

  300. "no-unused-vars": 1, // ??? 禁止未使用过的变量

  301. "no-use-before-define": 2, // 禁止定义前使用

  302. // 代码风格

  303. "array-bracket-newline": [2, 'consistent'], // 在数组开括号后和闭括号前强制换行

  304. "array-bracket-spacing": 2, // 强制在括号内前后使用空格

  305. "array-element-newline": [2, { multiline: true }], // ??? 强制数组元素间出现换行

  306. "block-spacing": 2, // 强制在代码块中开括号前和闭括号后有空格

  307. "brace-style": 2, // 大括号风格要求

  308. "camelcase": 2, // 要求使用骆驼拼写法

  309. "comma-dangle": [2, 'always-multiline'], // 要求或禁止使用拖尾逗号

  310. "comma-spacing": 2, // 强制在逗号周围使用空格

  311. "comma-style": 2, // 逗号风格

  312. "computed-property-spacing": 2, // 禁止或强制在计算属性中使用空格

  313. "consistent-this": [2, 'self'], // ??? 要求一致的 This

  314. "eol-last": [1, 'always'], // ??? 要求或禁止文件末尾保留一行空行

  315. "func-call-spacing": 2, // 要求或禁止在函数标识符和其调用之间有空格

  316. "func-style": [2, 'declaration'], // ??? 强制 function 声明或表达式的一致性

  317. "function-paren-newline": [1, 'multiline'], // 强制在函数括号内使用一致的换行

  318. "indent": [2, 2], // 强制使用一致的缩进

  319. "jsx-quotes": 2, // 强制在 JSX 属性中一致地使用双引号或单引号

  320. "key-spacing": 2, // 强制在对象字面量的键和值之间使用一致的空格

  321. "keyword-spacing": 2, // 强制关键字周围空格的一致性

  322. "linebreak-style": 2, // 强制使用一致的换行符风格,用\n,不用\r\n

  323. "lines-around-comment": 2, // 强制注释周围有空行

  324. "lines-between-class-members": 2, // 要求在类成员之间出现空行

  325. "max-depth": 2, // 强制块语句的最大可嵌套深度

  326. "max-len": [2, { // 强制行的最大长度

  327. "code": 100,

  328. "tabWidth": 4,

  329. "ignoreUrls": true,

  330. "ignoreTrailingComments": true,

  331. "ignoreTemplateLiterals": true,

  332. }], //

  333. "max-lines": [2, 1000], // ??? 强制文件的最大行数

  334. "max-nested-callbacks": [2, 5], // 强制回调函数最大嵌套深度

  335. "max-statements-per-line": 2, // 强制每一行中所允许的最大语句数量

  336. "multiline-comment-style": 1, // 强制对多行注释使用特定风格

  337. "new-cap": 2, // 要求构造函数首字母大写

  338. "new-parens": 2, // 要求调用无参构造函数时带括号

  339. "newline-per-chained-call": 2, // 要求方法链中每个调用都有一个换行符

  340. "no-bitwise": 2, // 禁止使用按位操作符

  341. "no-inline-comments": 0, // ??? 禁止使用内联注释

  342. "no-lonely-if": 2, // 禁止 if 语句作为唯一语句出现在 else 语句块中

  343. "no-mixed-spaces-and-tabs": 2, // 禁止使用 空格 tab 混合缩进

  344. "no-multiple-empty-lines": 1, // ??? 不允许多个空行

  345. "no-negated-condition": 2, // 禁用否定表达式

  346. "no-nested-ternary": 2, // 禁止使用嵌套的三元表达式

  347. "no-new-object": 2, // 禁止使用 Object 构造函数

  348. "no-trailing-spaces": 2, // 禁用行尾空白

  349. "no-underscore-dangle": 2, // 禁止标识符中有悬空下划线

  350. "quotes": [2, 'single'], // 强制使用一致的单引号

  351. "quote-props": [2, 'as-needed'], // ??? 要求对象字面量属性名称使用引号

  352. "operator-linebreak": [2, 'before'], // 强制操作符使用一致的换行符风格

  353. "one-var": [2, 'never'], // ??? 强制函数中的变量在一起声明或分开声明

  354. "object-property-newline": 1, // ??? 强制将对象的属性放在不同的行上

  355. "object-curly-spacing": [2, 'always'], // 强制在花括号中使用一致的空格

  356. "object-curly-newline": [1, { // ??? 对象属性换行

  357. multiline: true,

  358. }], //

  359. "no-whitespace-before-property": 2, // 禁止属性前有空白

  360. "no-unneeded-ternary": 2, // 禁止可以表达为更简单结构的三元操作符

  361. "semi-spacing": 2, // 强制分号前后有空格

  362. "semi-style": 2, // 分号风格

  363. "space-before-blocks": [2, 'always'], // 禁止语句块之前的空格

  364. "space-before-function-paren": [2, 'never'], // 禁止函数圆括号之前有一个空格

  365. "space-in-parens": 2, // 禁止或强制圆括号内的空格

  366. "space-infix-ops": 2, // 要求中缀操作符周围有空格

  367. "space-unary-ops": 2, // 禁止在一元操作符之前或之后存在空格

  368. "spaced-comment": 2, // 要求在注释前有空白

  369. "switch-colon-spacing": 2, // 强制在 switch 的冒号左右有空格

  370. "template-tag-spacing": 2, // 要求在模板标记和它们的字面量之间有空格

  371. /**

  372. * ES6相关规则

  373. */

  374. "arrow-parens": [2, 'as-needed'], // 要求箭头函数的参数使用圆括号

  375. "arrow-body-style": 2, // 要求箭头函数体使用大括号

  376. "arrow-spacing": 2, // 要求箭头函数的箭头之前或之后有空格

  377. "generator-star-spacing": 2, // ??? 强制 generator 函数中 * 号周围有空格

  378. "no-class-assign": 2, // 不允许修改类声明的变量

  379. "no-confusing-arrow": 2, // 禁止在可能与比较操作符相混淆的地方使用箭头函数

  380. "no-const-assign": 2, // 不允许改变用const声明的变量

  381. "no-dupe-class-members": 2, // 不允许类成员中有重复的名称

  382. "no-duplicate-imports": 2, // 禁止重复导入

  383. "no-new-symbol": 0, // 禁止 Symbol 操作符和 new 一起使用lines-between

  384. "no-useless-computed-key": 2, // 禁止在对象中使用不必要的计算属性

  385. "no-useless-constructor": 2, // 禁用不必要的构造函数

  386. "no-useless-rename": 2, // 禁止在 import export 和解构赋值时将引用重命名为相同的名字

  387. "no-var": 2, // 要求使用 let const 而不是 var

  388. "object-shorthand": 2, // 要求对象字面量简写语法

  389. "prefer-arrow-callback": 2, // 要求使用箭头函数作为回调

  390. "prefer-const": 1, // ??? 建议使用const

  391. "prefer-destructuring": [2, { // 优先使用数组和对象解构

  392. "array": false,

  393. "object": true

  394. }],

  395. "prefer-rest-params": 2, // 使用剩余参数代替 arguments

  396. "prefer-spread": 2, // 建议使用扩展运算符而非.apply()

  397. "prefer-template": 2, // 建议使用模板而非字符串连接

  398. "require-yield": 2, // 禁用函数内没有yield generator 函数

  399. "rest-spread-spacing": 2, // 强制剩余和扩展运算符及其表达式之间有空格

  400. "template-curly-spacing": 2, // 强制模板字符串中空格的使用

  401. "sort-imports": [0, { // ??? import 排序 问题是要以字母排序

  402. ignoreCase: true,

  403. ignoreMemberSort: true,

  404. memberSyntaxSortOrder: ['all', 'single', 'multiple', 'none']

  405. }], //

  406. }

  407. };