vue-cli3项目配置eslint代码规范的完整步骤


Posted in Javascript onSeptember 10, 2020

前言

最近接手了一个项目,由于之前为了快速开发,没有做代码检查。为了使得代码更加规范以及更易读,所以就要eslint上场了。

安装依赖

安装依赖有两种方法:

  1. 在cmd中打上把相应的依赖加到devDependencies下,再npm install对应依赖。
  2. 在package.json文件加上相应依赖:
"eslint-plugin-html": "^6.0.3",
"@vue/cli-plugin-eslint": "^3.3.0",
"@vue/eslint-config-standard": "^4.0.0",
"eslint": "5.0.0",
"eslint-friendly-formatter": "4.0.1",
"eslint-loader": "2.0.0",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-vue": "4.7.1",

eslint配置方法

eslint的规则有三个选项:

  • "off"或者0,不启用这个规则
  • "warn"或者1,出现问题会有警告
  • "error"或者2,出现问题会报错

在根目录创建.eslintrc.js,代码如下:

module.exports = {
 // 默认情况下,ESLint会在所有父级组件中寻找配置文件,一直到根目录。ESLint一旦发现配置文件中有  "root": true,它就会停止在父级目录中寻找。
 root: true,
 parserOptions: {
  // 对Babel解析器的包装使其与 ESLint 兼容。
  parser: 'babel-eslint',
  // 代码是 ECMAScript 模块
  sourceType: 'module'
 },
 env: {
   // 预定义的全局变量,这里是浏览器环境
  browser: true,
  node: true,
  es6: true,
 },
 // 扩展风格
 extends: ['plugin:vue/recommended', 'eslint:recommended'],
 // 规则的细节请到ESLint官方网站查看http://eslint.org/docs/rules/
 rules: {
  "vue/max-attributes-per-line": [2, {
   "singleline": 10,
   "multiline": {
    "max": 1,
    "allowFirstLine": false
   }
  }],
  "vue/name-property-casing": ["error", "PascalCase"],
  // 定义对象的set存取器属性时,强制定义get
  'accessor-pairs': 2,
  'arrow-spacing': [2, {
   'before': true,
   'after': true
  }],
  // 禁止或强制在单行代码块中使用空格
  'block-spacing': [2, 'always'],
  // 强制使用一致的缩进 第二个参数为 "tab" 时,会使用tab
  'brace-style': [2, '1tbs', {
   'allowSingleLine': true
  }],
  // 双峰驼命名格式
  'camelcase': [0, {
   'properties': 'always'
  }],
  // 数组和对象键值对最后一个逗号, never参数:不能带末尾的逗号, always参数:必须带末尾的逗号
  'comma-dangle': [2, 'never'],
  // 控制逗号前后的空格
  'comma-spacing': [2, {
   'before': false,
   'after': true
  }],
  // 控制逗号在行尾出现还是在行首出现 (默认行尾)
  'comma-style': [2, 'last'],
  // 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也会提示
  'constructor-super': 2,
  // 强制所有控制语句使用一致的括号风格
  'curly': [2, 'multi-line'],
  // 强制object.key 中 . 的位置,参数:
  // property,'.'号应与属性在同一行
  // object, '.' 号应与对象名在同一行
  'dot-location': [2, 'property'],
  // 文件末尾强制换行
  'eol-last': 2,
  // 使用 === 替代 == allow-null允许null和undefined==
  "eqeqeq": [2, "allow-null"],
  // 强制 generator 函数中 * 号周围使用一致的空格
  'generator-star-spacing': [2, {
   'before': true,
   'after': true
  }],
  // 要求回调函数中有容错处理
  'handle-callback-err': [2, '^(err|error)$'],
  'indent': [2, 2, {
   'SwitchCase': 1
  }],
  // 强制在 JSX 属性中一致地使用双引号或单引号
  'jsx-quotes': [2, 'prefer-single'],
  // 强制在对象字面量的属性中键和值之间使用一致的间距
  'key-spacing': [2, {
   'beforeColon': false,
   'afterColon': true
  }],
  // 强制在关键字前后使用一致的空格
  'keyword-spacing': [2, {
   'before': true,
   'after': true
  }],
  // 要求构造函数首字母大写
  'new-cap': [2, {
   'newIsCap': true,
   'capIsNew': false
  }],
  // 要求调用无参构造函数时有圆括号
  'new-parens': 2,
  // 禁止在没有类型检查操作符的情况下与 null 进行比较
  'no-eq-null': 0,
  // 禁止使用 Array 构造函数
  'no-array-constructor': 2,
  // 禁用 arguments.caller 或 arguments.callee
  'no-caller': 2,
  // 禁用 console
  'no-console': 0,
  // 禁止修改类声明的变量
  'no-class-assign': 2,
  // 禁止条件表达式中出现赋值操作符
  'no-cond-assign': 2,
  // 禁止修改 const 声明的变量
  'no-const-assign': 2,
  // 禁止在正则表达式中使用控制字符 :new RegExp("\x1f")
  'no-control-regex': 0,
  // 禁止删除变量
  'no-delete-var': 2,
  // 禁止 function 定义中出现重名参数
  'no-dupe-args': 2,
  // 禁止类成员中出现重复的名称
  'no-dupe-class-members': 2,
  // 禁止对象字面量中出现重复的 key
  'no-dupe-keys': 2,
  // 禁止重复的 case 标签
  'no-duplicate-case': 2,
  // 禁止在正则表达式中使用空字符集 (/^abc[]/)
  'no-empty-character-class': 2,
  // 禁止使用空解构模式no-empty-pattern
  'no-empty-pattern': 2,
  // 禁用 eval(),由于多处地方使用,暂不开启
  'no-eval': 0,
  // 禁止对 catch 子句的参数重新赋值
  'no-ex-assign': 2,
  // 禁止扩展原生类型
  'no-extend-native': 2,
  // 禁止不必要的 .bind() 调用
  'no-extra-bind': 2,
  // 禁止不必要的布尔转换
  'no-extra-boolean-cast': 2,
  // 禁止不必要的括号 //(a * b) + c;//报错
  'no-extra-parens': [2, 'functions'],
  // 禁止 case 语句落空
  'no-fallthrough': 2,
  // 禁止数字字面量中使用前导和末尾小数点
  'no-floating-decimal': 2,
  // 禁止对 function 声明重新赋值
  'no-func-assign': 2,
  // 禁止使用类似 eval() 的方法
  'no-implied-eval': 2,
  // 禁止在嵌套的块中出现 function 或 var 声明
  'no-inner-declarations': [2, 'functions'],
  // 禁止 RegExp 构造函数中无效的正则表达式字符串
  'no-invalid-regexp': 2,
  // 禁止在字符串和注释之外不规则的空白
  'no-irregular-whitespace': 2,
  // 禁用 __iterator__ 属性
  'no-iterator': 2,
  // 不允许标签与变量同名
  'no-label-var': 2,
  // 禁用标签语句
  'no-labels': [2, {
   'allowLoop': false,
   'allowSwitch': false
  }],
  // 禁用不必要的嵌套块
  'no-lone-blocks': 2,
  // 不允许空格和 tab 混合缩进
  'no-mixed-spaces-and-tabs': 2,
  // 禁止使用多个空格
  'no-multi-spaces': 2,
  // 禁止使用多行字符串,在 JavaScript 中,可以在新行之前使用斜线创建多行字符串
  'no-multi-str': 2,
  // 不允许多个空行
  'no-multiple-empty-lines': [2, {
   'max': 1
  }],
  // 禁止对原生对象赋值
  'no-native-reassign': 2,
  // 禁止在 in 表达式中出现否定的左操作数
  'no-negated-in-lhs': 2,
  // 禁止使用 Object 的构造函数
  'no-new-object': 2,
  // 禁止调用 require 时使用 new 操作符
  'no-new-require': 2,
  // 禁止 Symbol 的构造函数
  'no-new-symbol': 2,
  // 禁止对 String,Number 和 Boolean 使用 new 操作符
  'no-new-wrappers': 2,
  // 禁止把全局对象 (Math 和 JSON) 作为函数调用 错误:var math = Math();
  'no-obj-calls': 2,
  // 禁用八进制字面量
  'no-octal': 2,
  // 禁止在字符串中使用八进制转义序列
  'no-octal-escape': 2,
  // 禁止对 __dirname 和 __filename进行字符串连接
  'no-path-concat': 2,
  // 禁用 __proto__ 属性
  'no-proto': 2,
  // 禁止使用 var 多次声明同一变量
  'no-redeclare': 2,
  // 禁止正则表达式字面量中出现多个空格
  'no-regex-spaces': 2,
  // 禁用指定的通过 require 加载的模块
  'no-return-assign': [2, 'except-parens'],
  // 禁止自我赋值
  'no-self-assign': 2,
  // 禁止自身比较
  'no-self-compare': 2,
  // 禁用逗号操作符
  'no-sequences': 2,
  // 禁止覆盖受限制的标识符
  'no-shadow-restricted-names': 2,
  // 禁止 function 标识符和括号之间出现空格
  'no-spaced-func': 2,
  // 禁用稀疏数组
  'no-sparse-arrays': 2,
  // 禁止在构造函数中,在调用 super() 之前使用 this 或 super
  'no-this-before-super': 2,
  // 禁止抛出非异常字面量
  'no-throw-literal': 0,
  // 禁用行尾空格
  'no-trailing-spaces': 2,
  // 禁用未声明的变量,除非它们在 /*global */ 注释中被提到
  'no-undef': 2,
  // 禁止将变量初始化为 undefined
  'no-undef-init': 2,
  // 禁止出现令人困惑的多行表达式
  'no-unexpected-multiline': 2,
  // 禁用一成不变的循环条件
  'no-unmodified-loop-condition': 2,
  // 禁止可以在有更简单的可替代的表达式时使用三元操作符
  'no-unneeded-ternary': [2, {
   'defaultAssignment': false
  }],
  // 禁止在return、throw、continue 和 break语句之后出现不可达代码
  'no-unreachable': 2,
  'no-unsafe-finally': 2,
  // 禁止出现未使用过的变量
  'no-unused-vars': [2, {
   'vars': 'all',
   'args': 'none'
  }],
  // 禁止不必要的 .call() 和 .apply()
  'no-useless-call': 2,
  // 禁止不必要的计算性能键对象的文字
  'no-useless-computed-key': 2,
  'no-useless-constructor': 2,
  // 禁用不必要的转义字符
  'no-useless-escape': 0,
  // 禁止属性前有空白
  'no-whitespace-before-property': 2,
  // 禁用 with 语句
  'no-with': 2,
  // 强制函数中的变量要么一起声明要么分开声明
  'one-var': [2, {
   'initialized': 'never'
  }],
  // 强制操作符使用一致的换行符
  'operator-linebreak': [2, 'after', {
   'overrides': {
    '?': 'before',
    ':': 'before'
   }
  }],
  // 要求或禁止块内填充
  'padded-blocks': [2, 'never'],
  // 强制使用一致的反勾号、双引号或单引号
  'quotes': [2, 'single', {
   'avoidEscape': true,
   'allowTemplateLiterals': true
  }],
  // 要求或禁止使用分号而不是 ASI(这个才是控制行尾部分号的,)
  'semi': [2, 'never'],
  // 强制分号之前和之后使用一致的空格
  'semi-spacing': [2, {
   'before': false,
   'after': true
  }],
  // 强制在块之前使用一致的空格
  'space-before-blocks': [2, 'always'],
  // 强制在 function的左括号之前使用一致的空格
  'space-before-function-paren': [2, 'never'],
  // 强制在圆括号内使用一致的空格
  'space-in-parens': [2, 'never'],
  // 要求操作符周围有空格
  'space-infix-ops': 2,
  // 强制在一元操作符前后使用一致的空格
  'space-unary-ops': [2, {
   'words': true,
   'nonwords': false
  }],
  // 强制在注释中 // 或 /* 使用一致的空格
  'spaced-comment': [2, 'always', {
   'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
  }],
  // 要求或禁止模板字符串中的嵌入表达式周围空格的使用
  'template-curly-spacing': [2, 'never'],
  // 要求使用 isNaN() 检查 NaN
  'use-isnan': 2,
  // typeof foo === "undefimed" 错误
  'valid-typeof': 2,
  // 要求 IIFE 使用括号括起来
  'wrap-iife': [2, 'any'],
  // 强制在 yield* 表达式中 * 周围使用空格
  'yield-star-spacing': [2, 'both'],
  // 要求或禁止 “Yoda” 条件
  'yoda': [2, 'never'],
  // 要求使用 const 声明那些声明后不再被修改的变量
  'prefer-const': 2,
  // 是否允许debugger
  'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
  // 强制在花括号中使用一致的空格
  'object-curly-spacing': [2, 'always', {
   objectsInObjects: false
  }],
  // 指定数组的元素之间要以空格隔开(, 后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格
  'array-bracket-spacing': [2, 'never']
 }
}

