eslint-plugin-react

eslint-plugin-react

ESLint插件为React项目提供全面代码规范检查

eslint-plugin-react是为React项目开发的ESLint插件。它提供丰富的规则集,用于检测和修复React代码中的潜在问题,涵盖JSX语法、组件定义和props使用等方面。插件包含多种配置选项,如推荐配置和自定义规则设置。它能够检查JSX语法、组件定义、props使用等多个方面,帮助开发者发现和修复潜在的代码问题。采用eslint-plugin-react可以有效提升React项目的代码质量和一致性。

eslintReactlinting配置规则Github开源项目

eslint-plugin-react <sup>[![Version Badge][npm-version-svg]][package-url]</sup>

===================

[![github actions][actions-image]][actions-url] [![Maintenance Status][status-image]][status-url] [![NPM version][npm-image]][npm-url] [![Tidelift][tidelift-image]][tidelift-url]

React specific linting rules for eslint

Installation

npm install eslint eslint-plugin-react --save-dev

It is also possible to install ESLint globally rather than locally (using npm install -g eslint). However, this is not recommended, and any plugins or shareable configs that you use must be installed locally in either case.

Configuration (legacy: .eslintrc*) <a id="configuration"></a>

Use our preset to get reasonable defaults:

"extends": [ "eslint:recommended", "plugin:react/recommended" ]

If you are using the new JSX transform from React 17, extend react/jsx-runtime in your eslint config (add "plugin:react/jsx-runtime" to "extends") to disable the relevant rules.

You should also specify settings that will be shared across all the plugin rules. (More about eslint shared settings)

