在React+Babel+Webpack环境中使用ESLint
ESLint是js中目前比较流行的插件化的静态代码检测工具。通过使用它可以保证高质量的代码,尽量减少和提早发现一些错误。使用eslint可以在工程中保证一致的代码风格,特别是当工程变得越来越大、越来越多的人参与进来时,需要加强一些最佳实践。
本文假设您已经有一个react+babel+webpack的起始工程,可以参考react-webapp-startkit
首先,安装eslint包
在项目的跟目录下,运行
npm --save-dev install eslint
因为我们使用了webpack,所以必须要告诉webpack我们在构建时使用eslint,安装eslint-loader
npm --save-dev install eslint-loader
安装之后,我们可以再webpack配置中使用eslint加载器了。
webpack.config.js
...
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'react-hot!babel'
},
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'eslint-loader'
}
]
},
...
此外,我们既可以在webpack配置文件中指定检测规则,也可以遵循最佳实践在一个专门的文件中指定检测规则。我们就采用后面的方式。
在根目录下:
touch .eslintrc
.eslintrc
{
"rules": {
}
}
稍后我们可以在该文件中指定规则,但首先我们要在Webpack配置文件中引入该文件。
webpack.cofnig.js
...
devServer: {
contentBase: './dist',
hot: true,
historyApiFallback: true
},
eslint: {
configFile: './.eslintrc'
},
plugins: [
...
现在可以启动app了,在根目录下
npm run dev // 取决与package.json中的定义
你可能会看到The keyword ‘import’ is reserved的解析错误。这是因为eslint还不知道通过Babel使用的ES6特性(比如import)。
ESLint + Babel
之前,我们已经安装了babel-loader(在起步工程中)来转换我们的代码。现在我们可以将它和eslint-loader一同使用。
webpack.config.js
...
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'react-hot!babel'
},
{
test: /\.js$/,
exclude: /node_modules/,
loaders: ['babel-loader', 'eslint-loader']
}
]
},
...
或者,使用webpack的preLoaders
webpack.config.js
...
module: {
preLoaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'eslint-loader'
},
],
loaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'react-hot!babel'
}
]
},
...
我们可以通过babel-eslint来检测ES6代码。
还是先安装
npm install --save-dev babel-eslint
修改.eslintrc
{
parser: "babel-eslint",
"rules": {
}
}
现在应该可以启动app了,但是没有任何错误显示,不要高兴的太早,这只是因为我们还没有添加任何检测规则。
ESLint规则
我们来添加我们的第一条规则。
修改.eslintrc
...
"rules": {
"max-len": [1, 70, 2, {ignoreComments: true}]
}
...
我们添加了一条规则来检查代码的单行长度,当单行代码长度大于70个字符时,检测会报错。
启动app,你可能会看到关于代码长度的错误,因为某些行多于70个字符了。我们可以修改规则来允许更多的字符。
.eslintrc
...
"rules": {
"max-len": [1, 120, 2, {ignoreComments: true}]
}
...
如果还有错误,可能你就需要考虑修改代码了。
React的ESLint规则
现在来添加一些检测React的代码规则,使用eslint-plugin-react。
npm --save-dev install eslint-plugin-react
安装之后,我们可以使用react插件来指定我们关于react的第一条代码规则。比如我们要求组件指定PropTypes。
.eslintrc
{
parser: "babel-eslint",
"plugins": [
"react"
],
"rules": {
"max-len": [1, 120, 2, {ignoreComments: true}],
"prop-types": [2]
}
}
当启动app后,你可能会看到PropTypes定义的错误,你可能想要修复这些错误。
另外,我们可以使用一些包含推荐规则的预设,但暂时我们先扩展自己的规则。
扩展ESLint规则
我们不想每次都指定这些规则,所幸已经有很多符合最佳实践的规则。其中之一就是Airbnb Style Guide,此外Airbnb还开源了他们自己的ESlint配置。
已经有一部分依赖包安装了,但还缺少一些:
npm --save-dev install eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y
Now we can add a one-liner to our ESLint configuration to use Airbnbs’ ESLint configuration. When you look back at the packages we installed, you can see that the configuration includes JSX and React rules.
接下来,通过一行代码的配置来让我们可以使用Airbnb的ESLint配置(你可以通过查看node_modules里面的包来查看,这个配置包含了jsx和React的规则)
.eslintrc
{
parser: "babel-eslint",
"extends": "airbnb",
"rules": {
"max-len": [1, 120, 2, {ignoreComments: true}],
"prop-types": [2]
}
}
我们可以看到可以很简单的使用别人的配置规则来扩展ESLint规则。我们还可以使用其他的扩展,但目前Airbnb代码规范和ESlint配置非常的受欢迎并被大多数开发者所接受。
微调
有时候,为了迎合自己的项目需要,需要对某些特殊的规则微调。
比如我们不想看到no-unused-vars(为使用过的变量定义)的警告,可以
.eslintrc
{
parser: "babel-eslint",
"extends": "airbnb",
"rules": {
"no-unused-vars": 0,
"max-len": [1, 120, 2, {ignoreComments: true}],
"prop-types": [2]
}
}
上面这种是全局的配置,如果是只想在某些文件中禁止检测,可以如下修改(通过注释的方式)
src/index
/*eslint-disable no-unused-vars*/
import SC from 'soundcloud';
/*eslint-enable no-unused-vars*/
import React from 'react';
import ReactDOM from ‘react-dom';
...
pre-commit钩子
如果项目使用了git,可以通过使用pre-commit钩子在每次提交前检测,如果检测失败则禁止提交。可以在很大一定程度上保证代码质量。
这里我们使用了pre-commitgit包来帮助我们实现这一目标。
首先在package.json中添加script命令:
"scripts": {
"eslint": "eslint --ext .js src"
}
其次,安装pre-commit
npm install pre-commit --save-dev
最后,在package.json中配置pre-commit需要运行的命令:
"pre-commit": [
"eslint"
]
完成之后,在每次提交之前,都会运行eslint命令进行检测,如果检测到有违反代码规则的情况,则会返回1,导致git commit失败。
done.
在React+Babel+Webpack环境中使用ESLint的更多相关文章
- React+ES6+Webpack环境配置
转自http://www.cnblogs.com/chenziyu-blog/p/5675086.html 参考http://www.tuicool.com/articles/BrAVv2y Reac ...
- (23/24) webpack实战技巧:如何在webpack环境中使用Json
在webpack1或者webpack2版本中,若想在webpack环境中加载Json文件,则需要加载一个json-loader的loader进来的.但是在webpack3.x版本中,则不需要在另外引入 ...
- react+babel+webpack初试
在上一篇,我们简单学习了webpack学习,现在这里我们简单学习一下react+babel+webpack,进行编译react语法jsx以及结合es6写法. 这里我就简单的直接上demo: packa ...
- react+es6+webpack环境搭建以及项目入门
前言:拖了这么久,小菜鸟终于开始正式应用react,和es6来开发项目了.之前超喜欢同学的一个博客风格,这里贴一下地址:https://iwenku.net/,PC端是他很久之前做的,最近他重新做了一 ...
- React开发环境搭建(react,babel,webpack webpack-dev-server)
最终效果: 配置webpack 自动编译脚本, 内容更改后浏览器页面自动刷新,提高效率. 主要靠webpack 的watch 功能. npm 全局安装的包: webpack webpack-cli w ...
- React+ES6+Webpack深入浅出
React已成为前端当下最热门的前端框架之一 , 其虚拟DOM和组件化开发让前端开发更富灵活性,而Webpack凭借它异步加载和可分离打包等优秀的特性,更为React的开发提供了便利.其优秀的特性不再 ...
- [webpack] 配置react+es6开发环境
写在前面 每次开新项目都要重新安装需要的包,简单记录一下. 以下仅包含最简单的功能: 编译react 编译es6 打包src中入口文件index.js至dist webpack配置react+es6开 ...
- 学习 React(jsx语法) + es2015 + babel + webpack
视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...
- (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境
通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...
随机推荐
- TreeView的绑定
近期遇到了TreeView的数据库绑定问题,确实是弄了我好几天,特别是多级节点的分步绑定,最開始不分步,发现所有载入页面都卡爆了,真心让人头疼.所以放出来,给须要的朋友看看,以免大家走冤枉路. 1.仅 ...
- Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列
Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...
- 系统预定义委托与Lambda表达式
NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式 开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Fun ...
- iPhone、iPad、iPadMini界面设计标准
一个:iPhone 4.0' Display: iPhone 5.iPhone 5S.iPhone 5C. 解析度:1136 * 960 设计标准參照下图iPhone5 3.5' Display: ...
- Cocos2d-x 3.1.1开发环境
Windows7上搭建Cocos2d-x 3.1.1开发环境 前言 现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握C ...
- 数据结构队列的java实现,包括线性和链式两种方式
实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...
- Linux--Windows与Linux互传文件
用惯了windows下的复制粘贴,转到Linux下确实不习惯,而且对于windows上搭建的windows的虚拟机,从主机到虚拟机之间无缝的复制粘贴,想从windows下拷贝文件到命令行的linux下 ...
- 浅谈DevExpress<六>:为chart创建动态数据源
今天搞点稍微复杂些的东西,在列表中点击不同的行时,图表中显示和其数据关联的图,效果如下:
- 一致性hash和虚拟节点
consistent hashing 算法的原理 consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在key 映射关 ...
- C#中利用JQuery实现视频网站
C#中利用JQuery实现视频网站的缩略图采集 最近有朋友想要采集优酷的视频标题和缩略图 (哈哈, 并非商业目的). 找到我帮忙, 考虑到有我刚刚发布的SpiderStudio, 我毫不犹豫的答应 ...