Skip to Content

27f - 前端 Steering 规则与反模式

本文是《AI Agent 实战手册》第 27 章第 6 节。 上一节:27e-响应式布局与无障碍 | 下一节:28a-AI辅助后端开发概览

概述

Steering 规则是 AI 编码助手的”行为宪法”——它们在每次交互前注入持久化上下文,确保 AI 生成的代码符合项目规范、技术栈约束和团队风格。在前端领域,AI 生成代码的典型问题集中在 CSS 冲突、状态管理混乱、性能陷阱、无障碍违规、包体积膨胀、过度抽象、样式不一致和响应式断裂等八大反模式上。2025-2026 年的研究表明,约 40% 的 AI 生成代码存在潜在质量问题,而精心设计的 Steering 规则可以将这些问题减少 60-80%。本节提供完整的前端 Steering 规则模板(覆盖 CLAUDE.md、Kiro Steering、Cursor Rules 三大平台)、八大反模式的识别与修复指南,以及用于检测和修复每种反模式的 prompt 模板。


1. 前端 Steering 规则概述

1.1 什么是 Steering 规则

Steering 规则是写在项目中的 Markdown 文件,AI 编码助手在每次交互时自动读取这些文件,从而获得关于项目技术栈、编码规范、禁止行为和最佳实践的持久化知识。不同工具的 Steering 机制:

工具规则文件位置加载方式作用域
Claude CodeCLAUDE.md(项目根目录)自动加载整个项目
Kiro.kiro/steering/*.md按 inclusion 模式加载(always/auto/manual)可按目录/文件类型分区
Cursor.cursor/rules/*.mdc.cursorrules自动/手动加载可按 glob 模式匹配
GitHub Copilot.github/copilot-instructions.md自动加载整个仓库
Windsurf.windsurfrules自动加载整个项目

1.2 为什么前端需要专用 Steering 规则

前端开发有其独特的复杂性,AI 在以下方面特别容易犯错:

  1. 样式系统多样性:Tailwind CSS、CSS Modules、styled-components、原生 CSS 等方案混用导致冲突
  2. 框架特定模式:React hooks 规则、Vue Composition API 约束、Svelte 响应式语法各不相同
  3. 浏览器兼容性:AI 可能生成使用最新 API 但缺乏降级方案的代码
  4. 包体积敏感:前端对 bundle size 极度敏感,AI 倾向于引入不必要的依赖
  5. 无障碍合规:WCAG 2.2 和 EAA 法规要求,AI 经常遗漏语义化 HTML 和 ARIA 属性
  6. 视觉一致性:AI 生成的 UI 容易偏离设计系统的 token 和规范

1.3 工具推荐

工具用途价格适用场景
Claude CodeAgentic 编码,CLAUDE.md 规则按 token 计费(Max $100/月起)复杂前端项目、全栈开发
KiroSpec-Driven 开发,分层 Steering免费(预览期)规范化团队开发流程
CursorAI IDE,.cursorrules 规则免费 / Pro $20/月日常前端开发
ESLint + eslint-plugin-react静态代码分析免费(开源)自动检测 React 反模式
StylelintCSS/SCSS 静态分析免费(开源)CSS 规范检查
Lighthouse CI性能和无障碍审计免费(开源)CI/CD 集成质量门
Bundlephobia包体积分析免费依赖引入前的体积评估
axe-core无障碍自动化测试免费(开源)/ axe DevTools Pro $840/年无障碍合规检测
Knip未使用代码/依赖检测免费(开源)死代码清理
tailwind-mergeTailwind 类名冲突解决免费(开源)Tailwind 组件库开发

2. 完整 Steering 规则模板

2.1 CLAUDE.md 前端规则模板

以下是一个适用于 React + TypeScript + Tailwind CSS 项目的完整 CLAUDE.md 前端规则模板:

# CLAUDE.md — 前端项目规则 ## 项目概述 - 框架:React 19 + TypeScript 5.x - 样式:Tailwind CSS v4 + CSS Modules(仅用于复杂动画) - 状态管理:Zustand(全局)+ React Query/TanStack Query(服务端状态) - 路由:React Router v7 / TanStack Router - 构建工具:Vite 6 - 包管理器:pnpm - 测试:Vitest + Testing Library + Playwright ## 代码风格强制规则 ### TypeScript - 严格模式:所有文件必须通过 strict TypeScript 检查 - 禁止 any:不允许使用 `any` 类型,使用 `unknown` + 类型守卫 - 接口优先:组件 props 使用 `interface`,工具类型使用 `type` - 命名规范:组件 PascalCase,hooks 以 use 开头,工具函数 camelCase ### React - 仅使用函数组件,禁止 class 组件 - hooks 必须遵循 Rules of Hooks(不在条件/循环中调用) - 禁止在组件内定义组件(会导致每次渲染重新挂载) - 使用 React.memo() 仅在性能分析证明需要时 - 事件处理函数命名:handle{Event},如 handleClick、handleSubmit - 自定义 hooks 必须放在 src/hooks/ 目录 ### 样式 - 优先使用 Tailwind 工具类,避免自定义 CSS - 组件变体使用 cva (class-variance-authority) 或 tailwind-variants - 禁止内联 style 对象(除非是动态计算值) - 禁止 !important - 响应式断点:sm(640px) md(768px) lg(1024px) xl(1280px) 2xl(1536px) - 颜色必须使用设计 token:bg-primary, text-secondary 等 ### 无障碍 - 所有交互元素必须可键盘访问 - 图片必须有 alt 属性(装饰性图片使用 alt="") - 表单控件必须关联 label - 使用语义化 HTML:nav, main, article, section, aside - 颜色对比度至少 4.5:1(AA 级) - 禁止仅依赖颜色传达信息 ### 性能 - 禁止在渲染路径中使用 new Date()、Math.random() - 列表渲染必须使用稳定的 key(禁止 index 作为 key,除非列表静态不变) - 图片使用 next/image 或带 loading="lazy" 的 img - 动态导入大型组件:React.lazy() + Suspense - 禁止在 useEffect 中直接 fetch(使用 React Query) ### 依赖管理 - 新增依赖前必须检查 bundlephobia 体积 - 禁止引入 moment.js(使用 date-fns 或 dayjs) - 禁止引入 lodash 全量包(使用 lodash-es 按需导入或原生方法) - UI 组件优先使用 shadcn/ui(复制到项目中,不作为依赖) ### 文件组织 - 组件文件:src/components/{ComponentName}/{ComponentName}.tsx - 页面文件:src/pages/ 或 src/app/(按路由框架) - 工具函数:src/lib/ 或 src/utils/ - 类型定义:src/types/ - 常量:src/constants/ - 每个组件目录可包含:组件文件、测试文件、样式文件(如需 CSS Module) ## 禁止行为 - 禁止使用 var,仅使用 const/let - 禁止使用 enum(使用 as const 对象) - 禁止 console.log 提交到生产代码 - 禁止直接操作 DOM(document.getElementById 等) - 禁止在组件外部定义可变状态 - 禁止使用 dangerouslySetInnerHTML(除非有 XSS 防护)

2.2 Kiro Steering 前端规则模板

Kiro 支持分层 Steering 文件,可以按关注点拆分规则。以下是推荐的文件结构:

.kiro/ └── steering/ ├── frontend-general.md # 通用前端规则(inclusion: always) ├── react-patterns.md # React 特定模式(inclusion: auto) ├── styling-rules.md # 样式规范(inclusion: auto) └── accessibility.md # 无障碍规则(inclusion: auto)

.kiro/steering/frontend-general.md

--- inclusion: always description: 前端项目通用规则,适用于所有前端代码交互 globs: "src/**/*.{ts,tsx,css,scss}" --- # 前端通用规则 ## 技术栈 - React 19 + TypeScript strict mode - Tailwind CSS v4(禁止混用其他 CSS-in-JS 方案) - Vite 6 构建 - pnpm 包管理 ## 核心约束 1. 所有组件必须是函数组件 + TypeScript 2. Props 接口必须显式定义并导出 3. 禁止使用 any 类型 4. 新增 npm 依赖前必须说明理由和体积影响 5. 每个新组件必须包含基本的无障碍支持 ## 文件命名 - 组件:PascalCase.tsx - hooks:useCamelCase.ts - 工具函数:camelCase.ts - 类型:camelCase.types.ts - 测试:*.test.ts(x)

