eslint的基础使用

陈就
• 阅读 7975

JavaScript的编程风格

在前端工程愈演愈大的情况下,JavaScript占的比例也很足,需要良好的书写风格,才能在多人协作code时提高效率,何况代码还是需要人来读的,所以可读性、可维护性高的代码很多时候有重要意义。

这里推荐下Airbnb的挂在github上的JavaScript编写风格:https://github.com/libertyAlo... 有时间的话,还是希望可以多看看。

eslint

即使我们看了无数遍上面说到的Airbnb的JavaScript的编程风格,但是,不少情况下还是会写出不符合要求的代码,那么就需要工具来约束我们。我们通过配置一些风格,让IDE来强制提醒我们代码的风格是否符合规范,所以eslint就是很好的选择,但是eslint还需要和IDE的结合来使用。

eslint的使用

eslint是一个node的包,需要类似npm、yarm来安装,也和其他的第三方包一样,可以全局安装,也可以本地安装,建议这个全局安装,因为这个包很多时候并不是供编程人员直接使用,而是配合ide或者编辑器来进行使用的,所以全局安装后,可以本地生成配置文件,通过和IDE的配合来起到检测书写风格的效果。

npm install -g eslint

可以安装最新版本,安装好了,考虑哪些工程需要使用eslint来检测,哪些不需要,还有哪些文件需要,哪些文件不需要,甚至文件夹是否需要,在需要的工程根目录下执行

eslint --init

需要配置,可以选择一个流行的风格,Airbnb或者标准,生成JSON文件,.eslintrc.json这个配置文件,
需要注意,win10在git ui的命令窗口执行的话无法使用箭头按键来选择,所以最好还是使用win自带的cmd窗口
这里就可以修改这个json文件,来配置你熟悉的,觉得合理的规则,以及排除的文件,

