frontend-dev Skill
Erzwingt Coding-Standards für Vue 3 und React, einschließlich UI-Constraints, TypeScript-Regeln und Protokollen für das API-Handling.
- GitHub Stars
- 1.061
- Dateien
- 4
- Letzter Commit
- 26. Aug. 2026
- Lizenz
- —
- Erlaubte Tools
- —
Was macht der frontend-dev Skill?
frontend-dev ist ein Agent Skill. Erzwingt Coding-Standards für Vue 3 und React, einschließlich UI-Constraints, TypeScript-Regeln und Protokollen für das API-Handling.
Zusammenfassung erzeugt aus der SKILL.md des Skills.
Über den frontend-dev skill
Dieses Skill ermöglicht es Entwicklern, die den bauen von Enterprise-Webanwendungen, professionelle Frontend-Coding-Standards für Vue 3 und React durchzusetzen. Es bietet ein striktes Framework für das UI-Design und stellt sicher, dass Interfaces sauber und professionell bleiben, indem es Neon-Gradients, Glassmorphism und übermäßige dekorative Elemente zugunsten einer zurückhaltenden Schwarz-, Weiß- und Graupalette verbietet.
Wenn ein Agent dieses Skill lädt, wendet er spezifische technische Constraints auf verschiedene Dateitypen an, einschließlich .vue, .tsx und .ts Dateien. Es leitet die Implementierung von Vue 3 mit Pinia oder React 18 mit Zustand an und schreibt die Verwendung von Vite für Builds vor. Das Skill erzeugt Code, der strengen TypeScript-Regeln entspricht, wie etwa der Anforderung von Generic Constraints für API-Calls und dem Verbot der Verwendung von any, um die Type Safety zu umgehen. Zudem stellt es sicher, dass Entwickler essenzielle Interaktionszustände wie loading, empty und error durch spezifische Component-Patterns handhaben.
Was ein agent damit machen kann
- 1Vue 3 Component-Struktur standardisierenGeneriere eine Vue 3 Component unter Verwendung des script setup Patterns mit korrekten Props, Emits und Lifecycle Hooks.
- 2Type-safe API-Integration erzwingenRefactore einen API-Call, um Generics anstelle von unknown oder Type Assertions zu verwenden.
- 3Konsistentes Error-Handling implementierenStelle sicher, dass alle Netzwerk-Requests Error-Handling und User-Notifications für nicht erfolgreiche Responses enthalten.
- 4UI-Style-Constraints anwendenReview ein UI-Design, um sicherzustellen, dass keine verbotenen Styles wie Cyberpunk oder schwere Gradients verwendet werden.
Geschrieben basierend auf dem SKILL.md des skills. Jeder use case wurde gegen ein zitat daraus geprüft.
So installierst du den frontend-dev Skill
Jeder Befehl kopiert den Skill-Ordner in das Skills-Verzeichnis des Clients. Starte den Client neu oder beginne eine neue Session, um ihn zu laden.Den frontend-dev Skill in Plugin installieren
/plugin marketplace add doccker/cc-use-exp /plugin install cc-use-exp@cc-use-exp
Den frontend-dev Skill in Claude Code installieren
~/.claude/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev ~/.claude/skills/frontend-devDen frontend-dev Skill in Claude Code (project) installieren
.claude/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev .claude/skills/frontend-devDen frontend-dev Skill in Codex installieren
~/.agents/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev ~/.agents/skills/frontend-devDen frontend-dev Skill in Gemini CLI installieren
~/.gemini/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev ~/.gemini/skills/frontend-devDen frontend-dev Skill in Claude.ai installieren
npx degit doccker/cc-use-exp/skills/frontend-dev frontend-dev && zip -r frontend-dev.zip frontend-dev # claude.ai → Customize → Skills → + → Create skill → Upload a skill → frontend-dev.zip
Automatisierte Checks
Geluften am 15. Nov. 2026Vollständiger Bericht →Noch nicht verifiziert. Ein Skill braucht 80 Punkte, keinen schweren Befund und genug Daten für unsere Prüfung. Wie die Checks funktionieren · Was du für mehr Punkte verbessern kannst
- Source Repository verknüpft und erreichbardoccker/cc-use-exp/skills/frontend-dev is public and reachablegithub.com/doccker/cc-use-exp/tree/HEAD/skills/frontend-dev ↗Bestanden
- Open Source Lizenz (OSI)No licenseBefund
- Commit oder Release im letzten JahrLast commit 2026-08-26github.com/doccker/cc-use-exp/commits ↗Bestanden
- Keine Download-und-Ausführen-Muster oder Zugangsdatendiebstahl in SkriptenNo scripts in the skill folderBestanden
- Keine versteckten Anweisungen in SKILL.mdNo override phrases, safeguard switches, credential requests or hidden charactersgithub.com/doccker/cc-use-exp/blob/HEAD/skills/frontend-dev/ ↗Bestanden
- Vorab erlaubte Tools sind eingeschränktNo pre-approved tools; the agent asks before using onegithub.com/doccker/cc-use-exp/blob/HEAD/skills/frontend-dev/ ↗Bestanden
- SKILL.md folgt dem Agent-Skills-Formatthe description does not say when to use the skillgithub.com/doccker/cc-use-exp/blob/HEAD/skills/frontend-dev/ ↗Befund
SKILL.md
Auf GitHub ansehen前端开发规范
参考来源: Vue 官方风格指南、Element Plus 最佳实践
UI 风格约束
严格禁止(常见 AI 风格)
- ❌ 蓝紫色霓虹渐变、发光描边、玻璃拟态
- ❌ 大面积渐变、过多装饰性几何图形
- ❌ 赛博风、暗黑科技风、AI 风格 UI
- ❌ UI 文案中使用 emoji
后台系统(默认风格)
| 要素 | 要求 |
|---|---|
| 主题 | 使用组件库默认主题 |
| 配色 | 黑白灰为主 + 1 个主色点缀 |
| 动效 | 克制,仅保留必要交互反馈 |
技术栈
| 层级 | Vue(首选) | React(备选) |
|---|---|---|
| 框架 | Vue 3 + TypeScript | React 18 + TypeScript |
| 构建 | Vite | Vite |
| 路由 | Vue Router 4 | React Router 6 |
| 状态 | Pinia | Zustand |
| UI 库 | Element Plus | Ant Design |
Vue 编码规范
组件基础
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import type { User } from '@/types'
// Props & Emits
const props = defineProps<{ userId: number }>()
const emit = defineEmits<{ (e: 'update', value: string): void }>()
// 响应式状态
const loading = ref(false)
const user = ref<User | null>(null)
// 计算属性
const displayName = computed(() => user.value?.name ?? '未知用户')
// 生命周期
onMounted(async () => { await fetchUser() })
// 方法
async function fetchUser() {
loading.value = true
try {
user.value = await api.getUser(props.userId)
} finally {
loading.value = false
}
}
</script>
<template>
<div class="user-card">
<h3>{{ displayName }}</h3>
</div>
</template>
<style scoped>
.user-card { padding: 16px; }
</style>
命名约定
| 类型 | 约定 | 示例 |
|---|---|---|
| 组件文件 | PascalCase.vue | UserCard.vue |
| Composables | useXxx.ts | useAuth.ts |
| Store | useXxxStore.ts | useUserStore.ts |
状态管理(Pinia)
// stores/user.ts
export const useUserStore = defineStore('user', () => {
const user = ref<User | null>(null)
const token = ref<string>('')
const isLoggedIn = computed(() => !!token.value)
async function login(username: string, password: string) {
const res = await api.login(username, password)
token.value = res.token
user.value = res.user
}
return { user, token, isLoggedIn, login }
})
交互状态处理
必须处理的状态: loading、empty、error、disabled、submitting
<template>
<el-skeleton v-if="loading" :rows="5" animated />
<el-result v-else-if="error" icon="error" :title="error">
<template #extra>
<el-button @click="fetchData">重试</el-button>
</template>
</el-result>
<el-empty v-else-if="list.length === 0" description="暂无数据" />
<template v-else>
<!-- 正常内容 -->
</template>
</template>
TypeScript 规范
// types/user.ts
export interface User {
id: number
username: string
role: 'admin' | 'user'
}
export interface ApiResponse<T = unknown> {
code: number
message: string
data: T
}
API 调用类型安全
| 规则 | 说明 |
|---|---|
| ✅ API 工具函数支持泛型 | get<T>(url): Promise<T> 而非返回 unknown |
| ✅ 调用处指定泛型或断言 | get<UserInfo>(url) 或 data as typeof ref.value |
❌ 禁止 as any 绕过 |
掩盖类型问题,后续维护踩坑 |
// ❌ get() 返回 unknown,赋值报 TS2322
const data = await get('/contact/config')
contact.value = data
// ❌ as any 绕过
contact.value = data as any
// ✅ 泛型约束(推荐)
const data = await get<ContactConfig>('/contact/config')
contact.value = data
// ✅ 类型断言(最小改动)
contact.value = data as typeof contact.value
性能优化
| 场景 | 方案 |
|---|---|
| 大列表 | 虚拟滚动 |
| 路由 | 懒加载 () => import() |
| 计算 | 使用 computed 缓存 |
| 大数据 | 使用 shallowRef |
// 路由懒加载
const routes = [
{ path: '/dashboard', component: () => import('@/views/Dashboard.vue') }
]
// 请求防抖
import { useDebounceFn } from '@vueuse/core'
const debouncedSearch = useDebounceFn((keyword) => api.search(keyword), 300)
目录结构
src/
├── assets/
│ └── styles/ # 全局/共享样式
├── api/ # API 请求
├── components/ # 通用组件
├── composables/ # 组合式函数
├── router/ # 路由配置
├── stores/ # Pinia stores
├── types/ # TypeScript 类型
├── utils/ # 工具函数
├── views/ # 页面组件
├── App.vue
└── main.ts
样式管理规范
| 规则 | 说明 |
|---|---|
❌ 禁止在 .vue 中写大段样式 |
<style> 块不超过 20 行 |
❌ 禁止在 .tsx 中写大段内联样式 |
样式对象/CSS-in-JS 不超过 20 行 |
✅ 共享样式抽到 src/assets/styles/ |
按模块拆分文件 |
| ✅ 组件内只保留极简样式 | Vue: scoped 微调;React: className 引用 |
src/assets/styles/
├── variables.scss # 变量(颜色、间距、字号)
├── common.scss # 通用样式
└── [module].scss # 按模块拆分
请求体完整性规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止 UI 可选字段未传入 API | 用户选择/输入的字段必须全部传入请求体 |
| ✅ 提交函数与表单字段一一对应 | 用 TypeScript interface 约束请求体 |
// ❌ UI 有支付方式选择器,但请求体没传 payMethod
const payMethod = ref<'wechat' | 'points' | 'mixed'>('wechat')
async function createOrder() {
await api.createOrder({
items: orderItems.value,
addressId: selectedAddress.value.id,
// payMethod 忘记传了!支付方式选择 UI 形同虚设
})
}
// ✅ 请求体与 UI 表单字段对应
interface CreateOrderRequest {
items: OrderItem[]
addressId: number
payMethod: 'wechat' | 'points' | 'mixed' // 类型约束确保不遗漏
}
async function createOrder() {
const request: CreateOrderRequest = {
items: orderItems.value,
addressId: selectedAddress.value.id,
payMethod: payMethod.value, // TypeScript 会提示缺少字段
}
await api.createOrder(request)
}
API 错误处理规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止静默忽略非成功响应 | res.code !== 200 时必须提示用户 |
| ✅ 统一错误提示 | 非成功响应统一 message.error 提示 |
| ✅ 网络异常也要处理 | try/catch 捕获请求异常 |
// ❌ 只处理成功,非 200 静默忽略
const res = await api.getList(params)
if (res.code === 200) {
list.value = res.data
}
// ✅ 成功 + 失败都处理
try {
const res = await api.getList(params)
if (res.code === 200) {
list.value = res.data
} else {
message.error(res.message || '加载失败')
}
} catch (e) {
message.error('网络异常,请稍后重试')
}
类型复用规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止多个文件重复定义相同接口 | PageResponse、BaseResult 等 |
✅ 通用类型统一放 @/types/common.ts |
全局导出,各处引用 |
// ❌ 每个 api 文件都定义一遍
// api/user.ts
interface PageResponse<T> { list: T[]; total: number }
// api/order.ts
interface PageResponse<T> { list: T[]; total: number } // 重复
// ✅ 统一定义,各处引用
// types/common.ts
export interface PageResponse<T> {
list: T[]
total: number
}
// api/user.ts
import type { PageResponse } from '@/types/common'
详细参考
| 文件 | 内容 |
|---|---|
references/frontend-style.md |
UI 风格、Vue 3 规范、Pinia、API 封装、性能优化 |
references/miniapp-pitfalls.md |
uni-app 陷阱:页面栈只读、Storage 清理时机、生命周期双触发、前端校验镜像 |
references/date-time.md |
dayjs/date-fns 日期加减、账期计算、禁止月末对齐 |
📋 本回复遵循:
frontend-dev- [具体章节]
Dateien in diesem Skill
4frontend-dev Skill-Fragen
Wie installiere ich den frontend-dev Skill in Claude Code?
Führe npx degit doccker/cc-use-exp/skills/frontend-dev ~/.claude/skills/frontend-dev aus. Claude Code lädt Skills aus ~/.claude/skills (alle Projekte) oder .claude/skills (ein Projekt) und nutzt einen Skill, wenn seine Beschreibung zur Aufgabe passt.
Welche Clients können den frontend-dev Skill nutzen?
Jeder Client, der das Agent Skills-Format liest: Claude Code, Codex, Gemini CLI und claude.ai (als ZIP hochladen). Skripte im Skill laufen nur dort, wo der Client Codeausführung erlaubt.
Welche UI-Styles sind verboten?
Die Standards verbieten strikt Neon-Gradients, leuchtende Borders, Glassmorphism, großflächige Verläufe, übermäßige dekorative geometrische Formen, Cyber-/AI-Styles sowie die Verwendung von Emojis in UI-Texten.
Wie sollen API-Fehler behandelt werden?
Nicht erfolgreiche Responses dürfen nicht stillschweigend ignoriert werden; wenn der Response-Code nicht 200 ist, muss eine einheitliche Fehlermeldung an den User angezeigt werden, und Netzwerk-Exceptions müssen mittels try/catch abgefangen werden.
Was sind die Naming-Conventions für Vue Components und Composables?
Component-Dateien sollten PascalCase verwenden (z. B. UserCard.vue), und Composables sollten dem useXxx.ts-Pattern folgen (z. B. useAuth.ts).