当前位置: 首页 > news >正文

React 代码规范

下面,我们来系统的梳理关于 ESLint + Prettier:React 代码规范与自动化 的基本知识点:


一、代码规范工具概述

1.1 为什么需要代码规范?

  • 一致性:统一团队编码风格
  • 可读性:提高代码可维护性
  • 质量保证:提前发现潜在错误
  • 自动化:减少代码审查负担
  • 协作效率:标准化开发流程

1.2 ESLint vs Prettier

特性ESLintPrettier
主要功能代码质量检查代码格式化
检查类型语法错误、代码风格、最佳实践代码格式、缩进、引号等
可配置性高度可配置有限配置
自动修复支持部分规则自动修复完全自动格式化
扩展性支持插件和自定义规则固定格式化规则

1.3 工具协同工作流程

编写代码
ESLint 检查
是否有错误?
修复问题
Prettier 格式化
提交代码

二、ESLint 深度解析

2.1 安装与配置

# 基本安装
npm install --save-dev eslint# React 项目推荐安装
npm install --save-dev eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-jsx-a11y @typescript-eslint/parser @typescript-eslint/eslint-plugin# Create React App 已经内置 ESLint

2.2 配置文件格式

.eslintrc.js (推荐)

module.exports = {env: {browser: true,es2021: true,node: true,},extends: ['eslint:recommended','plugin:react/recommended','plugin:react-hooks/recommended','plugin:jsx-a11y/recommended',],parser: '@typescript-eslint/parser',parserOptions: {ecmaFeatures: {jsx: true,},ecmaVersion: 12,sourceType: 'module',},plugins: ['react','react-hooks','jsx-a11y','@typescript-eslint',],rules: {// 自定义规则},settings: {react: {version: 'detect',},},
};

2.3 核心配置详解

环境配置 (env)
env: {browser: true,    // 浏览器环境全局变量node: true,       // Node.js 环境全局变量es6: true,        // ES6+ 语法支持jest: true,       // Jest 测试框架
}
扩展配置 (extends)
extends: ['eslint:recommended',                    // ESLint 推荐规则'plugin:react/recommended',             // React 推荐规则'plugin:react-hooks/recommended',       // React Hooks 规则'plugin:@typescript-eslint/recommended', // TypeScript 规则'prettier',                             // 禁用与 Prettier 冲突的规则'prettier/react',                       // 禁用 React 相关冲突规则'prettier/@typescript-eslint',          // 禁用 TypeScript 相关冲突规则
]
规则配置 (rules)
rules: {// 错误级别:'off', 'warn', 'error''react/prop-types': 'off', // 关闭 prop-types 检查(TypeScript 项目中)'react-hooks/exhaustive-deps': 'warn', // 检查 effect 依赖'no-console': 'warn', // 警告 console 语句'no-unused-vars': 'error', // 错误:未使用变量'prefer-const': 'error', // 优先使用 const// 带有选项的规则'complexity': ['error', { max: 10 }], // 圈复杂度限制'max-depth': ['error', 4], // 最大嵌套深度
}

2.4 常用 React 相关规则

rules: {// React 特定规则'react/jsx-uses-react': 'error','react/jsx-uses-vars': 'error','react/jsx-no-undef': 'error','react/jsx-no-duplicate-props': 'error','react/jsx-key': 'error',// Hooks 规则'react-hooks/rules-of-hooks': 'error','react-hooks/exhaustive-deps': 'warn',// 可访问性规则'jsx-a11y/alt-text': 'error','jsx-a11y/anchor-is-valid': 'error',
}

三、Prettier 深度解析

3.1 安装与配置

npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier

3.2 配置文件

.prettierrc (推荐)

{"semi": true,"trailingComma": "es5","singleQuote": true,"printWidth": 80,"tabWidth": 2,"useTabs": false,"bracketSpacing": true,"jsxBracketSameLine": false,"arrowParens": "avoid","endOfLine": "lf"
}

3.3 配置选项详解

选项默认值描述推荐设置
printWidth80行宽限制80-100
tabWidth2缩进空格数2
useTabsfalse使用制表符false
semitrue分号true
singleQuotefalse单引号true
trailingComma“none”尾随逗号“es5”
bracketSpacingtrue对象括号空格true
jsxBracketSameLinefalseJSX 括号同行false
arrowParens“avoid”箭头函数参数括号“avoid”
endOfLine“lf”行尾符“lf”

3.4 忽略文件配置

.prettierignore

# 忽略目录
node_modules/
dist/
build/
coverage/# 忽略文件
package-lock.json
yarn.lock# 忽略特定文件类型
*.min.js
*.bundle.js

四、ESLint + Prettier 集成

4.1 完整集成配置

// .eslintrc.js
module.exports = {extends: ['eslint:recommended','plugin:react/recommended','plugin:react-hooks/recommended','plugin:@typescript-eslint/recommended','prettier', // 必须放在最后'prettier/react','prettier/@typescript-eslint',],plugins: ['prettier'],rules: {'prettier/prettier': 'error', // 将 Prettier 规则作为 ESLint 错误},
};

4.2 解决规则冲突

// 在 .eslintrc.js 中禁用冲突规则
rules: {// 禁用与 Prettier 冲突的 ESLint 规则'indent': 'off','quotes': 'off','semi': 'off','comma-dangle': 'off','max-len': 'off',// 启用 Prettier 规则'prettier/prettier': 'error',
}

五、编辑器集成与自动化

5.1 VS Code 配置

// .vscode/settings.json
{"editor.formatOnSave": true,"editor.codeActionsOnSave": {"source.fixAll.eslint": true},"eslint.validate": ["javascript","javascriptreact","typescript","typescriptreact"],"prettier.requireConfig": true,"[javascript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"},"[typescript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"},"[javascriptreact]": {"editor.defaultFormatter": "esbenp.prettier-vscode"},"[typescriptreact]": {"editor.defaultFormatter": "esbenp.prettier-vscode"}
}