{
    "rules": {
"no-console": 2, // 禁用 console
"no-alert": 2, // 禁用 alert
"no-irregular-whitespace": 2, //禁止tab、空格之外的非法空白
"no-unexpected-multiline": 2, //禁止使用令人困惑的多行表达式,一行结束最后使用;或者是- +之类的连接符
"guard-for-in": 2, // for in 循环必须限制 Object.prototype.hasOwnProperty
"no-caller": 2, //禁用 arguments.caller 或 arguments.callee
"no-extend-native": 2, //禁止扩展原生对象
"no-extra-bind": 2, //禁止不必要的函数绑定 函数中没有使用this时,不需要绑定this
"no-invalid-this": 1, // 控制this的使用,只能在构造函数【首字母大写】、对象、类中使用
"no-multi-spaces": [2, {"ignoreEOLComments": true}], //禁止非缩进处出现多个空格 ,但忽略行尾注释前的多个空格 let a =   b; b前空格多了
"no-multi-str": 2, //禁止多行字符串 \ 可以连接多行字符实现换行,建议使用 '\n' +的组合
"no-new-wrappers": 2, //禁止原始包装实例 new String new Number的操作不合理,会变成初始化一个对象,而不是对应的初始类型
"no-throw-literal": 2, //限制可以被抛出的异常 仅仅 抛出(throw) Error 对象本身或者用户自定义的以 Error 对象为基础的异常
"no-with": 2, //不使用with
"no-unused-vars": [2, {"args": "none"}], // 未使用的变量定义,参数不校验,参数有可能是可选参数
"array-bracket-spacing": [2, "never"], //禁止或强制在括号内使用空格, 禁止使用不一致的空格,应该遵守格式 [1, 2, 3],也就是,逗号后面一个空格
"brace-style": 2, //大括号风格要求 one true brace style 风格如下:
/*
if (foo) {
  bar();
} else {
  baz();
}
*/
"camelcase": [1, {"properties": "never"}], // 驼峰变量命名,警告,而且属性名不会要求是驼峰,变量名要求是
"comma-dangle": [2], //禁止在数组、对象、函数参数最后面添加拖尾逗号
"comma-spacing": 2, // 逗号后非行尾需要加空格
"comma-style": 2, //要求逗号放在数组元素、对象属性或变量声明之后,且在同一行 
"computed-property-spacing": 2, //禁止在计算属性中使用空格 obj[key] ok
"eol-last": 2, //要求在非空文件末尾至少存在一行空行
"func-call-spacing": 2, // 函数执行需要紧挨着(括号,alert(1) ok 不要alert  (2)
"jsx-quotes": 2, //强制所有不包含双引号的 JSX 属性值使用双引号
"key-spacing": 2, // 对象key之后,冒号前不允许有空格; value前需要有空格
"keyword-spacing": 0, //要求在关键字之前、之后都至少有一个空格
"linebreak-style": 2, //强制使用 Unix 换行符: \n
"new-cap": 2, //要求构造函数首字母大写
"newline-after-var": 1, // 变量定义后增加空行 warn
"no-array-constructor": 2, // new Array X 禁用 Array 构造函数
"no-mixed-spaces-and-tabs": 2, // 禁止混用tab与空格 禁止空格和 tab 的混合缩进
"no-multiple-empty-lines": [2, {"max": 2}], // 不能有多个空行,最多两行
"no-new-object": 2,  //禁用 Object 的构造函数
"no-trailing-spaces": 2, // 行尾不留空格
"object-curly-spacing": 2, //不允许花括号中有空格
"one-var-declaration-per-line": 2, // 一个var定义多个变量时每个变量必须换行
"padded-blocks": [2, "never"], // 其中一条:{}内第一行与最后一行不允许有空行
"quote-props": [2, "consistent"], //对象的属性名需要统一【 双引号、单引号、不加】三个选一
"quotes": [2, "single", {"allowTemplateLiterals": true}],
"semi-spacing": 2, // 分号前不加空格
"semi": 2, // 该有分号的地方都加分号
// "sort-keys": 1, //对象的键名需要按照字典序排序
// "sort-vars": 1, //变量定义按照字典序排序
"space-before-blocks": 2, // {} 前必须有空格,例如 function() {}
"space-before-function-paren": [2, "never"], // function 参数前不允许有空格
"spaced-comment": [2, "always"], // 注释后面//后需要增加空格
"arrow-parens": [2, "always"], // 要求箭头函数的参数使用圆括号
"constructor-super": 2, // 派生类中的构造函数必须调用 super()。非派生类的构造函数不能调用 super()。[字面量继承其他类的类就是派生类]
"generator-star-spacing": [2, "after"], // 约束 generator 函数强制在 * 和函数名之间有空格
"no-new-symbol": 2, // disallow new operators with the Symbol object 不要new symbol
"no-this-before-super": 2, // 禁止在构造函数中,在调用 super() 之前使用 this 或 super
//"no-var": 1, // 要求使用 let 或 const 而不是 var
//"prefer-rest-params": 1, // require rest parameters instead of arguments
"prefer-spread": 2, // 要求使用扩展运算符而非 .apply() ,参数在一个数组中时
"rest-spread-spacing": 2, // rest参数、扩展运算符 和其对应的表达式都不能有空格 ...args
"yield-star-spacing": [2, "after"], // 强制在 * 和 参数之间有空格 yield* other();
"no-debugger": "error", // 禁用 debugger
"no-sequences": "error", // 禁用逗号操作符
"no-dupe-args": "error", // 禁止 function 定义中出现重名参数
"no-inner-declarations": "error", // 禁止在嵌套的块中出现 function 声明 ;if等块中声明函数
 "no-unreachable": "error", // 禁止在return、throw、continue 和 break 语句之后出现不可达代码
"no-octal": "error", // 禁用八进制字面量 0开头的数字
"no-dupe-keys": "error", // 禁止对象字面量中出现重复的 key
"block-scoped-var": 2, // if,for内无var定义,可以用let // 强制把变量的使用限制在其定义的作用域范围内
"indent": [2, 4, {
      "SwitchCase": 1
    }],  // 统一缩进4字符,switch case需要缩进
"max-nested-callbacks": [2, 5], // 强制回调函数最大嵌套深度 5层
}
}

可能还需要一个排除检测文件,和.eslintrc.json同级的目录下面新建一个文件,名字为: .eslintignore
下面是element ui的排除文件

src/utils/popper.js
src/utils/date.js
*.sh
node_modules
lib
coverage

很多时候其实我们的工程都是在已有的基础上进行改进的,所以我们可能只是在新增加的代码上面进行eslint校验就好:那么就需要.eslintignore的书写只包含某个文件夹

