news 2026/8/10 19:14:36

【前端】从零开始搭建现代前端框架:React 19、Vite、Tailwind CSS、ShadCN UI-第四章《统一的代码风格与严格的代码质量检查,ESLint 与 Prettier的配置 》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【前端】从零开始搭建现代前端框架:React 19、Vite、Tailwind CSS、ShadCN UI-第四章《统一的代码风格与严格的代码质量检查,ESLint 与 Prettier的配置 》

第4章:统一的代码风格与严格的代码质量检查,为项目安装配置ESLint和Prettier

在现代前端项目中,ESLint 与 Prettier 的工程化整合非常关键,它决定了:

  • 团队代码是否统一

  • 自动化格式化是否生效

  • 是否能在 VSCode + Git Hooks 中自动检查

  • 是否能在持续集成(CI)中保证质量

本章将带你建立一套完全现代化的代码规范体系,基于:

  • ESLint 9(Flat Config)

  • Prettier 3

  • TypeScript

  • React 19

  • Tailwind CSS

  • ShadCN UI

最终项目具备:

✔ 统一代码风格
✔ VSCode 自动格式化
✔ Git 提交自动检查
✔ Tailwind class 排序
✔ import 顺序优化
✔ 生产工程可复用


4.1 为什么需要 ESLint 与 Prettier?

ESLint

用于检查代码中潜在的错误与不规范用法,例如:

  • 未使用的变量

  • React Hook 用法错误

  • 类型错误(TypeScript)

  • import 顺序问题

  • 逻辑潜在危险代码

Prettier

用于格式化代码,使团队代码风格统一,例如:

  • 换行策略

  • 引号单双

  • 尾随逗号

  • 缩进格式化

  • JSX 排版

为什么要一起使用?

ESLint 负责“正确性”,Prettier 负责“风格格式化”。
二者如果配置不当会冲突,需要通过插件让它们协同工作。


4.2 安装 ESLint 依赖

运行:

pnpm add -D eslint @eslint/js eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-refresh eslint-plugin-jsx-a11y @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-import eslint-import-resolver-typescript eslint-plugin-tailwindcss typescript

必要说明:

包名说明
eslint让 ESLint 能解析 TS/TSX
@eslint/jsTypeScript 规则集
typescript-eslint
eslint-plugin-reactReact 专用规则
eslint-plugin-react-hooksHook 规则(非常重要)
eslint-plugin-react-refreshVite react-refresh 热更新规则
eslint-plugin-react
eslint-plugin-importimport 语法检查
eslint-plugin-tailwindcssTailwind 类名排序与错误提示

4.3 安装 Prettier 及其插件

pnpm add -D prettier eslint-plugin-prettier eslint-config-prettier eslint-plugin-tailwindcss

说明:

包名功能
prettier代码格式化工具
eslint-plugin-prettier
eslint-config-prettier关闭 ESLint 中与 Prettier 冲突的规则
prettier-plugin-tailwindcssTailwind class 自动排序(强烈推荐)

4.4 修改eslint.config.js配置文件

在项目根目录找到:

.eslint.config.js

import js from '@eslint/js' import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import tseslint from 'typescript-eslint' import { defineConfig, globalIgnores } from 'eslint/config' export default defineConfig([ globalIgnores(['dist']), { files: ['**/*.{ts,tsx}'], extends: [ js.configs.recommended, tseslint.configs.recommended, reactHooks.configs.flat.recommended, reactRefresh.configs.vite, ], languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, }, ])

改为:

