소스 정보
- 저장소
- gugug168/claudecode-tutorial
- 최근 소스 활동
- 2026년 2월 24일 13:40
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/gugug168/claudecode-tutorial --skill coding-standards명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | coding-standards |
| description | 通用编码标准、最佳实践和模式,适用于 TypeScript、JavaScript、React 和 Node.js 开发。 |
适用于所有项目的通用编码标准。
// 好的写法:描述性名称
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) { }
// 始终使用展开运算符
const updatedUser = {
...user,
name: 'New Name'
}
const updatedArray = [...items, newItem]
// 永远不要直接修改
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: ,
: error.
}, { : })
}
}
}
src/
├── app/ # Next.js App Router
│ ├── api/ # API 路由
│ ├── markets/ # 市场页面
│ └── (auth)/ # 认证页面(路由组)
├── components/ # React 组件
│ ├── ui/ # 通用 UI 组件
│ ├── forms/ # 表单组件
│ └── layouts/ # 布局组件
├── hooks/ # 自定义 React hooks
├── lib/ # 工具和配置
│ ├── api/ # API 客户端
│ ├── utils/ # 辅助函数
│ └── constants/ # 常量
├── types/ # TypeScript 类型
└── styles/ # 全局样式
components/Button.tsx # 组件使用 PascalCase
hooks/useAuth.ts # hooks 使用 camelCase 加 'use' 前缀
lib/formatDate.ts # 工具使用 camelCase
types/market.types.ts # 类型使用 camelCase 加 .types 后缀
// 好的写法:解释为什么,不是做什么
// 使用指数退避避免在故障期间压垮 API
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)
// 出于性能考虑,这里故意使用变异数组
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) {
// 做某事
}
}
}
}
}
// 好的写法:提前返回
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)
记住:代码质量是不可妥协的。清晰、可维护的代码能实现快速开发和自信重构。
SOC 직업 분류 기준