别只会抄eslint配置,来了解一下这几个有用的eslint的插件的作用

1,233 阅读6分钟

eslint-plugin-prettier

作用
  • eslint-plugin-prettier 是一个 ESLint 插件,它的主要作用是将 Prettier 作为 ESLint 的规则来运行。这意味着可以使用 ESLint 来检查代码是否符合 Prettier 的格式化规则,并且可以将 Prettier 的格式化错误作为 ESLint 的错误进行报告。
工作原理
  • 当 ESLint 运行时,eslint-plugin-prettier 会先使用 Prettier 对代码进行格式化,然后将格式化后的代码与原始代码进行比较。如果两者不同,就会报告一个 ESLint 错误,提示代码不符合 Prettier 的格式化规则。
配置

eslint-config-prettier

作用
  • eslint-config-prettier 是一个 ESLint 配置文件,它的主要作用是关闭 ESLint 中与 Prettier 冲突的规则。因为有些 ESLint 规则可能会与 Prettier 的格式化规则产生冲突,例如 ESLint 可能有自己的缩进规则,而 Prettier 也有自己的缩进规则,这时候就需要关闭 ESLint 中这些冲突的规则,以避免重复的格式化和错误报告。
工作原理
  • 当使用 eslint-config-prettier 时,它会自动禁用那些与 Prettier 冲突的 ESLint 规则,确保 ESLint 和 Prettier 能够和谐共处。
  • eslint-plugin-prettiereslint-config-prettier常常一起配合使用
配置

eslint-plugin-react-hooks

作用
  • eslint-plugin-react-hooks 是react官方发布的一个eslint插件,也是vite创建react项目时默认内置的eslint插件,主要用于在使用 React Hooks 时进行静态代码检查,帮助开发者遵循 React Hooks 的规则,避免一些常见的错误和陷阱。
演示
  • 比如使用useEffect时,如果内部使用了useState,则会要求把useState加入依赖中,除非非必需。如果依赖了外部函数,会要求转成useCallback等等。

image.png

image.png

配置

eslint-plugin-react-refresh

作用
  • eslint-plugin-react-refresh 是一个 ESLint 插件,主要用于配合 React Refresh 来进行代码检查。
  • React Refresh 是 React 官方提供的一种在开发过程中实现快速刷新的技术。它允许在不丢失组件状态的情况下,实时更新模块的代码。当你修改组件的代码时,React Refresh 会智能地更新组件,而不是重新加载整个页面,这样可以大大提高开发效率。
  • eslint-plugin-react-refresh 为 React Refresh 提供了一系列 ESLint 规则,会检查你的代码中是否存在与 React Refresh 不兼容的代码模式,例如在函数组件中使用了不支持的语法或 API。如果发现这些问题,ESLint 会给出相应的警告或错误提示,帮助你及时修复。
  • 通常和eslint-plugin-react-hooks配合使用。
配置

eslint-plugin-jsx-a11y

作用
  • eslint-plugin-jsx-a11y 是一个用于检查 React JSX 代码中可访问性(Accessibility,即 a11y,是 “accessibility” 一词中字母 “a” 到 “y” 之间有 11 个字母,故用 a11y 来简称)问题的 ESLint 插件。
  • 可访问性是指确保网站和应用程序对于所有用户,包括那些有残疾或特殊需求的用户,都是可用的。eslint-plugin-jsx-a11y 会依据各种可访问性标准(如 WCAG - Web Content Accessibility Guidelines)来检查 JSX 代码,提醒开发者注意代码中可能存在的违反可访问性原则的问题,从而帮助开发者编写出更具包容性的代码。
  • 确保使用的 HTML 标签具有正确的语义,比如使用 <button> 标签来表示可点击的按钮,而不是使用 <div> 标签并添加点击事件来模拟按钮,因为 <button> 标签本身具有更好的可访问性语义。检查表单元素(如输入框、复选框等)是否有正确的标签(label)与之关联,以便屏幕阅读器能够正确地为用户描述这些表单元素的用途。