忽略不必要的文件检测

在根目录下新建文件.eslintignore,对应的文件忽略检测。

src/assets

关闭某些代码的检测

有时候代码里有些特殊情况需要我们在某一行或者某几行关闭ESLint检测,可以使用注释。

下面的代码会关闭所有规则:

/* eslint-disable */
alert('str');
/* eslint-enable */

下面的代码会关闭某一行的所有规则:

alert('str'); // eslint-disable-line

// eslint-disable-next-line
alert('str');

下面的代码在某一行关闭指定的规则:

alert('str'); // eslint-disable-line no-alert

// eslint-disable-next-line no-alert
alert('str');

开启验证

在根目录的vue.config.js中,把lintOnSave设置为true。

vs code安装插件与设置

在vscode上安装eslint和vetur插件,并在file>>prefrence>>setting 或文件>>首选项>>设置中,找到setting.json,添加如下配置,让vscode每次保持的时候安装eslint规范来自动格式化:

// 重新设定tabsize
"editor.tabSize": 2,
// 每次保存的时候将代码按eslint格式进行修复
"eslint.autoFixOnSave": true,
// 添加 vue 支持
"eslint.validate": [
{
 "language": "vue",
 "autoFix": true
},
{
 "language": "html",
 "autoFix": true
},
{
 "language": "javascript",
 "autoFix": true
}
],
// 每次保存的时候自动格式化(建议关掉,用eslint来修复)
"editor.formatOnSave": false

