webpack -- eslint的配置

eslint的作用:代码规范工具。

eslint的使用

项目目录:(简单举例)

|--demo
	|--src
		|--index.html
		|--index.js
		|--home.js
		|--list.js
	|--node_modules
	|--package.json
	|--package-lock.json
	|--webpack.config.js

index.js代码:(不规范版本)

import React, { Component } from 'react';
import ReactDom from 'react-dom';
class App extends Component {
  render() {
    return <div>hello 小橙子</div>
  }
}

ReactDom.render(<App />, document.getElementById('root'));

安装eslint:

npm  i  eslint  -D

初始化eslint配置文件:

npx  eslint  --init  // 使用npx可以直接运行刚刚安装的eslint命令

1.选择规范约束类型

分别代表含义:

  • 只检查语法
  • 检查语法,并查找问题
  • 检查语法、查找问题并强制执行代码样式

2.选择import/export模块语法。

3.选择react语法

4.不实用TypeScripts语法。

5.选择在浏览器运行项目。

6.选择一种通用的约束标准:

7.选择Airbnb公司的前端规范要求

8.选择JavaScript语法进行配置:

9.做eslint需要一些依赖项,选择现在开始安装:

按照以上顺序初始化eslint配置之后,在项目根目录下,会多出一个 .eslintrc.js文件 . 具体配置如下:

module.exports = {
  env: {
    browser: true,
    es6: true,
  },
  extends: [
    'airbnb',
  ],
  globals: {
    Atomics: 'readonly',
    SharedArrayBuffer: 'readonly',
  },
  parserOptions: { 
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 2018,
    sourceType: 'module',
  },
  plugins: [
    'react',
  ],
  rules: {
  },
};

接下来,我们使用eslint来检测src下得代码是否符合airbnb公司前端代码规范:
命令行运行:npx eslint src

执行检测src目录代码规范命令后,不规范代码会在命令行直接给予提示,方便我们错误排查。很明显,index.js中的代码有两处不符合airbnb公司前端代码的规范:

  • 第2行,import语句后应有1个空行。
  • 第5行,缺少分号。

我们做如下修正:(index.js规范版本)

import React, { Component } from 'react';
import ReactDom from 'react-dom';

class App extends Component {
  render() {
    return <div>hello 小橙子</div>;
  }
}

ReactDom.render(<App />, document.getElementById('root'));

再次执行规范检查:npx eslint src
此时命令行不再报错。

在webpack中配置eslint

业务代码不再具体体现,主要分享eslint的配置方式

扫描二维码关注公众号,回复: 8502465 查看本文章

需借助eslint-loader:

npm  i  eslint-loader  --save-dev

在webpack.config.js里配置:

module: { 
    rules: [{
      test: /\.js$/,
      exclude: /node_modules/,
      use: ['babel-loader', 'eslint-loader'] // loader的执行顺序是从后向前的,这里先执行eslint-loader
    }]
}
  • 当遇到一个js文件的时候,我们会先使用eslint-loader检查代码是否规范,然后再去使用babel-loader做代码的转换。

执行打包:

npm  run  start

会在命令行中提示代码规范错误❌. 如果我们期望当不规范代码出现时,直接在浏览器页面弹出层提示,可以通过如下配置来完成:(overlay)

webpack.config.js

devServer: {
    overlay: true, // 当运行webpack-dev-server去做打包的时候,一旦遇到语法规范的问题,就会在页面弹出层提示我们
    contentBase: './dist',
    open: true,
    port: 8081,
    hot: true,
    hotOnly: true
}
  • overlay: true 指当运行webpack-dev-server去做打包的时候,一旦遇到语法规范的问题,就会在页面弹出层提示我们.

再次执行打包,页面提示如下:

这样我们就可以根据报错提示,一一修正不规范代码。

如果我们不想遵循某个规范,可以在 .eslintrc.js 配置项rules里排除掉:

rules: {
    "import/no-extraneous-dependencies": 0, // 不遵循此要求
    "react/prefer-stateless-function": 0,
    "react/jsx-filename-extension": 0
}
  • 把规范项设置为0,既为不遵循此规则。

即便我们的编译器中没有eslint的插件,我们也可以借助eslint-loader依赖,在webpack中的配置,也可以很方便的定位我们代码规范中的问题,同时也能快速的解决。 (使用过vue框架的小伙伴应该清楚,在vue开发项目的过程中,也会经常在页面上出现报错想象,是因为在vue-cli脚手架里,已经帮我们封装好了一些插件的配置。原理与我们使用的eslint-loader的配置类似)

注意事项

在webpack.config.js的module配置规则中:

module: { 
    rules: [{
      test: /\.js$/,
      exclude: /node_modules/,
      use: ['babel-loader', {
        loader: 'eslint-loader',
        options: {
          fix: true // 如果存在很浅显的不规范代码,eslint会自动帮你修复掉
        }
      }] 
    }]
}
  • loader的执行顺序是从后向前的,这里先执行eslint-loader
  • 当遇到一个js文件的时候,我们会先使用eslint-loader检查代码是否规范,然后再去使用babel-loader做代码的转换。

如果把eslint-loader和babel-loader颠倒位置配置,则是不正确的做法,如果非要这么做,那么可以借助 force: “pre” 配置项,强制eslint-loader先执行。如下:

module: { 
    rules: [{
      test: /\.js$/,
      exclude: /node_modules/,
      use: [{
        loader: 'eslint-loader',
        options: {
          fix: true // 如果存在很浅显的不规范代码,eslint会自动帮你修复掉
        },
        force: 'pre' // 强制eslint-loader先执行
      }, 'babel-loader'] 
    }]
}

通过以上配置之后,就算把babel-loader配置在eslint-loader之后,也会先去执行eslint-loader。

最佳实战

如果在公司做项目的过程中,一般不会把eslint-loader配置在webpack中,一旦使用它,就会不可避免的拖慢我们的打包速度,所以,在真实项目中,不会去使用eslint-loader。

一般我们在团队合作开发的过程中,都会使用Git版本管理仓库。Git里有个钩子,在git提交代码时,对代码进行一个eslint的检测,如果代码不符合规范,则不允许代码提交到git仓库。

缺点: 这种方式只会在提交代码时,命令行提示错误信息,不能图形交互的提示。

所以,在做项目的打包配置的时候,或者到底要不要做一些插件使用的时候,不仅要考虑它是否方便, 还要考虑是否会对打包速度有一定影响,如果影响较大,也可以在便捷性上做一些牺牲。从而提高它的打包速度。?

发布了54 篇原创文章 · 获赞 22 · 访问量 7241

猜你喜欢

转载自blog.csdn.net/Riona_cheng/article/details/100664161