{ "settings": { "react": { "createClass": "createReactClass", // Regex for Component Factory to use, // default to "createReactClass" "pragma": "React", // Pragma to use, default to "React" "fragment": "Fragment", // Fragment to use (may be a property of <pragma>), default to "Fragment" "version": "detect", // React version. "detect" automatically picks the version you have installed. // You can also use `16.0`, `16.3`, etc, if you want to override the detected value. // Defaults to the "defaultVersion" setting and warns if missing, and to "detect" in the future "defaultVersion": "", // Default React version to use when the version you have installed cannot be detected. // If not provided, defaults to the latest React version. "flowVersion": "0.53" // Flow version }, "propWrapperFunctions": [ // The names of any function used to wrap propTypes, e.g. `forbidExtraProps`. If this isn't set, any propTypes wrapped in a function will be skipped. "forbidExtraProps", {"property": "freeze", "object": "Object"}, {"property": "myFavoriteWrapper"}, // for rules that check exact prop wrappers {"property": "forbidExtraProps", "exact": true} ], "componentWrapperFunctions": [ // The name of any function used to wrap components, e.g. Mobx `observer` function. If this isn't set, components wrapped by these functions will be skipped. "observer", // `property` {"property": "styled"}, // `object` is optional {"property": "observer", "object": "Mobx"}, {"property": "observer", "object": "<pragma>"} // sets `object` to whatever value `settings.react.pragma` is set to ], "formComponents": [ // Components used as alternatives to <form> for forms, eg. <Form endpoint={ url } /> "CustomForm", {"name": "SimpleForm", "formAttribute": "endpoint"}, {"name": "Form", "formAttribute": ["registerEndpoint", "loginEndpoint"]}, // allows specifying multiple properties if necessary ], "linkComponents": [ // Components used as alternatives to <a> for linking, eg. <Link to={ url } /> "Hyperlink", {"name": "MyLink", "linkAttribute": "to"}, {"name": "Link", "linkAttribute": ["to", "href"]}, // allows specifying multiple properties if necessary ] } }

If you do not use a preset you will need to specify individual rules and add extra configuration.

Add "react" to the plugins section.

{ "plugins": [ "react" ] }

Enable JSX support.

With eslint 2+

{ "parserOptions": { "ecmaFeatures": { "jsx": true } } }

Enable the rules that you would like to use.

"rules": { "react/jsx-uses-react": "error", "react/jsx-uses-vars": "error", }

Shareable configs

Recommended

This plugin exports a recommended configuration that enforces React good practices.

To enable this configuration use the extends property in your .eslintrc config file:

{ "extends": ["eslint:recommended", "plugin:react/recommended"] }

See eslint documentation for more information about extending configuration files.

All

This plugin also exports an all configuration that includes every available rule. This pairs well with the eslint:all rule.

{ "plugins": [ "react" ], "extends": ["eslint:all", "plugin:react/all"] }

Note: These configurations will import eslint-plugin-react and enable JSX in parser options.

Configuration (new: eslint.config.js)

From v8.21.0, eslint announced a new config system. In the new system, .eslintrc* is no longer used. eslint.config.js would be the default config file name. In eslint v8, the legacy system (.eslintrc*) would still be supported, while in eslint v9, only the new system would be supported.

And from v8.23.0, eslint CLI starts to look up eslint.config.js. So, if your eslint is >=8.23.0, you're 100% ready to use the new config system.

You might want to check out the official blog posts,

and the official docs.

Plugin

The default export of eslint-plugin-react is a plugin object.

const react = require('eslint-plugin-react'); const globals = require('globals'); module.exports = [ { files: ['**/*.{js,jsx,mjs,cjs,ts,tsx}'], plugins: { react, }, languageOptions: { parserOptions: { ecmaFeatures: { jsx: true, }, }, globals: { ...globals.browser, }, }, rules: { // ... any rules you want 'react/jsx-uses-react': 'error', 'react/jsx-uses-vars': 'error', }, // ... others are omitted for brevity }, ];

Configuring shared settings

Refer to the official docs.

The schema of the settings.react object would be identical to that of what's already described above in the legacy config section.

<!-- markdownlint-disable-next-line no-duplicate-heading -->

Flat Configs

This plugin exports 3 flat configs:

  • flat.all
  • flat.recommended
  • flat['jsx-runtime']

The flat configs are available via the root plugin import. They will configure the plugin under the react/ namespace and enable JSX in languageOptions.parserOptions.

const reactPlugin = require('eslint-plugin-react'); module.exports = [ reactPlugin.configs.flat.recommended, // This is not a plugin object, but a shareable config object ];

You can of course add/override some properties.

Note: Our shareable configs does not preconfigure files or languageOptions.globals. For most of the cases, you probably want to configure some properties by yourself.

const reactPlugin = require('eslint-plugin-react'); const globals = require('globals'); module.exports = [ { files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], ...reactPlugin.configs.flat.recommended, languageOptions: { ...reactPlugin.configs.flat.recommended.languageOptions, globals: { ...globals.serviceworker, ...globals.browser, }, }, }, ];

The above example is same as the example below, as the new config system is based on chaining.

const reactPlugin = require('eslint-plugin-react'); const globals = require('globals'); module.exports = [ { files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], ...reactPlugin.configs.flat.recommended, }, { files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], languageOptions: { globals: { ...globals.serviceworker, ...globals.browser, }, }, }, ];

List of supported rules

<!-- begin auto-generated rules list -->

💼 Configurations enabled in.
🚫 Configurations disabled in.
🏃 Set in the jsx-runtime configuration.
☑️ Set in the recommended configuration.
🔧 Automatically fixable by the --fix CLI option.
💡 Manually fixable by editor suggestions.
❌ Deprecated.

Name                                 Description💼🚫🔧💡
boolean-prop-namingEnforces consistent naming for boolean props
button-has-typeDisallow usage of button elements without an explicit type attribute
checked-requires-onchange-or-readonlyEnforce using onChange or readonly attribute when checked is used
default-props-match-prop-typesEnforce all defaultProps have a corresponding non-required PropType
destructuring-assignmentEnforce consistent usage of destructuring assignment of props, state, and context🔧
display-nameDisallow missing displayName in a React component definition☑️
forbid-component-propsDisallow certain props on components
forbid-dom-propsDisallow certain props on DOM Nodes
forbid-elementsDisallow certain elements
forbid-foreign-prop-typesDisallow using another component's propTypes
forbid-prop-typesDisallow certain propTypes
function-component-definitionEnforce a specific function type for function components🔧
hook-use-stateEnsure destructuring and symmetric naming of useState hook value and setter variables💡
iframe-missing-sandboxEnforce sandbox attribute on iframe elements
jsx-boolean-valueEnforce boolean attributes notation in JSX🔧
jsx-child-element-spacingEnforce or disallow spaces inside of curly braces in JSX attributes and expressions
jsx-closing-bracket-locationEnforce closing bracket location in JSX🔧
jsx-closing-tag-locationEnforce closing tag location for multiline JSX🔧
jsx-curly-brace-presenceDisallow unnecessary JSX expressions when literals alone are sufficient or enforce JSX expressions on literals in JSX children or attributes🔧
jsx-curly-newlineEnforce consistent linebreaks in curly braces in JSX attributes and expressions🔧
jsx-curly-spacingEnforce or disallow spaces inside of curly braces in JSX attributes and expressions🔧
jsx-equals-spacingEnforce or disallow spaces around equal signs in JSX attributes🔧
jsx-filename-extensionDisallow file extensions that may contain JSX
jsx-first-prop-new-lineEnforce proper position of the first property in JSX🔧
jsx-fragmentsEnforce shorthand or standard form for React fragments🔧
jsx-handler-namesEnforce event handler naming conventions in JSX
jsx-indentEnforce JSX indentation🔧
jsx-indent-propsEnforce props indentation in JSX🔧
jsx-keyDisallow missing key props in iterators/collection literals☑️
jsx-max-depthEnforce JSX maximum depth
jsx-max-props-per-lineEnforce maximum of props on a single line in JSX🔧
jsx-newlineRequire or prevent a new line after jsx elements and expressions.🔧
jsx-no-bindDisallow .bind() or arrow functions in JSX props
jsx-no-comment-textnodesDisallow comments from being inserted as text nodes☑️
jsx-no-constructed-context-valuesDisallows JSX context provider values from taking values that will cause needless rerenders
jsx-no-duplicate-propsDisallow duplicate properties in JSX☑️
jsx-no-leaked-render

编辑推荐精选

音述AI

音述AI

全球首个AI音乐社区

音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。

lynote.ai

lynote.ai

一站式搞定所有学习需求

不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。

AniShort

AniShort

为AI短剧协作而生

专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。

seedancetwo2.0

seedancetwo2.0

能听懂你表达的视频模型

Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。

nano-banana纳米香蕉中文站

nano-banana纳米香蕉中文站

国内直接访问,限时3折

输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成热门AI工具AI图像AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

下拉加载更多