import js from '@eslint/js' import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import tseslint from 'typescript-eslint' import pluginReact from 'eslint-plugin-react' import jsxA11y from 'eslint-plugin-jsx-a11y' import importPlugin from 'eslint-plugin-import' export default [ { ignores: ['dist'] }, js.configs.recommended, ...tseslint.configs.recommended, { files: ['**/*.{ts,tsx}'], plugins: { react: pluginReact, 'react-hooks': reactHooks, 'react-refresh': reactRefresh, 'jsx-a11y': jsxA11y, import: importPlugin }, languageOptions: { ecmaVersion: 2020, sourceType: 'module', globals: globals.browser, parser: tseslint.parser, parserOptions: { project: './tsconfig.app.json', ecmaFeatures: { jsx: true } } }, settings: { react: { version: 'detect' }, 'import/resolver': { typescript: { project: './tsconfig.app.json' } } }, rules: { // React 19 不需要 React in scope 'react/react-in-jsx-scope': 'off', // React Hook 规则 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', // TypeScript '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], // import 规则 'import/order': [ 'warn', { groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], alphabetize: { order: 'asc', caseInsensitive: true } } ] } } ]

4.5 创建.prettierrc

{ "semi": true, "singleQuote": true, "printWidth": 100, "tabWidth": 2, "trailingComma": "all", "jsxSingleQuote": false, "arrowParens": "always" }

4.6 创建.prettierignore

dist node_modules pnpm-lock.yaml .env* *.png *.svg

4.7 配置 VS Code 自动格式化(关键)

.vscode/settings.json中配置:

{ // Editor settings "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.fixAll.eslint": "explicit" }, "editor.defaultFormatter": "esbenp.prettier-vscode", // ESLint settings "eslint.enable": true, "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"], "eslint.run": "onType", "eslint.workingDirectories": [{ "mode": "auto" }] }

4.8package.json 脚本(lint + format)

package.json

{ "scripts": { // Lint 检查 "lint": "eslint \"src/**/*.{ts,tsx}\"", "lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix", // Prettier 格式化 "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,css,md,html,json}\"", "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,css,md,html,json}\"" } }

4.9 Tailwind 与 ESLint 的联动(自动排序 classNames)

以下规则来自eslint-plugin-tailwindcss

"tailwindcss/classnames-order": "warn",

效果:

<div className="p-4 flex bg-red-500 text-center" />

会自动变成:

<div className="flex p-4 bg-red-500 text-center" />

对 ShadCN UI 组件场景尤为重要。


4.10 Git 提交强制检查(可选)

如果你的工程使用 Husky + lint-staged:

安装

pnpm add -D husky lint-staged npx husky init

建立.lintstagedrc

{ "src/**/*.{ts,tsx}": [ "eslint --fix", "prettier --write" ] }

现在 commit 时会自动 lint + 格式化。


4.11 CI 检查(可选,用于 GitHub Actions)

- name: Lint run: pnpm lint - name: Prettier Check run: pnpm format:check

4.12 最终文件结构(新增部分)

. ├── .vscode/ │ └── settings.json ├── src/ ├── .lintstagedrc ├── .prettierrc ├── .prettierignore ├── .eslint.config.js ├── package.json └── ...

4.12 本章总结

本章构建了完整的现代化 ESLint + Prettier 工程体系:

✔ ESLint Flat Config
✔ TypeScript 全量规则
✔ React 19 最佳实践
✔ React Hooks / Refresh
✔ Tailwind class 排序
✔ import 顺序优化
✔ Prettier 集成
✔ VSCode 格式化
✔ Git 提交检查
✔ CI 流程

即日起你的项目将获得:

  • 统一的代码风格

  • 即时错误提示

  • 自动排版(含 Tailwind)

  • import 顺序自动规范化

  • React Hook 误用自动警告

这套体系完全适用于:

  • 企业级后台

  • 大型前端团队协作

  • 现代 SPA 工程

  • 现代 React(包括 Server Components)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 4:11:06

【上海交通大学主办 | 连续6年IEEE出版 | 连续5届快速检索-往届会后3个月EI, Scopus检索 | 设优秀评选】第六届IEEE信息科学与教育国际学术会议(ICISE-IE 2025)

【快检索 | 高录用 | 连续5届快速 EI, Scopus, IEEE Xplore检索】 第六届IEEE信息科学与教育国际学术会议&#xff08;ICISE-IE 2025&#xff09; 2025 6th International Conference on Information Science and Education 大会时间&#xff1a;2025年12月26-28日 大会地点…

作者头像 李华
网站建设 2026/8/10 18:55:39

区块链核心知识点梳理(8)-钱包与账户体系

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录8. 钱包与账户体系8.1 钱包与账户的关系8.2 密钥生成流程8.2.1 完整生成过程8.2.2 代码实现8.3 HD 钱包&#xff08;分层确定性钱包&#xff09;8.3.1 BIP32/BIP39/B…

作者头像 李华
网站建设 2026/8/11 8:43:13

如何快速开展中小学AI教育:完整的AI通识课程指南

如何快速开展中小学AI教育&#xff1a;完整的AI通识课程指南 【免费下载链接】ai-edu-for-kids 面向中小学的人工智能通识课开源课程 项目地址: https://gitcode.com/datawhalechina/ai-edu-for-kids 在数字化浪潮席卷全球的今天&#xff0c;中小学AI教育已成为培养未来…

作者头像 李华
网站建设 2026/8/10 12:49:42

LeetCode 6. Z 字形变换 | 详细题解(附 C++ 代码)

一、题目描述 题目链接&#xff1a;LeetCode 6. Z 字形变换 题目要求 将字符串 s 按指定行数 numRows 排成Z 字形&#xff08;先从上到下&#xff0c;再从右到左斜向上&#xff09;&#xff0c;然后从左到右逐行读取&#xff0c;输出新字符串。 示例演示 输入&#xff1a;…

作者头像 李华
网站建设 2026/8/11 12:41:03

22、Linux 系统基础管理入门指南

Linux 系统基础管理入门指南 1. 系统管理任务概述 系统管理涵盖了维持计算机系统正常运行的各项任务,系统可以是独立的客户端机器、支撑企业运营的网络服务器,或者介于两者之间的其他形式。系统管理员负责处理这些任务,确保系统按需求运行。 系统管理员的职责包括: - 添…

作者头像 李华
网站建设 2026/8/9 16:43:25

2026年大模型应用开发学习路线:四阶段转型指南,抓住未来3年的职业发展机遇!转AI大模型开发学习顺序真的很重要!

简介 文章指出大模型技术正在重塑IT行业&#xff0c;企业招聘要求大模型能力已成为趋势。为帮助程序员成功转型&#xff0c;文章提出了四阶段学习路径&#xff1a;大模型基础、RAG应用开发工程、大模型Agent应用架构、大模型微调与私有化部署。强调学习顺序的重要性&#xff0…

作者头像 李华