5.2 推荐 VS Code 扩展

  • ESLint:ESLint 集成
  • Prettier - Code formatter:Prettier 格式化
  • Error Lens:实时显示错误
  • Bracket Pair Colorizer:括号颜色匹配

5.3 Git Hooks 自动化

# 安装 Husky 和 lint-staged
npm install --save-dev husky lint-staged

package.json 配置

{"husky": {"hooks": {"pre-commit": "lint-staged","pre-push": "npm run test"}},"lint-staged": {"*.{js,jsx,ts,tsx}": ["eslint --fix","prettier --write"],"*.{json,md,html,css,scss}": ["prettier --write"]}
}

六、React 特定配置

6.1 TypeScript + React 配置

// .eslintrc.js
module.exports = {parser: '@typescript-eslint/parser',extends: ['plugin:@typescript-eslint/recommended','plugin:react/recommended','prettier/@typescript-eslint','prettier/react',],rules: {'@typescript-eslint/explicit-function-return-type': 'off','@typescript-eslint/no-explicit-any': 'warn','react/prop-types': 'off', // TypeScript 中不需要 prop-types},
};

6.2 Hooks 最佳实践规则

rules: {'react-hooks/rules-of-hooks': 'error','react-hooks/exhaustive-deps': ['warn',{'additionalHooks': '(useMemoized|useCustomHook)'}],
}

6.3 组件命名规范

rules: {'react/display-name': 'error','react/jsx-pascal-case': 'error','react/jsx-no-bind': ['warn',{'ignoreDOMComponents': true,'ignoreRefs': true,'allowArrowFunctions': true,'allowFunctions': false,'allowBind': false}],
}

七、自定义规则开发

7.1 创建自定义 ESLint 规则

// eslint-plugin-custom-rules.js
module.exports = {rules: {'no-console-in-production': {create: function(context) {return {CallExpression(node) {if (node.callee.object?.name === 'console' && process.env.NODE_ENV === 'production') {context.report({node,message: 'Console statements are not allowed in production'});}}};}}}
};

7.2 使用自定义规则

// .eslintrc.js
module.exports = {plugins: ['custom-rules'],rules: {'custom-rules/no-console-in-production': 'error'}
};

八、团队协作配置

8.1 共享配置方案

方案1:npm 包共享

# 创建配置包
npm init @eslint/config# 发布配置包
npm publish

方案2:Git 子模块

git submodule add https://github.com/your-team/eslint-config.git

8.2 多项目统一配置

// eslint-config-your-team/index.js
module.exports = {extends: [require.resolve('./rules/base'),require.resolve('./rules/react'),require.resolve('./rules/typescript'),require.resolve('./rules/prettier'),],
};

九、性能优化与问题解决

9.1 性能优化配置

// .eslintrc.js
module.exports = {// 忽略大量文件ignorePatterns: ['dist/', 'build/', 'coverage/'],// 缓存配置cache: true,cacheLocation: './node_modules/.cache/eslint/',// 仅检查必要文件overrides: [{files: ['src/**/*.{js,jsx,ts,tsx}'],excludedFiles: ['**/*.test.{js,jsx,ts,tsx}'],}]
};

9.2 常见问题解决

问题1:ESLint 和 Prettier 冲突
// 安装 eslint-config-prettier
npm install --save-dev eslint-config-prettier// 确保在 extends 数组中最后引入
extends: ['other-configs','prettier' // 必须放在最后
]
问题2:TypeScript 解析错误
// 确保 parser 配置正确
parser: '@typescript-eslint/parser',
parserOptions: {project: './tsconfig.json',sourceType: 'module',
}
问题3:Husky 钩子不执行
# 重新安装 Husky
npm uninstall husky
npm install --save-dev husky# 启用 Git hooks
npx husky install

十、完整示例配置

10.1 React + TypeScript 完整配置

.eslintrc.js

module.exports = {env: {browser: true,es2021: true,node: true,},extends: ['eslint:recommended','plugin:react/recommended','plugin:react-hooks/recommended','plugin:@typescript-eslint/recommended','plugin:jsx-a11y/recommended','prettier','prettier/react','prettier/@typescript-eslint',],parser: '@typescript-eslint/parser',parserOptions: {ecmaFeatures: {jsx: true,},ecmaVersion: 12,sourceType: 'module',project: './tsconfig.json',},plugins: ['react','react-hooks','@typescript-eslint','jsx-a11y','prettier',],rules: {'prettier/prettier': 'error','react/prop-types': 'off','react/react-in-jsx-scope': 'off','@typescript-eslint/explicit-module-boundary-types': 'off','@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],},settings: {react: {version: 'detect',},},
};

.prettierrc

{"semi": true,"trailingComma": "es5","singleQuote": true,"printWidth": 80,"tabWidth": 2,"useTabs": false,"bracketSpacing": true,"jsxBracketSameLine": false,"arrowParens": "avoid","endOfLine": "lf"
}

package.json 脚本

{"scripts": {"lint": "eslint src --ext .js,.jsx,.ts,.tsx","lint:fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix","format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"","lint:ci": "eslint src --ext .js,.jsx,.ts,.tsx --max-warnings=0"}
}

十一、总结

关键最佳实践

  1. 统一配置:团队使用相同的规则配置
  2. 自动化:通过 Git Hooks 自动检查和格式化
  3. 渐进采用:逐步引入规则,避免一次性太多限制
  4. 定期审查:定期更新规则以适应新技术

工具选择建议

graph TD
A[项目类型] --> B{选择方案}
B -->|Create React App| C[使用内置 ESLint]
B -->|自定义配置| D[手动配置 ESLint + Prettier]
B -->|TypeScript 项目| E[添加 @typescript-eslint]
C --> F[按需扩展规则]
D --> G[完整自定义配置]
E --> H[类型感知规则]
http://www.dtcms.com/a/351750.html

相关文章:

  • 算法练习-合并两个有序数组
  • 表格比对的实现
  • 如何确定哪些层应添加适配器(Adapter)?(58)
  • 餐中服务:藏在菜香里的 “情感传递术”
  • Java继承与虚方法详解
  • 掌握常用CSS样式:从基础到实战的全面指南
  • 从0开始学习Java+AI知识点总结-26.web实战(Springboot原理)
  • 产品经理成长手册(2)——产品文档能力
  • 14、RocketMQ生产环境如何优化
  • Linux查看服务器内存、磁盘、cpu、网络占用、端口占用情况
  • THM El Bandito
  • 设计模式学习笔记-----抽象责任链模式
  • 常见的设计模式
  • 深度学习篇---1*1卷积核的升维/降维
  • Unity笔记(七)——四元数、延迟函数、协同程序
  • 【Linux】Keepalived + Nginx高可用方案
  • [pilot智驾系统] 驾驶员监控守护进程(dmonitoringd)
  • 从代码学习深度强化学习 - 多智能体强化学习 IPPO PyTorch版
  • pytorch_grad_cam 库学习笔记——基类ActivationsAndGradient
  • vue2 和 vue3 生命周期的区别
  • 【Android】不同系统API版本_如何进行兼容性配置
  • 2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析
  • VMDK 文件
  • 软考-系统架构设计师 计算机系统基础知识详细讲解二
  • springcloud篇5-微服务保护(Sentinel)
  • Spring Boot mybatis-plus 多数据源配置
  • 【CVE-2025-5419】(内附EXP) Google Chrome 越界读写漏洞【内附EXP】
  • Kafka面试精讲 Day 1:Kafka核心概念与分布式架构
  • Elasticsearch中的协调节点
  • 详解kafka基础(一)