结语

本文章只是记录eslint的过程,如果大家有什么问题可以在下方反馈给我,谢谢!

到此这篇关于vue-cli3项目配置eslint代码规范的文章就介绍到这了,更多相关vue-cli3项目配置eslint代码规范内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
向大师们学习Javascript(视频与PPT)
Dec 27 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
javascript两种function的定义介绍及区别说明
May 02 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
jquery获取子节点和父节点的示例代码
Sep 10 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
javascript中Date对象的使用总结
Nov 21 Javascript
JavaScript生成简单等差数列
Nov 28 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
VUE 组件转换为微信小程序组件的方法
Nov 06 Javascript
微信小程序利用云函数获取手机号码
Dec 17 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
关于JavaScript数组去重的一些理解汇总
Sep 10 #Javascript
vue中jsonp插件的使用方法示例
Sep 10 #Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 #Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 #Javascript
vue 使用lodash实现对象数组深拷贝操作
Sep 10 #Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
Sep 10 #Javascript
vue 导出文件,携带请求头token操作
Sep 10 #Javascript
You might like
动态新闻发布的实现及其技巧
2006/10/09 PHP
福利彩票幸运号码自动生成器
2006/10/09 PHP
杏林同学录(四)
2006/10/09 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
解析php中反射的应用
2013/06/18 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
原生js实现随机点名
2020/07/05 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
git进行版本控制心得详谈
2017/12/10 Python
Python面向对象进阶学习
2019/05/21 Python
python匿名函数用法实例分析
2019/08/03 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
综合内勤岗位职责
2014/04/14 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技