演示

image.png

配置

eslint-plugin-styled-components-a11y

作用
  • eslint-plugin-styled-components-a11y和上面的类似,不过是用来对使用 styled-components 编写的样式化组件进行静态代码分析,以确保这些组件遵循可访问性最佳实践。
配置
踩坑
  • eslint v8的配置是没问题的,对eslint v9的配置似乎有点问题。

eslint-plugin-import

作用
  • eslint-plugin-import允许开发者定义导入语句的分组和排序规则,使代码更加整洁和易于阅读。可以整理导入模块路径,避免重复的导入模块。
演示

image.png

配置
  • 导入顺序要额外配置
import importPlugin from 'eslint-plugin-import'

{
    extends: [importPlugin.flatConfigs.recommended],
    rules: {
        'import/order': [
            'error',
            {
                // 定义导入分组
                groups: [
                    'builtin', // 内置模块,如 'fs', 'path' 等
                    'external', // 外部依赖,如 'react', 'lodash' 等
                    'internal', // 内部模块,以相对路径引入的模块
                    'parent', // 父级目录下的模块
                    'sibling', // 同级目录下的模块
                    'index', // 当前目录下的 index 文件
                ],
                // 定义每组内的排序规则
                alphabetize: {
                    order: 'asc', // 按字母顺序升序排列
                    caseInsensitive: true, // 不区分大小写
                },
            },
        ], 
    }
}

eslint-plugin-jsdoc

作用
  • eslint-plugin-jsdoc可以强制要求开发者为函数添加 JSDoc 注释,包括对函数的功能描述、参数说明和返回值说明等。
  • jsdoc默认是全部需要的。不过对于ts,则不需要一些jsdoc的类型,可以根据js/jsx和ts/tsx文件做不同的配置,比如ts/tsx则去掉需要type的rules。
配置
import jsdoc from 'eslint-plugin-jsdoc'
// ts
{
    files: ['**/*.{ts,tsx}'],
    extends: [jsdoc.configs['flat/recommended']],
    rules: {
        'jsdoc/require-param-type': 'off',
        'jsdoc/require-returns': 'off',
    }
}

// js
{
    files: ['**/*.{js,jsx}'],
    extends: [jsdoc.configs['flat/recommended']],
}

tseslint.config和flatconfig

现在eslint v9主推的是flatconfig,也就是直接导出一个数组,里面是扁平化的配置。

image.png 我们看到大多数插件文档,也是使用这种方式导入,例如 eslint-plugin-react-refresh 的文档,它的推荐配置:

image.png

其实内部的结构是这样的:

image.png

也就是说,实际上是使用一个对象,里面有plugin和rules两个属性:

{
    plugins: {
        [插件名]:{
            rules: {
                ...
            }
        }
    },
    rules: {
        ...
    }
}

所以遇到这种扁平化配置,要追加配置,只需要在后面添加一个对象,然后像之前配eslint一样配置规则就行了。

image.png

但是我们使用vite创建react+typescript项目的时候,发现是直接导出了一个tseslint.config({...},{...}), 差点没把我搞蒙了。

image.png

原来tseslint.config可以将一个个配置整理在一起,变成一个配置导出。那么上面的flatconfig要怎么在这里配置呢?聪明的小伙伴可能已经看出来了,把...recommended注册到extends里面即可。如果没有提供recommended,则按照文档,把插件注册到plugins中,再启动或者关闭对应的rules即可。

extends和plugins怎么区分?

  • 原本每个插件都要到plugins中注册,然后再到rules把对应的每条规则都开启。
  • 但是如果有100条规则,岂不是要写100个rules
  • 此时插件的作者会把一些常用的rules写在recommended中,再通过extends直接继承就好了。如果作者推荐的一些规则是不需要的,则到rules关闭即可。或者是作者没推荐的规则,到rules注册启用即可。