.kiro/steering/react-patterns.md

--- inclusion: auto description: React 组件和 hooks 的编写模式规则 globs: "src/**/*.tsx" --- # React 模式规则 ## 组件模式 - 使用具名导出(export function),避免默认导出 - Props 解构在参数位置,不在函数体内 - 条件渲染使用早返回模式,避免深层嵌套三元表达式 - 复杂条件渲染提取为独立组件 ## Hooks 规则 - 自定义 hooks 必须以 use 开头 - 禁止在 useEffect 中执行数据获取(使用 TanStack Query) - useEffect 的依赖数组必须完整,不允许 eslint-disable - useMemo/useCallback 仅在性能分析证明需要时使用 - 状态更新使用函数式更新:setState(prev => ...) ## 状态管理分层 - 组件本地状态:useState / useReducer - 跨组件共享:Zustand store(按功能域拆分) - 服务端状态:TanStack Query(缓存、重试、乐观更新) - URL 状态:路由参数 + searchParams - 禁止:将所有状态放入全局 store

.kiro/steering/styling-rules.md

--- inclusion: auto description: 样式编写规范 globs: "src/**/*.{tsx,css,scss}" --- # 样式规则 ## Tailwind CSS - 使用项目定义的设计 token(颜色、间距、字体) - 组件变体使用 cva 或 tailwind-variants 管理 - 可复用组件使用 tailwind-merge 处理类名冲突 - 响应式优先移动端:先写移动端样式,再用 sm:/md:/lg: 扩展 - 暗色模式使用 dark: 前缀,不要手动切换类名 ## 禁止 - 禁止 !important - 禁止内联 style(除动态计算值外) - 禁止全局 CSS 选择器(除 globals.css 中的 reset) - 禁止混用 Tailwind 和 styled-components - 禁止硬编码颜色值(必须使用 token) - 禁止使用 @apply 创建大量自定义工具类(违背 Tailwind 理念)

.kiro/steering/accessibility.md

--- inclusion: auto description: 无障碍合规规则 globs: "src/**/*.tsx" --- # 无障碍规则(WCAG 2.2 AA) ## 必须遵守 1. 所有交互元素必须可通过键盘操作(Tab/Enter/Space/Escape) 2. 焦点必须可见且有明确的焦点指示器样式 3. 图片:信息性图片必须有描述性 alt,装饰性图片使用 alt="" 4. 表单:每个输入控件必须关联 <label>,错误信息使用 aria-describedby 5. 按钮:使用 <button> 而非 <div onClick>,图标按钮必须有 aria-label 6. 链接:使用 <a> 而非 <span onClick>,链接文本必须描述目标 7. 标题层级:h1-h6 必须按顺序使用,不跳级 8. 颜色对比度:正文至少 4.5:1,大文本至少 3:1 9. 动画:提供 prefers-reduced-motion 媒体查询支持 10. 模态框:必须实现焦点陷阱和 Escape 关闭 ## 语义化 HTML - 页面结构:<header>, <nav>, <main>, <aside>, <footer> - 内容分区:<article>, <section>(必须有标题) - 列表:使用 <ul>/<ol>/<dl>,不用 div 模拟 - 表格:使用 <table> + <thead>/<tbody>/<th scope>

2.3 Cursor Rules 前端规则模板

Cursor 使用 .cursor/rules/ 目录或 .cursorrules 文件。推荐使用目录结构以支持 glob 匹配:

.cursor/rules/frontend.mdc

--- description: 前端开发通用规则 globs: ["src/**/*.tsx", "src/**/*.ts", "src/**/*.css"] --- # 前端开发规则 ## 技术栈约束 - 框架:React 19 + TypeScript(strict mode) - 样式:Tailwind CSS v4 - 状态:Zustand(客户端)+ TanStack Query(服务端) - 构建:Vite 6 - 测试:Vitest + Testing Library ## 代码生成规则 1. 生成 TypeScript 代码时必须包含完整类型定义 2. 组件 props 必须定义 interface 并导出 3. 不要生成 any 类型,使用 unknown + 类型守卫 4. 不要生成 class 组件 5. 不要在组件内部定义子组件 6. 不要使用 enum,使用 as const 对象 7. 事件处理函数使用 handle 前缀 8. 异步操作使用 async/await,不使用 .then() 链 ## 样式规则 1. 仅使用 Tailwind 工具类 2. 使用项目设计 token,不硬编码颜色/间距 3. 响应式使用 mobile-first:默认移动端,sm:/md:/lg: 扩展 4. 组件变体使用 cva 管理 ## 无障碍 1. 交互元素使用语义化 HTML(button, a, input) 2. 图片必须有 alt 属性 3. 表单控件必须关联 label 4. 自定义组件必须支持键盘操作 ## 性能 1. 大型组件使用 React.lazy() 动态导入 2. 列表使用稳定 key(不用 index) 3. 图片使用 lazy loading 4. 避免在渲染路径中创建新对象/数组

