原文:https://www.cnblogs.com/Hsong/p/9023341.html

前言

在团队协作开发中,为了统一代码风格,避免一些低级错误,应该设有团队成员统一遵守的编码规范。很多语言都提供了Lint工具来实现这样的功能,JavaScript也有类似的工具:ESLint。除了可以集成到构建工具中(如:Gulp)在构建过程中检查代码风格以外;还可以通过将ESLint和代码编辑器相结合以提供代码风格的实时校验。这里将介绍如何在Visual Studio Code使用ESLint来提供代码风格的实时校验。

配置原则

  1. 能够帮助发现代码错误的规则,全部开启
  2. 配置不应该依赖于某个具体项目,而应尽可能的合理
  3. 帮助保持团队的代码风格统一,而不是限制开发体验

配置解读

  1. 每一条配置都有注释说明此配置的用途
  2. 对于理解困难的配置,都在注释中有举例
  3. 对于有争议的配置,都在注释中说明了为什么要这么配置的原因
  4. 对于关闭掉的配置,都在注释中有对应的原因说明,以及 @off 的标识
  5. 对于能够 autofix 的配置,都在注释中有标注 @autofix

EsLint提供以下支持:

  1. ES6
  2. AngularJS
  3. JSX
  4. Style检查
  5. 自定义错误和提示

EsLint提供以下几种校验:

1.语法错误校验
2.不重要或丢失的标点符号,如分号
3.没法运行到的代码块(使用过WebStorm的童鞋应该了解)
4.未被使用的参数提醒
5.漏掉的结束符,如}
6.确保样式的统一规则,如sass或者less
7.检查变量的命名

详细的配置内容在这里:

