with one click
coding-standards
适用于 TypeScript、JavaScript、React 和 Node.js 开发的通用编码标准、最佳实践与模式。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
适用于 TypeScript、JavaScript、React 和 Node.js 开发的通用编码标准、最佳实践与模式。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
生产级 API 的 REST API 设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和速率限制。
撰写文章、指南、博客、教程、时事通讯等长篇内容,并根据提供的示例或品牌指南呈现独特的语言风格。当用户需要篇幅超过一段的精炼文字,且重视风格一致性、结构和可信度时,请使用此技能。
后端架构模式、API 设计、数据库优化以及适用于 Node.js、Express 和 Next.js API 路由的服务端最佳实践。
为 X、LinkedIn、TikTok、YouTube、时事通讯 (Newsletters) 以及多平台复用活动创建平台原生内容系统。当用户需要社交帖子、推文串 (Threads)、脚本、内容日历或将单一源素材清晰地适配到多个平台时使用。
Playwright E2E 测试模式、页面对象模型(POM)、配置、CI/CD 集成、产物管理以及不稳定测试(flaky test)策略。
适用于 Claude Code 会话的正规评测框架(Evaluation Framework),实现了评测驱动开发(Eval-Driven Development, EDD)原则
| name | coding-standards |
| description | 适用于 TypeScript、JavaScript、React 和 Node.js 开发的通用编码标准、最佳实践与模式。 |
| origin | ECC |
适用于所有项目的通用编码标准。
// ✅ 推荐:描述性名称
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000
// ❌ 不推荐:命名不清晰
const q = 'election'
const flag = true
const x = 1000
// ✅ 推荐:动词-名词模式
async function fetchMarketData(marketId: string) { }
function calculateSimilarity(a: number[], b: number[]) { }
function isValidEmail(email: string): boolean { }
// ❌ 不推荐:不清晰或仅用名词
async function market(id: string) { }
function similarity(a, b) { }
function email(e) { }
// ✅ 始终使用展开运算符 (Spread Operator)
const updatedUser = {
...user,
name: 'New Name'
}
const updatedArray = [...items, newItem]
// ❌ 严禁直接修改 (Mutate)
user.name = 'New Name' // 错误
items.push(newItem) // 错误
// ✅ 推荐:全面的错误处理
async function fetchData(url: string) {
try {
const response = await fetch(url)
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
}
return await response.json()
} catch (error) {
console.error('Fetch failed:', error)
throw new Error('Failed to fetch data')
}
}
// ❌ 不推荐:没有错误处理
async function fetchData(url) {
const response = await fetch(url)
return response.json()
}
// ✅ 推荐:尽可能并行执行
const [users, markets, stats] = await Promise.all([
fetchUsers(),
fetchMarkets(),
fetchStats()
])
// ❌ 不推荐:不必要的顺序执行
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()
// ✅ 推荐:定义合适的类型
interface Market {
id: string
name: string
status: 'active' | 'resolved' | 'closed'
created_at: Date
}
function getMarket(id: string): Promise<Market> {
// 实现
}
// ❌ 不推荐:使用 'any'
function getMarket(id: any): Promise<any> {
// 实现
}
// ✅ 推荐:带类型的函数式组件
interface ButtonProps {
children: React.ReactNode
onClick: () => void
disabled?: boolean
variant?: 'primary' | 'secondary'
}
export function Button({
children,
onClick,
disabled = false,
variant = 'primary'
}: ButtonProps) {
return (
<button
onClick={onClick}
disabled={disabled}
className={`btn btn-${variant}`}
>
{children}
</button>
)
}
// ❌ 不推荐:无类型,结构不清晰
export function Button(props) {
return <button onClick={props.onClick}>{props.children}</button>
}
// ✅ 推荐:可复用的自定义 Hook
export function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => clearTimeout(handler)
}, [value, delay])
return debouncedValue
}
// 使用示例
const debouncedQuery = useDebounce(searchQuery, 500)
// ✅ 推荐:正确的状态更新
const [count, setCount] = useState(0)
// 基于前一个状态的函数式更新
setCount(prev => prev + 1)
// ❌ 不推荐:直接引用当前状态
setCount(count + 1) // 在异步场景中可能会导致状态过期
// ✅ 推荐:清晰的条件渲染
{isLoading && <Spinner />}
{error && <ErrorMessage error={error} />}
{data && <DataDisplay data={data} />}
// ❌ 不推荐:三元运算符地狱
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}
GET /api/markets # 列出所有市场
GET /api/markets/:id # 获取特定市场
POST /api/markets # 创建新市场
PUT /api/markets/:id # 更新市场(完整更新)
PATCH /api/markets/:id # 更新市场(部分更新)
DELETE /api/markets/:id # 删除市场
# 用于过滤的查询参数
GET /api/markets?status=active&limit=10&offset=0
// ✅ 推荐:一致的响应结构
interface ApiResponse<T> {
success: boolean
data?: T
error?: string
meta?: {
total: number
page: number
limit: number
}
}
// 成功响应
return NextResponse.json({
success: true,
data: markets,
meta: { total: 100, page: 1, limit: 10 }
})
// 错误响应
return NextResponse.json({
success: false,
error: 'Invalid request'
}, { status: 400 })
import { z } from 'zod'
// ✅ 推荐:Schema 校验
const CreateMarketSchema = z.object({
name: z.string().min(1).max(200),
description: z.string().min(1).max(2000),
endDate: z.string().datetime(),
categories: z.array(z.string()).min(1)
})
export async function POST(request: Request) {
const body = await request.json()
try {
const validated = CreateMarketSchema.parse(body)
// 使用校验通过的数据继续执行
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json({
success: false,
error: 'Validation failed',
details: error.errors
}, { status: 400 })
}
}
}
src/
├── app/ # Next.js App Router
│ ├── api/ # API 路由
│ ├── markets/ # 市场相关页面
│ └── (auth)/ # 认证相关页面 (路由组)
├── components/ # React 组件
│ ├── ui/ # 通用 UI 组件
│ ├── forms/ # 表单组件
│ └── layouts/ # 布局组件
├── hooks/ # 自定义 React Hook
├── lib/ # 工具函数与配置
│ ├── api/ # API 客户端
│ ├── utils/ # 辅助函数
│ └── constants/ # 常量
├── types/ # TypeScript 类型定义
└── styles/ # 全局样式
components/Button.tsx # 组件使用大驼峰 (PascalCase)
hooks/useAuth.ts # 以 'use' 为前缀的小驼峰 (camelCase)
lib/formatDate.ts # 工具函数使用小驼峰 (camelCase)
types/market.types.ts # 使用小驼峰并以 .types 为后缀
// ✅ 推荐:解释“为什么”,而不是“是什么”
// 在服务中断期间使用指数退避 (Exponential Backoff),以避免请求压垮 API
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)
// 为了优化处理大型数组的性能,这里特意使用了 Mutate 操作
items.push(newItem)
// ❌ 不推荐:描述显而易见的事实
// 计数器加 1
count++
// 将名称设置为用户的名称
name = user.name
/**
* 使用语义相似度搜索市场。
*
* @param query - 自然语言搜索查询词
* @param limit - 最大结果数量(默认:10)
* @returns 按相似度得分排序的市场数组
* @throws {Error} 如果 OpenAI API 失败或 Redis 不可用
*
* @example
* ```typescript
* const results = await searchMarkets('election', 5)
* console.log(results[0].name) // "Trump vs Biden"
* ```
*/
export async function searchMarkets(
query: string,
limit: number = 10
): Promise<Market[]> {
// 实现
}
import { useMemo, useCallback } from 'react'
// ✅ 推荐:对高开销计算进行记忆化
const sortedMarkets = useMemo(() => {
return markets.sort((a, b) => b.volume - a.volume)
}, [markets])
// ✅ 推荐:对回调函数进行记忆化
const handleSearch = useCallback((query: string) => {
setSearchQuery(query)
}, [])
import { lazy, Suspense } from 'react'
// ✅ 推荐:懒加载重量级组件
const HeavyChart = lazy(() => import('./HeavyChart'))
export function Dashboard() {
return (
<Suspense fallback={<Spinner />}>
<HeavyChart />
</Suspense>
)
}
// ✅ 推荐:只查询必要的列
const { data } = await supabase
.from('markets')
.select('id, name, status')
.limit(10)
// ❌ 不推荐:查询所有列
const { data } = await supabase
.from('markets')
.select('*')
test('calculates similarity correctly', () => {
// Arrange (准备阶段)
const vector1 = [1, 0, 0]
const vector2 = [0, 1, 0]
// Act (执行阶段)
const similarity = calculateCosineSimilarity(vector1, vector2)
// Assert (断言阶段)
expect(similarity).toBe(0)
})
// ✅ 推荐:描述性测试名称
test('returns empty array when no markets match query', () => { })
test('throws error when OpenAI API key is missing', () => { })
test('falls back to substring search when Redis unavailable', () => { })
// ❌ 不推荐:模糊的测试名称
test('works', () => { })
test('test search', () => { })
注意以下反模式:
// ❌ 不推荐:函数超过 50 行
function processMarketData() {
// 100 行代码
}
// ✅ 推荐:拆分为更小的函数
function processMarketData() {
const validated = validateData()
const transformed = transformData(validated)
return saveData(transformed)
}
// ❌ 不推荐:5 层以上的嵌套
if (user) {
if (user.isAdmin) {
if (market) {
if (market.isActive) {
if (hasPermission) {
// 执行某些操作
}
}
}
}
}
// ✅ 推荐:卫语句 (Early Returns)
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return
// 执行某些操作
// ❌ 不推荐:未解释的数字
if (retryCount > 3) { }
setTimeout(callback, 500)
// ✅ 推荐:具名常量
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500
if (retryCount > MAX_RETRIES) { }
setTimeout(callback, DEBOUNCE_DELAY_MS)
记住:代码质量是不容商量的。清晰、可维护的代码是快速开发和从容重构的基石。