2.4 三大平台规则对比

特性CLAUDE.mdKiro SteeringCursor Rules
文件格式MarkdownMarkdown + YAML frontmatterMDC (Markdown Components)
分文件支持支持(子目录 CLAUDE.md)原生支持(多文件)原生支持(多文件)
Glob 匹配不支持(按目录层级)支持支持
加载模式自动(项目根 + 子目录)always / auto / manual自动 / 手动
最佳实践单文件,按项目组织按关注点拆分多文件按文件类型 glob 匹配
上下文消耗中等(全量加载)低(按需加载)低(按 glob 匹配加载)
嵌套/继承子目录覆盖父目录无继承,独立文件无继承,独立文件

2.5 操作步骤:为现有项目添加前端 Steering 规则

步骤 1:审计现有项目

# 检查项目技术栈 cat package.json | jq '.dependencies, .devDependencies' # 检查现有 lint 配置 ls -la .eslintrc* eslint.config.* .prettierrc* stylelint.config.* # 检查现有 AI 规则文件 ls -la CLAUDE.md .cursorrules .cursor/rules/ .kiro/steering/

步骤 2:选择规则平台

根据团队使用的 AI 工具选择对应的规则文件格式。如果团队混用多种工具,建议维护一份”规则源文件”,然后用脚本同步到各平台格式。

步骤 3:从模板开始定制

复制上述模板,根据项目实际情况修改:

  • 替换技术栈信息(框架、样式方案、状态管理库)
  • 添加项目特定的命名规范和目录结构
  • 添加业务领域特定的约束(如金融项目的数字格式化规则)

步骤 4:渐进式完善

不要试图一次写完所有规则。推荐流程:

  1. 先写核心技术栈约束(20 行左右)
  2. 使用 AI 开发一周,记录 AI 犯的错误
  3. 针对每个重复出现的错误,添加对应的规则
  4. 每两周审查一次规则,删除过时或冗余的条目

提示词模板:分析项目并生成 Steering 规则

请分析我的前端项目并生成适合的 Steering 规则。 项目信息: - package.json 中的依赖:[粘贴依赖列表] - 目录结构:[粘贴 tree 输出] - 现有 ESLint 配置:[粘贴配置] - 团队规模:[人数] - 目标 AI 工具:[Claude Code / Kiro / Cursor] 请生成: 1. 技术栈约束规则 2. 代码风格规则(基于现有 ESLint 配置推断) 3. 文件组织规则(基于现有目录结构推断) 4. 性能和无障碍基线规则 5. 禁止行为清单 输出格式:[CLAUDE.md / Kiro Steering / Cursor Rules]

3. 八大前端反模式详解

AI 生成前端代码时最常见的八大反模式,每个反模式包含:问题描述、AI 犯错原因、识别方法、Steering 规则防护、修复 prompt 模板。

3.1 反模式一:CSS 冲突(Specificity Wars)

问题描述