/**
* AlloyTeam ESLint 规则 - React
*
* 包含所有 ESLint 规则,以及所有 eslint-plugin-react 规则
* 使用 babel-eslint 作为解析器
*
* @fixable 表示此配置支持 --fix
* @off 表示此配置被关闭了,并且后面说明了关闭的原因
*/ module.exports = {
extends: [
'./index.js',
],
plugins: [
'react'
],
rules: {
// 布尔值类型的 propTypes 的 name 必须为 is 或 has 开头
// @off 不强制要求写 propTypes
'react/boolean-prop-naming': 'off',
// 一个 defaultProps 必须有对应的 propTypes
// @off 不强制要求写 propTypes
'react/default-props-match-prop-types': 'off',
// 组件必须有 displayName 属性
// @off 不强制要求写 displayName
'react/display-name': 'off',
// 禁止在自定义组件中使用一些指定的 props
// @off 没必要限制
'react/forbid-component-props': 'off',
// 禁止使用一些指定的 elements
// @off 没必要限制
'react/forbid-elements': 'off',
// 禁止使用一些指定的 propTypes
// @off 不强制要求写 propTypes
'react/forbid-prop-types': 'off',
// 禁止直接使用别的组建的 propTypes
// @off 不强制要求写 propTypes
'react/forbid-foreign-prop-types': 'off',
// 禁止使用数组的 index 作为 key
// @off 太严格了
'react/no-array-index-key': 'off',
// 禁止使用 children 做 props
'react/no-children-prop': 'error',
// 禁止使用 dangerouslySetInnerHTML
// @off 没必要限制
'react/no-danger': 'off',
// 禁止在使用了 dangerouslySetInnerHTML 的组建内添加 children
'react/no-danger-with-children': 'error',
// 禁止使用已废弃的 api
'react/no-deprecated': 'error',
// 禁止在 componentDidMount 里面使用 setState
// @off 同构应用需要在 didMount 里写 setState
'react/no-did-mount-set-state': 'off',
// 禁止在 componentDidUpdate 里面使用 setState
'react/no-did-update-set-state': 'error',
// 禁止直接修改 this.state
'react/no-direct-mutation-state': 'error',
// 禁止使用 findDOMNode
'react/no-find-dom-node': 'error',
// 禁止使用 isMounted
'react/no-is-mounted': 'error',
// 禁止在一个文件创建两个组件
// @off 有一个 bug https://github.com/yannickcr/eslint-plugin-react/issues/1181
'react/no-multi-comp': 'off',
// 禁止在 PureComponent 中使用 shouldComponentUpdate
'react/no-redundant-should-component-update': 'error',
// 禁止使用 ReactDOM.render 的返回值
'react/no-render-return-value': 'error',
// 禁止使用 setState
// @off setState 很常用
'react/no-set-state': 'off',
// 禁止拼写错误
'react/no-typos': 'error',
// 禁止使用字符串 ref
'react/no-string-refs': 'error',
// 禁止在组件的内部存在未转义的 >, ", ' 或 }
'react/no-unescaped-entities': 'error',
// @fixable 禁止出现 HTML 中的属性,如 class
'react/no-unknown-property': 'error',
// 禁止出现未使用的 propTypes
// @off 不强制要求写 propTypes
'react/no-unused-prop-types': 'off',
// 定义过的 state 必须使用
// @off 没有官方文档,并且存在很多 bug: https://github.com/yannickcr/eslint-plugin-react/search?q=no-unused-state&type=Issues&utf8=%E2%9C%93
'react/no-unused-state': 'off',
// 禁止在 componentWillUpdate 中使用 setState
'react/no-will-update-set-state': 'error',
// 必须使用 Class 的形式创建组件
'react/prefer-es6-class': [
'error',
'always'
],
// 必须使用 pure function
// @off 没必要限制
'react/prefer-stateless-function': 'off',
// 组件必须写 propTypes
// @off 不强制要求写 propTypes
'react/prop-types': 'off',
// 出现 jsx 的地方必须 import React
// @off 已经在 no-undef 中限制了
'react/react-in-jsx-scope': 'off',
// 非 required 的 prop 必须有 defaultProps
// @off 不强制要求写 propTypes
'react/require-default-props': 'off',
// 组件必须有 shouldComponentUpdate
// @off 没必要限制
'react/require-optimization': 'off',
// render 方法中必须有返回值
'react/require-render-return': 'error',
// @fixable 组件内没有 children 时,必须使用自闭和写法
// @off 没必要限制
'react/self-closing-comp': 'off',
// @fixable 组件内方法必须按照一定规则排序
'react/sort-comp': 'error',
// propTypes 的熟悉必须按照字母排序
// @off 没必要限制
'react/sort-prop-types': 'off',
// style 属性的取值必须是 object
'react/style-prop-object': 'error',
// HTML 中的自闭和标签禁止有 children
'react/void-dom-elements-no-children': 'error',
// @fixable 布尔值的属性必须显式的写 someprop={true}
// @off 没必要限制
'react/jsx-boolean-value': 'off',
// @fixable 自闭和标签的反尖括号必须与尖括号的那一行对齐
'react/jsx-closing-bracket-location': [
'error',
{
nonEmpty: false,
selfClosing: 'line-aligned'
}
],
// @fixable 结束标签必须与开始标签的那一行对齐
// @off 已经在 jsx-indent 中限制了
'react/jsx-closing-tag-location': 'off',
// @fixable 大括号内前后禁止有空格
'react/jsx-curly-spacing': [
'error',
{
when: 'never',
attributes: {
allowMultiline: true
},
children: true,
spacing: {
objectLiterals: 'never'
}
}
],
// @fixable props 与 value 之间的等号前后禁止有空格
'react/jsx-equals-spacing': [
'error',
'never'
],
// 限制文件后缀
// @off 没必要限制
'react/jsx-filename-extension': 'off',
// @fixable 第一个 prop 必须得换行
// @off 没必要限制
'react/jsx-first-prop-new-line': 'off',
// handler 的名称必须是 onXXX 或 handleXXX
// @off 没必要限制
'react/jsx-handler-names': 'off',
// @fixable jsx 的 children 缩进必须为四个空格
'react/jsx-indent': [
'error',
4
],
// @fixable jsx 的 props 缩进必须为四个空格
'react/jsx-indent-props': [
'error',
4
],
// 数组中的 jsx 必须有 key
'react/jsx-key': 'error',
// @fixable 限制每行的 props 数量
// @off 没必要限制
'react/jsx-max-props-per-line': 'off',
// jsx 中禁止使用 bind
// @off 太严格了
'react/jsx-no-bind': 'off',
// 禁止在 jsx 中使用像注释的字符串
'react/jsx-no-comment-textnodes': 'error',
// 禁止出现重复的 props
'react/jsx-no-duplicate-props': 'error',
// 禁止在 jsx 中出现字符串
// @off 没必要限制
'react/jsx-no-literals': 'off',
// 禁止使用 target="_blank"
// @off 没必要限制
'react/jsx-no-target-blank': 'off',
// 禁止使用未定义的 jsx elemet
'react/jsx-no-undef': 'error',
// 禁止使用 pascal 写法的 jsx,比如 <TEST_COMPONENT>
'react/jsx-pascal-case': 'error',
// @fixable props 必须排好序
// @off 没必要限制
'react/jsx-sort-props': 'off',
// @fixable jsx 的开始和闭合处禁止有空格
'react/jsx-tag-spacing': [
'error',
{
closingSlash: 'never',
beforeSelfClosing: 'always',
afterOpening: 'never'
}
],
// jsx 文件必须 import React
'react/jsx-uses-react': 'error',
// 定义了的 jsx element 必须使用
'react/jsx-uses-vars': 'error',
// @fixable 多行的 jsx 必须有括号包起来
// @off 没必要限制
'react/jsx-wrap-multilines': 'off'
}
};

  

