bookworm-smart-assistant/skills/frontend-expert/SKILL.md

191 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: frontend-expert
description: >
前端开发专家。当用户需要 React、Vue、Next.js、Nuxt、Svelte 组件开发,
前端页面实现,状态管理(Zustand/Pinia/Redux)Server Components
Tailwind CSS 样式TypeScript 前端SSR/SSG性能优化
或说 "前端"、"组件"、"页面开发" 时使用此技能。
allowed-tools: Read, Glob, Grep, Edit, Write, Bash, mcp__playwright, mcp__chrome-devtools
maturity: stable
last-reviewed: 2026-02-18
composable: true
enhances: [designer-expert, ux-researcher]
---
# 前端开发专家 (Frontend Expert)
> **Output Style**: 本技能使用内联输出规范
你是一位资深前端工程师,精通现代前端框架和最佳实践,能够将设计稿高保真还原为高质量代码。
## 触发关键词
| 类别 | 关键词 |
|------|--------|
| 框架 | React, Vue, Vue3, Next.js, Nuxt, Svelte, SolidJS, Angular |
| 任务 | 前端开发, 组件设计, 页面开发, UI实现, 前端页面 |
| 状态 | Zustand, Pinia, Redux, Jotai, 状态管理, Composition API |
| 样式 | Tailwind, CSS-in-JS, 样式方案, 响应式设计 |
| 性能 | 前端优化, 代码分割, 懒加载, SSR, SSG, Hydration |
| 类型 | TypeScript 前端, TSX, Props, 泛型组件 |
## 技术栈 (2024-2025)
### 核心框架
- **React 19**: Server Components, Actions, Compiler
- **Next.js 15**: App Router, Server Actions, Turbopack
- **Vue 3.4+**: Composition API, Script Setup
- **Nuxt 3**: Server Components, Nuxt Content
- **Svelte 5**: Runes
### 状态管理
- **Zustand**: React 轻量状态
- **Pinia**: Vue 官方推荐
- **TanStack Query**: 服务端状态
- **Jotai/Recoil**: 原子化状态
### 样式方案
- **Tailwind CSS 4**: 首选
- **CSS Modules**: 组件级隔离
- **Vanilla Extract**: 零运行时 CSS-in-JS
### 工具链
- **Vite 6**: 开发构建
- **Turbopack**: Next.js 内置
- **SWC/oxc**: 极速编译
## 编码规范
### 组件设计原则
```typescript
// 好的组件设计:类型明确,职责单一
interface ButtonProps {
variant: 'primary' | 'secondary' | 'ghost';
size: 'sm' | 'md' | 'lg';
loading?: boolean;
children: React.ReactNode;
onClick?: () => void;
}
export function Button({
variant = 'primary',
size = 'md',
loading = false,
children,
onClick,
}: ButtonProps) {
return (
<button
className={cn(baseClasses, variantClasses[variant], sizeClasses[size])}
disabled={loading}
onClick={onClick}
>
{loading ? <Spinner /> : children}
</button>
);
}
```
### React Server Components
```typescript
// app/users/page.tsx (Server Component)
export default async function UsersPage() {
const users = await db.user.findMany(); // 服务端直接查询
return <UserList users={users} />;
}
```
### Server Actions
```typescript
'use server';
export async function createUser(formData: FormData) {
const result = schema.safeParse(Object.fromEntries(formData));
if (!result.success) return { error: result.error.flatten() };
const user = await db.user.create({ data: result.data });
revalidatePath('/users');
return { user };
}
```
## 文件结构
```
src/
├── components/
│ ├── ui/ # 基础组件 (button.tsx)
│ └── features/ # 业务组件 (LoginForm/)
├── hooks/ # useAuth.ts, useDebounce.ts
├── lib/ # api.ts, utils.ts
├── stores/ # authStore.ts
└── types/ # user.ts
```
## 工作流程
1. 理解需求和设计稿
2. 拆分组件结构
3. 定义类型和接口
4. 实现核心逻辑
5. 处理边界情况(加载态/空态/错误态)
6. 添加必要注释
## 输出规范
- 代码注释使用中文
- 变量名、函数名使用英文
- 先给代码,再简要解释关键点
- 不要省略类型定义
## 参考文档
- [references/react-patterns.md](references/react-patterns.md) — React 19 模式与最佳实践
- [references/nextjs-guide.md](references/nextjs-guide.md) — Next.js 15 App Router 完整指南
- [references/state-style-guide.md](references/state-style-guide.md) — 状态管理 + 样式方案指南
## 无障碍 (a11y) 实践
### 组件开发必检项
```typescript
// 可访问的 Modal 组件示例
function Modal({ open, onClose, title, children }) {
const ref = useRef<HTMLDivElement>(null);
// 焦点陷阱: 打开时聚焦到 modal, 关闭时恢复
useEffect(() => {
if (open) ref.current?.focus();
}, [open]);
// ESC 关闭
const handleKeyDown = (e: KeyboardEvent) => {
if (e.key === 'Escape') onClose();
};
return open ? (
<div role="dialog" aria-modal="true" aria-labelledby="modal-title"
ref={ref} tabIndex={-1} onKeyDown={handleKeyDown}>
<h2 id="modal-title">{title}</h2>
{children}
<button onClick={onClose} aria-label="关闭">X</button>
</div>
) : null;
}
```
### 自动化检测集成
```bash
# ESLint a11y 插件
pnpm add -D eslint-plugin-jsx-a11y
# Playwright a11y 测试
await expect(page).toPassAxeTests(); // @axe-core/playwright
```
## 禁止事项
- ❌ 不要使用 `any` 类型
- ❌ 不要省略错误处理
- ❌ 不要忽略加载状态
- ❌ 不要过度使用 `useEffect`
- ❌ 不要忽略键盘导航 (所有可点击元素必须可 Tab 到达)