/*
!/src
/src/*
!/src/page
/src/page/*
!/src/page/flist

上面就是只检查.eslintignore同级下的src/page/flist这个文件夹。这个.eslintignoregitignore是一样的规则,
gitignore规则描述
到这里其实还是差一些,安装了这个eslint的包,生产了配置文件,还需要ide挥着编辑器的配合,所以本文说的是vscode。

vscode+eslint

vscode是一个微软开源的编辑器,很多插件可以辅助,这个eslint就是一个插件,安装eslint插件,安装插件后,会检测打开的工程是否存在一个eslint的配置文件,存在的话就会执行eslint的检测,不存在的话就不会检测。

react+eslint有个问题,react的组件引入时会被认为没有被使用no-unused-vars,需要引入react插件,引入规则"react/jsx-uses-vars": 2
对于react的使用,一些无状态的组件虽然没有显示的调用react,但是编译后会使用React.createElement来构造组件,所以还是会出现react没有被使用no-unused-vars,只能通过注释来消除

/* eslint-disable */  整个下面块不检查
// eslint-disable-next-line  下一行不检查
import React, {Component} from 'react';  // eslint-disable-line   本行不检查

完整的编写:


{
    "env": {
        "browser": true,
        "commonjs": true,
        "es6": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaFeatures": {
            "experimentalObjectRestSpread": true,
            "jsx": true
        },
        "sourceType": "module"
    },
    "plugins": [
        "react"
    ],
    "rules": {
        "no-cond-assign": 0,
        "no-console": 2,
        "no-alert": 2,
        "no-irregular-whitespace": 2,
        "no-unexpected-multiline": 2,
        "guard-for-in": 2,
        "no-caller": 2,
        "no-extend-native": 2,
        "no-extra-bind": 2,
        "no-invalid-this": 1,
        "no-multi-spaces": 2,
        "no-multi-str": 2,
        "no-new-wrappers": 2,
        "no-throw-literal": 2,
        "no-with": 2,
        "no-unused-vars": [2, {"args": "none"}],
        "react/jsx-uses-vars": 2,
        "array-bracket-spacing": [2, "never"],
        "brace-style": 2,
        "comma-dangle": [2],
        "comma-spacing": 2,
        "comma-style": 2,
        "computed-property-spacing": 2,
        "func-call-spacing": 2,
        "jsx-quotes": 2,
        "key-spacing": 2,
        "keyword-spacing": 0,
        "linebreak-style": 2,
        "new-cap": 2,
        "no-array-constructor": 2,
        "no-mixed-spaces-and-tabs": 2,
        "no-multiple-empty-lines": [2, {"max": 2}],
        "no-new-object": 2,
        "no-tabs": 0,
        "no-trailing-spaces": 2,
        "object-curly-spacing": 2,
        "padded-blocks": [2, "never"],
        "quote-props": [2, "consistent"],
        "quotes": [2, "single", {"allowTemplateLiterals": true}],
        "semi-spacing": 2,
        "semi": 2,
        "space-before-blocks": 2,
        "space-before-function-paren": [2, "never"],
        "spaced-comment": [2, "always"],
        "constructor-super": 2,
        "generator-star-spacing": [2, "after"],
        "no-new-symbol": 2,
        "no-this-before-super": 2,
        "no-var": 1,
        "prefer-rest-params": 1,
        "prefer-spread": 2,
        "rest-spread-spacing": 2,
        "yield-star-spacing": [2, "after"],
        "no-debugger": "error",
        "no-sequences": "error",
        "no-dupe-args": "error",
        "no-inner-declarations": "error",
        "no-unreachable": "error",
        "no-octal": "error",
        "no-dupe-keys": "error",
        "block-scoped-var": 2,
        "indent": [2, 4, {
        "SwitchCase": 1
        }],
        "max-nested-callbacks": [2, 5]
        
    }
}

使用vscode的时候,有的时候使用脚手架生成的代码缩进会是2个空格,大部分时间我们可能需要4个空格,所以在首选项里面可以设置,不检查代码的缩进,不管什么情况都是用4空格缩进,"editor.tabSize": 4,"editor.detectIndentation": false

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(