webpack配置相关的页面异常
原文:https://www.cnblogs.com/Hsong/p/9023341.html
前言
在团队协作开发中,为了统一代码风格,避免一些低级错误,应该设有团队成员统一遵守的编码规范。很多语言都提供了Lint工具来实现这样的功能,JavaScript也有类似的工具:ESLint。除了可以集成到构建工具中(如:Gulp)在构建过程中检查代码风格以外;还可以通过将ESLint和代码编辑器相结合以提供代码风格的实时校验。这里将介绍如何在Visual Studio Code使用ESLint来提供代码风格的实时校验。
配置原则
- 能够帮助发现代码错误的规则,全部开启
- 配置不应该依赖于某个具体项目,而应尽可能的合理
- 帮助保持团队的代码风格统一,而不是限制开发体验
配置解读
- 每一条配置都有注释说明此配置的用途
- 对于理解困难的配置,都在注释中有举例
- 对于有争议的配置,都在注释中说明了为什么要这么配置的原因
- 对于关闭掉的配置,都在注释中有对应的原因说明,以及 @off 的标识
- 对于能够 autofix 的配置,都在注释中有标注 @autofix
EsLint提供以下支持:
- ES6
- AngularJS
- JSX
- Style检查
- 自定义错误和提示
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配置相关的页面异常的更多相关文章
- Vue+webpack配置实现多页面应用开发
为什么要配置多页面开发? · 由于单页面应用不利于SEO,对于某些资讯类网站不够友好,而多页面则能够更优的解决此问题. · 传统的多页面开发模式(如java的jsp等) 前后端耦合性大,开发效率低,代 ...
- webpack配置--传统多页面项目
//依赖包--package.json文件 { "name": "webemeet", "version": "1.0.0&quo ...
- VUE 多页面打包webpack配置
思路:多配置一个main的文件,用于webpack入口使用, 然后路由的导向也应该默认指向新组件,最后通过webpack构建出一个新的独立的html文件. 缺点:生成多个html会new出多个vu ...
- vue-cli3.x中的webpack配置,优化及多页面应用开发
官方文档 vue-cli3以下版本中,关于webpack的一些配置都在config目录文件中,可是vue-cli3以上版本中,没有了config目录,那该怎么配置webpack呢? 3.x初始化项目后 ...
- webpack+react+antd 单页面应用实例
React框架已经火了好长一段时间了,再不学就out了! 对React还没有了解的同学可以看看我之前的一篇文章,可以快速简单的认识一下React.React入门最好的实例-TodoList 自己从开始 ...
- webpack配置React开发环境(上)
Webpack 是一个前端资源加载/打包工具,我们部门的一条主要技术栈就是Webpack+React+ES6+node,虽然之前自己做个人项目也接触好多次Webpack,但是自己并没有研读总结过Web ...
- webpack配置这一篇就够
最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...
- 前端工程化(二)---webpack配置
导航 前端工程化(一)---工程基础目录搭建 前端工程化(二)---webpack配置 前端工程化(三)---Vue的开发模式 前端工程化(四)---helloWord 继续上一遍的配置,本节主要记录 ...
- vue-cli中webpack配置详解
vue-cli是构建vue单页应用的脚手架,命令行输入vue init <template-name> <project-name>从而自动生成的项目模板,比较常用的模板有we ...
随机推荐
- liunx 里面安装phpstudy环境s
ngixwget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin #权限设置 ./phpstudy.bin #运行 ...
- redi通过哨兵sentinel实现主从切换
本次实验主要为了让哨兵监听redis主从复制,当主节点关闭后,哨兵会选举一台从节点成为主节点,并且让其他从节点变成新主节点得从节点 本次理论需要三台机器,一主两从,为了方便用一台服务器开启三个实例,一 ...
- HTML5学习(一)
HTML5学习 HTML5的基本结构 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content ...
- Ajax json jquery实现菜单案例
需求: 运用AJAX请求文件menu.json,配置菜单栏,并实现以下功能点: 1. 点击向左箭头,菜单向左移动,隐藏 2. 点击向右箭头,菜单向右移动,显示3. 点击一级菜单,被点击菜单的子菜单显示 ...
- iwebshop 增删改查
<?php header("content-type:text/html;charset=utf-8"); class Test extends IController { ...
- [Beginning SharePoint Designer 2010]Chapter 3 分析SharePoint页面
本章概要: 1.SharePoint中主要页面类型 2.SharePoint如何组织页面 3.如何编辑母板页 4.SharePoint母板页中的主要内容占位符
- 从C到C++(下)
继承 从一个类派生到另外一个类,使前者的所有特征在后者中自己主动可用. 他能够声明一些类型,这些类型能够共享部分或所有曾经所声明的类型.它也能够从超过一个的基类中共享一些特性. C++是支持多继承的. ...
- Linux体验之旅(一)——制作U启,安装rhel-server-6.3
U启制作: 双击UltraISO: 点击文件→打开: 选择rhel-server6.3 点击启动→选择写入硬盘映像 最后选择格式化优盘→写入→完毕 注意:启动盘制作完毕后一定记得将rhel-serve ...
- 用jquery ajax做的select菜单,选中的效果
//用server端语言赋值给js变量 var departmentId = '<%=提交的值 %>', deviceId='<%=提交的值 %>' $(fun ...
- 51NOD 1686 第K大区间 二分
第k大区间 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数n和k(1<=n<=100000,k<=n* ...