news 2026/4/30 20:45:50

【前端】从零开始搭建现代前端框架: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/4/20 20:56:09

【郑州大学主办,IEEE Fellow支持,可靠有保障 | IEEE出版 ,EI稳定检索,该出版社快至会后3个月检索】第二届图像处理、多媒体技术与机器学习国际学术会议(IPMML 2025)

往年已稳定EI检索&#xff01;录用率高&#xff01;支持latex和word双通道投稿 郑州大学主办&#xff0c;IEEE Fellow支持&#xff0c;可靠有保障&#xff01; 第二届图像处理、多媒体技术与机器学习国际学术会议&#xff08;IPMML 2025&#xff09; 2025 2nd Internationa…

作者头像 李华
网站建设 2026/4/30 11:55:42

4张GPU搞定70B大模型训练!DeepSpeed SuperOffload实战全解析

4张GPU搞定70B大模型训练&#xff01;DeepSpeed SuperOffload实战全解析 【免费下载链接】DeepSpeedExamples Example models using DeepSpeed 项目地址: https://gitcode.com/gh_mirrors/de/DeepSpeedExamples 还在为训练70B参数大模型的显存需求而发愁吗&#xff1f;D…

作者头像 李华
网站建设 2026/4/29 2:29:39

大模型知道自己在瞎说,却停不下来背后的原理是什么?

前言&#xff1a;作为长期和大语言模型打交道的技术从业者&#xff0c;你一定经历过这样的场景&#xff1a;让模型解答一个复杂问题&#xff0c;它开头逻辑清晰、步骤明确&#xff0c;但越往后越像在自言自语——反复重述观点、兜圈子解释、堆砌看似合理却毫无信息增量的句子。…

作者头像 李华
网站建设 2026/4/23 11:34:52

RAG中的语义理解与语义检索:别再混为一谈

前言近年来&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;架构已成为大模型落地应用的主流范式之一。它通过将外部知识库引入生成过程&#xff0c;有效缓解了模型幻觉、知识滞后等问题。然而&#xff0c;在实际构建和优化RAG系统时&#xff0c;许多开…

作者头像 李华
网站建设 2026/5/1 6:17:55

21、深入理解与配置 DNS:从基础到实践

深入理解与配置 DNS:从基础到实践 1. 理解域名系统(DNS) 1.1 什么是 DNS 在 TCP/IP 网络中,每个网络接口由 IP 地址标识,但 IP 地址难以记忆,因此为其分配了易记的名称。DNS 就是将完全限定域名(如 www.debian.org)转换为对应 IP 地址(如 194.109.137.218)的互联网…

作者头像 李华
网站建设 2026/4/14 20:22:09

25、Linux系统管理:GUI工具与用户组管理全解析

Linux系统管理:GUI工具与用户组管理全解析 1. Linux系统的定时任务与GUI管理工具 在Linux系统中,存在着不同的定时任务目录,例如 /etc/cron.weekly 用于每周执行的任务, /etc/cron.monthly 则是每月执行一次的任务。 每个Linux发行版都配备了用于执行系统管理任务的…

作者头像 李华