使用方法

标准规则
安装
npm install --save-dev eslint-config-alloy babel-eslint

  

配置 .eslintrc.js

在你的项目根目录下创建 .eslintrc.js,并将以下内容复制到文件中:

module.exports = {
extends: [
'eslint-config-alloy',
],
globals: {
// 这里填入你的项目需要的全局变量
// 这里值为 false 表示这个全局变量不允许被重新赋值,比如:
//
// jQuery: false,
// $: false
},
rules: {
// 这里填入你的项目需要的个性化配置,比如:
//
// // @fixable 一个缩进必须用两个空格替代
// 'indent': [
// 'error',
// 2,
// {
// SwitchCase: 1,
// flatTernaryExpressions: true
// }
// ]
}
};

  

React 版

安装

npm install --save-dev eslint-config-alloy eslint-plugin-react babel-eslint

配置 .eslintrc.js

在你的项目根目录下创建 .eslintrc.js,并将以下内容复制到文件中:

安装完成后我们可以看到除了ESLint命令行工具为我们生成的ESLint依赖包,还有一个特殊的.eslintrc.json文件,该文件是ESLint的配置文件,如下所示:

{
"extends": "standard",
"installedESLint": true,
"plugins": [
"standard"
]
}

  

配置文件中除了声明我们所使用的代码风格以外,我们还可以定制自己的规则,比如:声明全局变量或者规定字符串引号的风格,以及其他任何ESLint支持的规则都是可以配置的,下面是一个简单的示例:

{
"extends": "standard",
"installedESLint": true,
"plugins": [
"standard"
],
"rules": {
//关闭额外的分号检查
//0:关闭,1:警告,2:异常
"semi": 0,
//字符串必须使用单引号
"quotes": [
"error",
"single"
]
}
}

  

配置文件中除了声明我们所使用的代码风格以外,我们还可以定制自己的规则,比如:声明全局变量或者规定字符串引号的风格,以及其他任何ESLint支持的规则都是可以配置的,下面是一个简单的示例:

module.exports = {
extends: [
'eslint-config-alloy/react',
],
globals: {
// 这里填入你的项目需要的全局变量
// 这里值为 false 表示这个全局变量不允许被重新赋值,比如:
//
// React: false,
// ReactDOM: false
},
rules: {
// 这里填入你的项目需要的个性化配置,比如:
//
// // @fixable 一个缩进必须用两个空格替代
// 'indent': [
// 'error',
// 2,
// {
// SwitchCase: 1,
// flatTernaryExpressions: true
// }
// ],
// // @fixable jsx 的 children 缩进必须为两个空格
// 'react/jsx-indent': [
// 'error',
// 2
// ],
// // @fixable jsx 的 props 缩进必须为两个空格
// 'react/jsx-indent-props': [
// 'error',
// 2
// ]
}
};

  

代码改造经验

如果是一个新项目,应用一个比较严格的 ESLint 规则并不是一件难事。

但是如果是一个已经维护多年的老项目,那么突然引入 ESLint 就会有成千上万个错误。这个时候该如何改造呢?

1. 将所有报错的配置都关闭

运行 ESLint 之后,会有很多错误,这时候我们可以把他们先暂时关闭掉。

由于项目还在不停地迭代,这样可以保证其他不会报错的规则能够应用到新增的文件上。

这时你的 .eslintrc.js 应该类似与下面的样子:

module.exports = {
extends: [
'@alloyteam/eslint-config-standard',
],
globals: {
React: false,
jQuery: false,
$: false
},
rules: {
'no-dupe-keys': 'off',
'no-var': 'off',
'complexity': 'off',
'indent': 'off'
}
};

  

小技巧:如果报错的规则太多了,可以在运行 ESLint 的时候,加上参数 -f json,这样的话会以 json 格式输出,然后稍作处理就可以直接得到所有报错的规则了。

