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实现UTF8编码转换成gb2312编码
Dec 22 Javascript
在JavaScript中通过URL传递汉字的方法
Apr 09 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
Apr 15 Javascript
JavaScript mapreduce工作原理简析
Nov 25 Javascript
如何用jquery控制表格奇偶行及活动行颜色
Apr 20 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
Apr 14 Javascript
jQuery链式调用与show知识浅析
May 11 Javascript
JSON对象转化为字符串详解
Aug 11 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
Jul 31 Javascript
jQuery仿移动端支付宝键盘的实现代码
Aug 15 jQuery
关于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
PHP可逆加密/解密函数分享
2012/09/25 PHP
如何在php中正确的使用json
2013/08/06 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
PHP实现计算器小功能
2020/08/28 PHP
js中window.open打开一个新的页面
2014/08/10 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
基于Python代码编辑器的选用(详解)
2017/09/13 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Pandas的Apply函数具体使用
2020/07/21 Python
Python list和str互转的实现示例
2020/11/16 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
销售队伍口号
2014/06/11 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android