AI 在同一项目中混用多种样式方案(Tailwind + 内联 style + 全局 CSS + CSS Modules),导致样式优先级混乱、覆盖不可预测、调试困难。典型表现:

  • Tailwind 类被全局 CSS 覆盖
  • 组件库样式与项目样式冲突
  • !important 泛滥
  • 同一元素上 Tailwind 类名互相矛盾(如同时有 p-4p-8

AI 犯错原因

AI 的训练数据包含各种样式方案的代码,它倾向于”哪种方案能解决当前问题就用哪种”,而不考虑项目的统一性。当 prompt 中没有明确指定样式方案时,AI 可能在同一个组件中混用 Tailwind 和内联样式。

识别方法

# 检测 !important 使用 grep -r "!important" src/ --include="*.css" --include="*.scss" --include="*.tsx" # 检测内联 style 使用 grep -rn "style={{" src/ --include="*.tsx" --include="*.jsx" # 检测全局 CSS 选择器(非 module) find src/ -name "*.css" ! -name "*.module.css" -exec grep -l "[^@]\..*{" {} \; # 使用 Stylelint 检测 npx stylelint "src/**/*.css" --config .stylelintrc.json

Steering 规则防护

## 样式规则(CSS 冲突防护) - 本项目仅使用 Tailwind CSS v4 作为样式方案 - 禁止使用内联 style 对象(唯一例外:动态计算的 CSS 变量值) - 禁止使用 !important - 禁止创建全局 CSS 选择器(globals.css 中的 CSS reset 除外) - 禁止在项目中引入 styled-components、emotion 或其他 CSS-in-JS 库 - 组件变体使用 cva (class-variance-authority) 管理 - 可复用组件的 className prop 必须通过 tailwind-merge 合并 - Tailwind 类名顺序:布局 → 尺寸 → 间距 → 排版 → 颜色 → 边框 → 效果

修复 Prompt 模板

请审查以下组件的样式代码,检测并修复 CSS 冲突问题: [粘贴组件代码] 检查项: 1. 是否混用了多种样式方案?统一为 Tailwind CSS 2. 是否有 !important?移除并通过正确的类名顺序解决 3. 是否有内联 style?转换为 Tailwind 工具类 4. 是否有 Tailwind 类名冲突(如同时有 p-4 和 p-8)?使用 tailwind-merge 5. 是否有全局 CSS 选择器影响组件?改为 CSS Module 或 Tailwind 请输出修复后的代码,并解释每处修改的原因。

3.2 反模式二:状态混乱(State Chaos)

问题描述

AI 生成的代码经常出现状态管理混乱:所有状态都放在全局 store、prop drilling 层层传递、同一数据在多处维护导致不同步、服务端状态和客户端状态混为一谈。典型表现:

  • 一个 Zustand store 包含 50+ 个字段
  • 组件树中 props 传递超过 3 层
  • 同一数据在 useState 和全局 store 中各存一份
  • 用 useEffect + useState 手动管理 API 数据(而非使用 TanStack Query)
  • Context 嵌套超过 5 层导致”Provider Hell”

AI 犯错原因

AI 倾向于用最直接的方式解决问题——需要跨组件共享数据?放全局 store。需要 API 数据?useEffect + fetch。这些方案在小规模下可行,但随着项目增长会迅速失控。AI 缺乏对项目整体状态架构的规划能力。

识别方法

# 检测 store 文件大小(过大说明状态集中) wc -l src/store/*.ts src/stores/*.ts # 检测 useEffect + fetch 模式 grep -rn "useEffect.*fetch\|useEffect.*axios\|useEffect.*api" src/ --include="*.tsx" # 检测 prop drilling(props 中包含大量透传属性) grep -rn "\.\.\.props\|{.*,.*,.*,.*,.*}" src/ --include="*.tsx" | head -20 # 检测 Context Provider 嵌套 grep -rn "Provider>" src/ --include="*.tsx" | wc -l

Steering 规则防护

## 状态管理分层规则 - 组件本地 UI 状态(开关、输入值、展开/折叠):useState - 复杂本地状态逻辑(表单、多步骤流程):useReducer - 跨组件共享的客户端状态:Zustand(按功能域拆分 store) - 服务端数据(API 响应):TanStack Query(禁止 useEffect + fetch) - URL 状态(筛选、分页、排序):路由 searchParams - 每个 Zustand store 不超过 10 个字段,超过则拆分 - Props 传递不超过 2 层,超过则提升状态或使用 Zustand - 禁止在多处维护同一数据的副本

修复 Prompt 模板

请审查以下代码的状态管理架构,识别并修复状态混乱问题: [粘贴相关组件和 store 代码] 项目状态管理规范: - 本地 UI 状态 → useState/useReducer - 服务端数据 → TanStack Query - 跨组件客户端状态 → Zustand(按功能域拆分) - URL 状态 → searchParams 检查项: 1. 是否有 useEffect + fetch 模式?迁移到 TanStack Query 2. 是否有过大的全局 store?按功能域拆分 3. 是否有 prop drilling(超过 2 层)?提升状态或使用 store 4. 是否有同一数据的多份副本?确定单一数据源 5. 是否有不必要的全局状态(应该是本地状态)?降级为 useState 请输出重构方案和修改后的代码。

3.3 反模式三:性能陷阱(Performance Pitfalls)

问题描述

AI 生成的代码经常包含隐蔽的性能问题:不必要的重渲染、渲染路径中创建新对象/函数、缺少代码分割、未优化的图片和字体加载、过度使用 useEffect。典型表现:

  • 每次父组件渲染,所有子组件都重新渲染
  • 在 JSX 中使用 style={{ margin: 10 }}(每次渲染创建新对象)
  • 在 JSX 中使用 onClick={() => handleClick(id)}(每次渲染创建新函数)
  • 所有页面打包在一个 chunk 中,首屏加载 2MB+ JS
  • 未压缩的大图片直接引用
  • useEffect 中缺少清理函数导致内存泄漏

AI 犯错原因

AI 优先保证代码”能运行”,而非”运行得快”。内联对象和箭头函数是最简洁的写法,AI 自然倾向于使用。代码分割和图片优化需要对项目整体架构的理解,AI 在单次交互中难以顾及。

识别方法

# 检测内联对象(性能问题) grep -rn "style={{" src/ --include="*.tsx" # 检测大型 bundle npx vite-bundle-visualizer # 或 npx source-map-explorer dist/assets/*.js # 检测缺少 lazy loading 的路由 grep -rn "import.*from.*pages\|import.*from.*views" src/ --include="*.tsx" | grep -v "lazy\|React.lazy" # 使用 React DevTools Profiler 检测不必要的重渲染 # 或在代码中临时添加: # useEffect(() => { console.log('Component rendered:', componentName) }) # Lighthouse 性能审计 npx lighthouse http://localhost:5173 --only-categories=performance --output=json

Steering 规则防护

## 性能规则 - 路由级组件必须使用 React.lazy() + Suspense 动态导入 - 禁止在 JSX 中创建内联对象(style={{}}),提取为常量或使用 Tailwind - 列表渲染使用稳定 key(数据 ID),禁止使用 index 作为 key(除非列表静态不变) - 图片必须指定 width/height 属性防止布局偏移(CLS) - 图片使用 loading="lazy"(首屏图片除外) - 大于 100KB 的第三方库必须动态导入 - useEffect 中的订阅/定时器必须在清理函数中取消 - 禁止在渲染路径中调用 new Date()、Math.random()、JSON.parse() - React.memo / useMemo / useCallback 仅在 Profiler 证明需要时使用 - 字体使用 font-display: swap,避免 FOIT

修复 Prompt 模板

请对以下 React 组件进行性能审查和优化: [粘贴组件代码] 检查项: 1. 是否有不必要的重渲染?(内联对象、内联函数、缺少 memo) 2. 是否缺少代码分割?(大型组件/页面应 lazy 加载) 3. 是否有 useEffect 内存泄漏?(缺少清理函数) 4. 图片是否优化?(lazy loading、尺寸指定、格式优化) 5. 列表 key 是否稳定? 6. 是否有渲染路径中的昂贵计算? 请输出优化后的代码,并用注释标注每处优化的原因和预期收益。 不要过度优化——仅修复明确的性能问题,不要给每个组件都加 React.memo。

3.4 反模式四:无障碍违规(Accessibility Violations)

问题描述

AI 生成的 UI 代码经常缺乏无障碍支持:使用 div 模拟按钮和链接、缺少 alt 属性、表单没有 label、颜色对比度不足、键盘无法操作、缺少 ARIA 属性。随着 2025 年欧洲无障碍法案(EAA)生效和美国 ADA Title II 数字无障碍要求,这些问题已从”体验优化”升级为”法律合规”。

AI 犯错原因

AI 训练数据中大量代码本身就缺乏无障碍支持。AI 倾向于用 <div onClick> 而非 <button> 因为 div 不需要处理默认样式。AI 生成的颜色方案通常追求视觉美观而非对比度合规。

识别方法

# 使用 axe-core 自动检测 npx @axe-core/cli http://localhost:5173 # 检测 div 模拟交互元素 grep -rn "div.*onClick\|span.*onClick" src/ --include="*.tsx" # 检测缺少 alt 的图片 grep -rn "<img" src/ --include="*.tsx" | grep -v "alt=" # 检测缺少 label 的表单 grep -rn "<input\|<select\|<textarea" src/ --include="*.tsx" | grep -v "aria-label\|aria-labelledby\|id=.*label" # ESLint 无障碍检查 npx eslint src/ --rule '{"jsx-a11y/click-events-have-key-events": "error", "jsx-a11y/no-static-element-interactions": "error"}' # Lighthouse 无障碍审计 npx lighthouse http://localhost:5173 --only-categories=accessibility --output=json

Steering 规则防护

## 无障碍强制规则(WCAG 2.2 AA) - 可点击元素必须使用 <button> 或 <a>,禁止 <div onClick> 或 <span onClick> - 所有 <img> 必须有 alt 属性:信息性图片写描述,装饰性图片用 alt="" - 所有表单控件必须关联 <label>(htmlFor)或使用 aria-label - 自定义下拉菜单/模态框必须实现完整键盘支持(Tab/Escape/Arrow keys) - 模态框必须实现焦点陷阱(focus trap) - 颜色对比度:正文文本至少 4.5:1,大文本至少 3:1 - 禁止仅用颜色传达信息(必须配合图标/文字/形状) - 动画必须尊重 prefers-reduced-motion 媒体查询 - 页面标题(<title>)必须描述当前页面内容 - 标题层级(h1-h6)必须按顺序使用,不跳级 - 使用语义化 HTML 标签:<nav>, <main>, <article>, <section>, <aside>, <footer>

修复 Prompt 模板

请对以下组件进行 WCAG 2.2 AA 级无障碍审查和修复: [粘贴组件代码] 检查项: 1. 交互元素是否使用语义化 HTML?(button/a 而非 div/span) 2. 图片是否有适当的 alt 属性? 3. 表单控件是否关联 label? 4. 是否支持键盘操作?(Tab 导航、Enter/Space 激活、Escape 关闭) 5. 颜色对比度是否达标?(4.5:1 正文,3:1 大文本) 6. 是否有 ARIA 属性缺失?(aria-label, aria-expanded, aria-hidden 等) 7. 标题层级是否正确? 8. 动画是否尊重 prefers-reduced-motion? 请输出修复后的代码,标注每处修改对应的 WCAG 准则编号。

3.5 反模式五:包体积膨胀(Bundle Bloat)

问题描述

AI 倾向于引入功能强大但体积庞大的第三方库来解决简单问题,导致 bundle size 急剧膨胀。典型表现:

  • 引入 moment.js(300KB+)只为格式化一个日期
  • 引入 lodash 全量包(70KB+)只为用一个 debounce
  • 引入完整的图表库只为画一个简单的进度条
  • 引入 axios(13KB)而非使用原生 fetch
  • 每个组件都引入自己的图标库副本
  • 未使用 tree-shaking 友好的导入方式

AI 犯错原因

AI 训练数据中这些流行库出现频率极高,它自然倾向于推荐最”知名”的解决方案。AI 不会主动考虑 bundle size 影响,因为它无法看到最终的打包结果。

识别方法

# 分析 bundle 组成 npx vite-bundle-visualizer # 检查依赖体积 npx bundlephobia-cli moment lodash axios # 检测未使用的依赖 npx knip # 检测 lodash 全量导入 grep -rn "from 'lodash'" src/ --include="*.ts" --include="*.tsx" # 正确方式应该是 from 'lodash-es/debounce' 或 from 'lodash/debounce' # 检测 moment.js 使用 grep -rn "from 'moment'" src/ --include="*.ts" --include="*.tsx" # 检查打包后的文件大小 ls -lh dist/assets/*.js | sort -k5 -h

Steering 规则防护

## 依赖管理规则(包体积控制) - 新增 npm 依赖前必须说明:1) 为什么需要 2) 体积多大 3) 是否有更轻量替代 - 禁止引入的库: - moment.js → 使用 date-fns 或 dayjs - lodash(全量)→ 使用 lodash-es 按需导入或原生 JS 方法 - axios → 使用原生 fetch + 轻量封装 - jQuery → 禁止 - 图标使用 lucide-react 或 @heroicons/react(tree-shakable) - UI 组件优先使用 shadcn/ui(复制源码,不作为 npm 依赖) - 图表库:轻量场景用 CSS/SVG,复杂场景用 recharts(tree-shakable) - 单个第三方库 gzip 后不超过 50KB,超过需要动态导入 - 总 bundle size 目标:首屏 JS < 200KB (gzip)

修复 Prompt 模板

请审查以下项目的依赖列表,识别包体积膨胀问题并提供优化方案: package.json dependencies: [粘贴依赖列表] 当前 bundle 分析结果: [粘贴 bundle analyzer 输出或文件大小列表] 请检查: 1. 是否有可以用更轻量替代品替换的大型库? 2. 是否有未使用 tree-shaking 友好导入方式的库? 3. 是否有应该动态导入(lazy load)的大型库? 4. 是否有完全未使用的依赖? 5. 是否有可以用原生 API 替代的库? 对每个问题,请提供: - 当前库名和体积 - 推荐替代方案和体积 - 具体的代码修改示例

3.6 反模式六:过度抽象(Over-Abstraction)

问题描述

AI 在生成代码时经常过度抽象:为只用一次的逻辑创建自定义 hook、为简单组件创建复杂的工厂模式、过早引入设计模式、创建过多的中间层。典型表现:

  • 一个只在一处使用的 useToggle hook(直接用 useState 即可)
  • 为两个相似但不同的组件创建一个”通用”组件,用大量 props 控制行为
  • 创建 withAuthwithLoadingwithError 等 HOC 层层嵌套
  • 为简单的 fetch 调用创建 Repository → Service → Controller 三层架构
  • 组件 props 超过 15 个,因为试图让一个组件覆盖所有场景

AI 犯错原因

AI 训练数据中包含大量”最佳实践”文章,这些文章倾向于展示抽象模式。AI 会过度应用 DRY(Don’t Repeat Yourself)原则,即使重复的代码只有两处且逻辑略有不同。AI 缺乏”YAGNI”(You Aren’t Gonna Need It)的判断力。

识别方法

# 检测只使用一次的自定义 hooks for hook in $(grep -rn "export.*function use" src/hooks/ --include="*.ts" -l); do hookName=$(grep -o "function use[A-Za-z]*" "$hook" | head -1 | awk '{print $2}') count=$(grep -rn "$hookName" src/ --include="*.tsx" --include="*.ts" | grep -v "export" | wc -l) echo "$hookName: used $count times" done # 检测 props 过多的组件 grep -rn "interface.*Props" src/ --include="*.tsx" -A 20 | grep -c ";" # 超过 10 个属性的 Props 接口需要审查 # 检测 HOC 嵌套 grep -rn "export default.*with.*with" src/ --include="*.tsx" # 检测过深的目录嵌套(可能是过度分层) find src/ -type f -name "*.tsx" | awk -F/ '{print NF-1}' | sort -rn | head -10

Steering 规则防护

## 抽象规则(防止过度工程) - 自定义 hook 仅在逻辑被 3 处以上复用时才创建 - 组件 props 不超过 8 个,超过则拆分为多个组件 - 禁止使用 HOC(Higher-Order Components),使用 hooks 或组合模式 - 禁止创建"万能组件"(一个组件通过 props 切换完全不同的行为) - 优先使用组合(Composition)而非继承或配置 - 目录嵌套不超过 4 层 - 遵循 YAGNI:不为"将来可能需要"的场景预先抽象 - 两处重复代码可以接受,三处以上再考虑抽象 - 简单逻辑直接写在组件中,不需要提取为独立函数

修复 Prompt 模板

请审查以下代码的抽象层次,识别过度抽象问题并简化: [粘贴代码] 检查项: 1. 是否有只使用一次的自定义 hook?→ 内联到组件中 2. 是否有 props 超过 8 个的"万能组件"?→ 拆分为多个专用组件 3. 是否有不必要的中间层(Repository/Service/Controller)?→ 简化层级 4. 是否有过早的抽象(为未来需求预留的接口)?→ 删除,需要时再加 5. 是否有 HOC 嵌套?→ 转换为 hooks 原则: - 代码应该"刚好够用",不多不少 - 可读性优先于可复用性 - 具体优先于抽象 请输出简化后的代码。

3.7 反模式七:样式不一致(Inconsistent Styling)

问题描述

AI 在不同交互中生成的组件样式不一致:间距、颜色、字体大小、圆角、阴影等视觉属性在各组件间不统一。典型表现:

  • 按钮在不同页面有不同的 padding(p-2px-4 py-2p-3
  • 颜色使用硬编码值而非设计 token(bg-blue-500 vs bg-primary
  • 卡片圆角不统一(roundedrounded-lgrounded-xl
  • 标题字体大小随意(text-xltext-2xltext-lg
  • 间距系统混乱(gap-3gap-4gap-5 在相似场景中随机使用)
  • 阴影效果不统一(shadowshadow-mdshadow-lg

AI 犯错原因

AI 每次交互的上下文有限,它无法”记住”之前生成的组件使用了什么样式值。即使在同一次对话中,AI 也可能因为 prompt 措辞的微小差异而生成不同的样式。AI 缺乏对项目设计系统的全局视角。

识别方法

# 检测硬编码颜色值(应使用 token) grep -rn "bg-blue-\|bg-red-\|bg-green-\|text-blue-\|text-red-\|border-blue-" src/ --include="*.tsx" | grep -v "primary\|secondary\|accent\|muted" # 检测不一致的间距 grep -rn "className=" src/ --include="*.tsx" | grep -o "p-[0-9]\+\|px-[0-9]\+\|py-[0-9]\+\|gap-[0-9]\+" | sort | uniq -c | sort -rn # 检测不一致的圆角 grep -rn "className=" src/ --include="*.tsx" | grep -o "rounded[a-z-]*" | sort | uniq -c | sort -rn # 检测不一致的字体大小 grep -rn "className=" src/ --include="*.tsx" | grep -o "text-[a-z]\+" | sort | uniq -c | sort -rn

Steering 规则防护

## 设计一致性规则 - 颜色必须使用设计 token:bg-primary, bg-secondary, bg-muted, text-foreground 等 - 禁止使用 Tailwind 默认调色板的具体色阶(如 bg-blue-500) - 间距使用统一的 spacing scale:4(1rem), 6(1.5rem), 8(2rem) - 圆角统一:卡片 rounded-lg,按钮 rounded-md,输入框 rounded-md,徽章 rounded-full - 阴影统一:卡片 shadow-sm,弹出层 shadow-lg,模态框 shadow-xl - 字体大小层级: - 页面标题:text-3xl font-bold - 区域标题:text-xl font-semibold - 卡片标题:text-lg font-medium - 正文:text-base - 辅助文本:text-sm text-muted-foreground - 按钮样式必须使用项目定义的 Button 组件变体,不要手写按钮样式 - 新组件的视觉样式必须参考已有的相似组件

修复 Prompt 模板

请审查以下组件集合的样式一致性,并统一为设计系统规范: 组件列表: [粘贴多个组件代码] 项目设计 token: - 颜色:primary, secondary, accent, muted, destructive, foreground, background - 间距:4(sm), 6(md), 8(lg), 12(xl) - 圆角:sm(rounded), md(rounded-md), lg(rounded-lg), full(rounded-full) - 阴影:sm(shadow-sm), md(shadow-md), lg(shadow-lg) 检查项: 1. 颜色是否统一使用 token? 2. 间距是否遵循 spacing scale? 3. 圆角和阴影是否一致? 4. 字体大小层级是否正确? 5. 相似组件的视觉处理是否一致? 请输出统一后的代码,并列出所有修改点。

3.8 反模式八:响应式断裂(Broken Responsive)

问题描述

AI 生成的响应式布局经常在特定视口宽度下”断裂”:元素溢出、文字截断、布局错位、触摸目标过小、横向滚动条出现。典型表现:

  • 固定宽度值(w-[400px])在小屏幕上溢出
  • 文字在中等屏幕上截断但没有处理(无 truncate 或 line-clamp)
  • Flex 布局在窄屏上不换行(缺少 flex-wrap)
  • Grid 列数固定(grid-cols-3)在移动端不变为单列
  • 导航栏在平板尺寸下既不是桌面版也不是移动版
  • 触摸目标小于 44x44px(不符合移动端可用性标准)
  • 模态框在移动端超出屏幕

AI 犯错原因

AI 通常只为一个视口宽度生成代码(通常是桌面端),然后在被要求时才添加响应式支持。AI 缺乏对”中间断点”(如平板横屏、折叠屏)的意识。AI 倾向于使用固定值而非流体值。

识别方法

# 检测固定宽度值 grep -rn "w-\[.*px\]\|h-\[.*px\]\|width:.*px\|min-width:.*px" src/ --include="*.tsx" --include="*.css" # 检测缺少响应式前缀的 grid grep -rn "grid-cols-[2-9]" src/ --include="*.tsx" | grep -v "sm:\|md:\|lg:" # 检测缺少 flex-wrap grep -rn "flex " src/ --include="*.tsx" | grep -v "flex-wrap\|flex-col" # 使用 Responsively App 或 Polypane 多视口同步测试 # 或使用 Playwright 自动化测试不同视口 npx playwright test --project=mobile --project=tablet --project=desktop # Lighthouse 移动端审计 npx lighthouse http://localhost:5173 --emulated-form-factor=mobile --output=json

Steering 规则防护

## 响应式布局规则 - 采用 mobile-first 策略:默认样式为移动端,用 sm:/md:/lg: 扩展 - 禁止使用固定像素宽度(w-[400px]),使用相对单位或 max-w-* - Grid 布局必须包含响应式列数:grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 - Flex 容器在可能换行的场景必须添加 flex-wrap - 文字溢出处理:长文本使用 truncate 或 line-clamp-* - 触摸目标最小 44x44px(min-h-11 min-w-11) - 模态框在移动端使用全屏或底部抽屉模式 - 导航栏必须有移动端汉堡菜单方案 - 表格在移动端使用卡片布局或水平滚动(overflow-x-auto) - 测试断点:375px (iPhone SE), 768px (iPad), 1024px (iPad 横屏), 1280px (桌面), 1536px (大屏) - 使用 Container Queries (@container) 处理组件级响应式

修复 Prompt 模板

请审查以下组件的响应式布局,修复在不同视口下的断裂问题: [粘贴组件代码] 目标视口: - 移动端:375px(iPhone SE) - 平板竖屏:768px - 平板横屏:1024px - 桌面:1280px - 大屏:1536px 检查项: 1. 是否有固定像素宽度?→ 改为相对单位或 max-w 2. Grid/Flex 是否在所有视口下正常?→ 添加响应式断点 3. 文字是否可能溢出?→ 添加 truncate 或 line-clamp 4. 触摸目标是否足够大?→ 最小 44x44px 5. 模态框/弹出层在移动端是否正常?→ 适配移动端布局 6. 导航栏是否有移动端方案?→ 汉堡菜单 请使用 mobile-first 策略重写响应式样式,确保在所有目标视口下正常显示。

4. 反模式检测自动化

4.1 CI/CD 集成质量门

将反模式检测集成到 CI/CD 流水线中,在代码合并前自动拦截问题:

# .github/workflows/frontend-quality.yml name: Frontend Quality Gate on: pull_request: paths: - 'src/**' - 'package.json' jobs: quality-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 with: version: 9 - uses: actions/setup-node@v4 with: node-version: 22 cache: 'pnpm' - run: pnpm install --frozen-lockfile # TypeScript 类型检查 - name: Type Check run: pnpm tsc --noEmit # ESLint + 无障碍规则 - name: Lint run: pnpm eslint src/ --max-warnings 0 # Stylelint CSS 检查 - name: Style Lint run: pnpm stylelint "src/**/*.css" # 未使用依赖检测 - name: Dead Code Check run: pnpm knip --no-exit-code # Bundle Size 检查 - name: Build run: pnpm build - name: Bundle Size Check run: | MAX_SIZE=250000 # 250KB gzip ACTUAL=$(gzip -c dist/assets/index-*.js | wc -c) echo "Bundle size: $ACTUAL bytes (max: $MAX_SIZE)" if [ "$ACTUAL" -gt "$MAX_SIZE" ]; then echo "❌ Bundle size exceeds limit!" exit 1 fi # Lighthouse CI - name: Lighthouse uses: treosh/lighthouse-ci-action@v12 with: configPath: .lighthouserc.json uploadArtifacts: true

Lighthouse CI 配置

// .lighthouserc.json { "ci": { "assert": { "assertions": { "categories:performance": ["error", { "minScore": 0.8 }], "categories:accessibility": ["error", { "minScore": 0.9 }], "categories:best-practices": ["error", { "minScore": 0.9 }], "first-contentful-paint": ["warn", { "maxNumericValue": 2000 }], "cumulative-layout-shift": ["error", { "maxNumericValue": 0.1 }], "total-blocking-time": ["warn", { "maxNumericValue": 300 }] } } } }

4.2 Git Hooks 本地检查

使用 Husky + lint-staged 在提交前检查:

// package.json { "lint-staged": { "src/**/*.{ts,tsx}": [ "eslint --fix --max-warnings 0", "prettier --write" ], "src/**/*.css": [ "stylelint --fix", "prettier --write" ] } }

4.3 AI 辅助代码审查 Prompt

在 PR 审查时使用以下 prompt 让 AI 检查所有八大反模式:

请作为前端代码审查员,审查以下 PR diff,检查八大反模式: [粘贴 git diff 输出] 检查清单: 1. ❌ CSS 冲突:是否混用样式方案?是否有 !important? 2. ❌ 状态混乱:状态分层是否合理?是否有 useEffect+fetch? 3. ❌ 性能陷阱:是否有内联对象/函数?是否缺少代码分割? 4. ❌ 无障碍违规:是否有 div onClick?是否缺少 alt/label? 5. ❌ 包体积膨胀:是否引入了不必要的大型依赖? 6. ❌ 过度抽象:是否有只用一次的 hook?props 是否过多? 7. ❌ 样式不一致:是否使用了设计 token?间距/颜色是否统一? 8. ❌ 响应式断裂:是否有固定宽度?Grid 是否有响应式断点? 对每个发现的问题,请标注: - 严重程度:🔴 必须修复 / 🟡 建议修复 / 🟢 可选优化 - 具体位置:文件名 + 行号 - 修复建议:具体的代码修改方案

5. 实战案例:电商产品列表页的 Steering 规则实践

场景描述

一个使用 React + TypeScript + Tailwind CSS 的电商项目,需要开发产品列表页。团队使用 Kiro 进行 Spec-Driven 开发,需要确保 AI 生成的代码符合项目规范。

步骤 1:配置 Steering 规则

在项目中创建 .kiro/steering/ecommerce-frontend.md

--- inclusion: always description: 电商前端项目规则 globs: "src/**/*.{ts,tsx}" --- # 电商前端规则 ## 技术栈 - React 19 + TypeScript strict - Tailwind CSS v4 + shadcn/ui - Zustand(购物车、用户偏好) - TanStack Query(产品数据、订单数据) - React Router v7 ## 电商特定规则 - 价格显示必须使用 Intl.NumberFormat,支持多币种 - 产品图片必须使用 srcset 提供多分辨率版本 - 产品列表必须支持无限滚动或分页(不一次加载全部) - 购物车状态必须持久化到 localStorage - 所有用户输入必须做 XSS 防护(DOMPurify) - 搜索输入必须 debounce(300ms) - 产品卡片必须包含:图片、名称、价格、评分、加入购物车按钮 - 加入购物车按钮必须有 loading 和 success 状态反馈

步骤 2:AI 生成产品卡片组件

使用以下 prompt 生成组件:

请为电商产品列表页生成一个 ProductCard 组件。 需求: - 显示产品图片、名称、价格、评分、加入购物车按钮 - 响应式:移动端单列,平板双列,桌面三列 - 支持键盘操作和屏幕阅读器 - 价格使用 Intl.NumberFormat 格式化 - 图片使用 lazy loading 和 srcset - 加入购物车有 loading/success 状态 请遵循项目 Steering 规则生成代码。

步骤 3:AI 审查生成的代码

生成代码后,使用反模式检测 prompt 审查:

请审查以下 ProductCard 组件,检查八大前端反模式: [AI 生成的 ProductCard 代码] 重点检查: 1. 样式是否使用设计 token? 2. 状态管理是否合理?(加入购物车状态应该用什么管理?) 3. 图片是否优化?(lazy loading, srcset, alt) 4. 无障碍是否完整?(键盘操作, ARIA, 语义化 HTML) 5. 响应式是否覆盖所有断点? 6. 是否有不必要的抽象?

步骤 4:修复发现的问题

常见的 AI 生成问题及修复:

问题AI 生成的代码修复后的代码
硬编码颜色bg-blue-600 hover:bg-blue-700bg-primary hover:bg-primary/90
缺少 alt<img src={product.image} /><img src={product.image} alt={product.name} />
div 模拟按钮<div onClick={addToCart}><button onClick={addToCart} aria-label={...}>
固定宽度w-[300px]w-full max-w-sm
缺少 loading 状态onClick={addToCart}onClick={addToCart} disabled={isLoading}
价格硬编码格式{`$${price}`}{formatPrice(price, currency)}

案例分析

这个案例展示了 Steering 规则的核心价值:

  1. 预防优于修复:Steering 规则在 AI 生成代码时就施加约束,减少了后续审查和修复的工作量
  2. 一致性保障:无论哪个团队成员使用 AI 生成代码,输出都遵循相同的规范
  3. 知识沉淀:团队踩过的坑通过 Steering 规则固化下来,新成员和 AI 都能受益
  4. 渐进式完善:每次发现新的反模式,添加一条规则即可,规则库随项目成长

避坑指南

❌ 常见错误

  1. 规则过多过细,AI 无法全部遵守

    • 问题:写了 200 行规则,AI 的上下文窗口被规则占满,反而忽略了重要的项目上下文
    • 正确做法:核心规则控制在 50-80 行,按优先级排列,最重要的规则放在最前面。使用 Kiro 的分文件 + auto inclusion 按需加载
  2. 规则与 ESLint/Prettier 重复

    • 问题:在 Steering 规则中写”使用单引号”、“缩进 2 空格”等已被工具强制的规则
    • 正确做法:Steering 规则聚焦于 AI 特有的问题(架构决策、库选择、模式偏好),格式化和语法规则交给 ESLint/Prettier
  3. 规则没有随项目演进更新

    • 问题:项目从 Tailwind v3 升级到 v4,但规则还在引用 v3 的语法(如 @applybg-opacity-*
    • 正确做法:每次技术栈升级时同步更新 Steering 规则,将规则文件纳入 PR 审查范围
  4. 只写”禁止”不写”应该”

    • 问题:规则全是”禁止使用 X”,AI 不知道应该用什么替代
    • 正确做法:每条禁止规则都配一个推荐替代方案。如”禁止 moment.js → 使用 date-fns”
  5. 忽略 AI 工具的规则加载机制

    • 问题:在 Kiro 中写了一个 500 行的 always inclusion 文件,每次交互都消耗大量上下文
    • 正确做法:理解各工具的加载机制,合理使用 always/auto/manual 分层,glob 匹配按需加载
  6. 没有验证规则是否生效

    • 问题:写了规则但从不检查 AI 是否真的遵守了
    • 正确做法:定期用反模式检测 prompt 审查 AI 生成的代码,发现规则未被遵守时调整规则的措辞和位置

✅ 最佳实践

  1. 规则分层管理:核心规则(always)+ 领域规则(auto/按 glob)+ 临时规则(manual/按需)
  2. 规则版本化:将 Steering 规则文件纳入 Git 版本控制,变更需要 PR 审查
  3. 团队共建:每个团队成员都可以提交规则修改,通过 PR 讨论达成共识
  4. 定期清理:每月审查一次规则,删除过时、冗余或从未被触发的规则
  5. 反模式驱动:每次发现 AI 犯的新错误,先检查是否可以通过添加规则预防
  6. 测试验证:关键规则配合 CI/CD 质量门自动验证(ESLint、Lighthouse、bundle size check)
  7. 跨工具同步:如果团队使用多种 AI 工具,维护一份规则源文件,用脚本同步到各平台格式

相关资源与延伸阅读

  1. Kiro Steering 官方文档  — Kiro Steering 文件的完整配置指南,包含 inclusion 模式、glob 匹配和最佳实践
  2. Claude Code CLAUDE.md 编写指南  — Anthropic 官方的 CLAUDE.md 编写最佳实践
  3. Cursor Rules 文档  — Cursor AI 规则文件的配置和使用指南
  4. eslint-plugin-jsx-a11y  — React 无障碍 ESLint 插件,自动检测常见无障碍问题(GitHub,持续更新)
  5. axe-core  — 业界标准的无障碍自动化测试引擎(GitHub,持续更新)
  6. Knip  — 检测未使用的文件、依赖和导出的工具(GitHub,持续更新)
  7. Bundlephobia  — 在线查询 npm 包体积的工具,支持 tree-shaking 分析
  8. shadcn/ui  — 可复制源码的 React 组件库,AI 友好且 tree-shakable
  9. class-variance-authority (cva)  — Tailwind CSS 组件变体管理库,解决样式一致性问题
  10. Improving Frontend Design Through Skills  — Anthropic 官方博客,介绍如何通过 Skills 提升 AI 前端代码质量(2025)

参考来源


📖 返回 总览与导航 | 上一节:27e-响应式布局与无障碍 | 下一节:28a-AI辅助后端开发概览

Last updated on