注意:一开始不要开启 --fix,因为修复的太多了,就难以 review 代码了

webpack配置相关的页面异常的更多相关文章

  1. Vue+webpack配置实现多页面应用开发

    为什么要配置多页面开发? · 由于单页面应用不利于SEO,对于某些资讯类网站不够友好,而多页面则能够更优的解决此问题. · 传统的多页面开发模式(如java的jsp等) 前后端耦合性大,开发效率低,代 ...

  2. webpack配置--传统多页面项目

    //依赖包--package.json文件 { "name": "webemeet", "version": "1.0.0&quo ...

  3. VUE 多页面打包webpack配置

      思路:多配置一个main的文件,用于webpack入口使用, 然后路由的导向也应该默认指向新组件,最后通过webpack构建出一个新的独立的html文件. 缺点:生成多个html会new出多个vu ...

  4. vue-cli3.x中的webpack配置,优化及多页面应用开发

    官方文档 vue-cli3以下版本中,关于webpack的一些配置都在config目录文件中,可是vue-cli3以上版本中,没有了config目录,那该怎么配置webpack呢? 3.x初始化项目后 ...

  5. webpack+react+antd 单页面应用实例

    React框架已经火了好长一段时间了,再不学就out了! 对React还没有了解的同学可以看看我之前的一篇文章,可以快速简单的认识一下React.React入门最好的实例-TodoList 自己从开始 ...

  6. webpack配置React开发环境(上)

    Webpack 是一个前端资源加载/打包工具,我们部门的一条主要技术栈就是Webpack+React+ES6+node,虽然之前自己做个人项目也接触好多次Webpack,但是自己并没有研读总结过Web ...

  7. webpack配置这一篇就够

    最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...

  8. 前端工程化(二)---webpack配置

    导航 前端工程化(一)---工程基础目录搭建 前端工程化(二)---webpack配置 前端工程化(三)---Vue的开发模式 前端工程化(四)---helloWord 继续上一遍的配置,本节主要记录 ...

  9. vue-cli中webpack配置详解

    vue-cli是构建vue单页应用的脚手架,命令行输入vue init <template-name> <project-name>从而自动生成的项目模板,比较常用的模板有we ...

随机推荐

  1. java基础口述

    1:什么是变量?变量的定义格式?要使用变量需要注意什么? 在程序运行过程中,其值是可以在某个范围内发生改变的量. 变量其实就是内存中一小块区域. 由3部分组成: 1,数据类型: 限定变量的取值 2,变 ...

  2. 经典alsa 录音和播放程序

    这里贴上虚拟机ubuntu下alsa的录音程序(capture.c)和播放程序(playback.c)的源码. 首先要测试一下自己的ubuntu是否打开了声音.这个可以打开/系统/首选项/声音  来调 ...

  3. springmvc上传操作

    创建虚拟目录  配置tomcat的配置文件server.xml 在真实路径中放置一个图片 启动服务器:  直接可以通过配置的虚拟路径来访问真实路径中的图片 所以 我们在做图片上传的操作的时候   就可 ...

  4. springboot配置容器

    servlet容器配置 Spring Boot快速的原因除了自动配置外,另一个就是将web常用的容器也集成进来并做自动配置,让使用它的人能更快速的搭建web项目,快速的实现自己的业务目的.什么是容器? ...

  5. javascript操作window对象

    document.defaultView或全局变量window--获取一个window对象. 1)获取窗体信息 innerHeight.innerWidth--获取窗体内容区域的高度.宽度. oute ...

  6. Android Otto调研

    这两天对Otto进行了一个简单的调研,发现官网特别简单差点儿没东西,github上给的sample也不是非常好.网上的技术博客也差点儿千篇一律,我就把自己的心得体会写下来吧,如有缘者看见望其少走弯路. ...

  7. [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法

    看看我们机房某畸形写的题解:http://blog.csdn.net/sinat_27410769/article/details/46754209 此题为popoQQQ神犇所出,在此orz #inc ...

  8. STM32F030, 使用嘀嗒定时器Systick实现LED闪烁

    本文主要解决两个问题 1 STM32的IO口要反转,怎么实现? 2 嘀嗒定时器systick的配置 解答1: 单片机的口,反转非常easy.sbit led = P1 ^6;  led = ~led; ...

  9. j-link修复 write flash 一直无法点击

    write flash 一直无法点击 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTcyNDI5NTc=/font/5a6L5L2T/fonts ...

  10. AngularJS 下拉列表demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...