# 代码规范与质量分析

## 主要发现
- 类型定义（High）
  - `content.config.ts` 缺少 Index 页的 `title/description/seo`，导致 `page?.title` 等缺少类型提示；特定字段（`icon/highlight/spotlight`）与 YAML 不一致。
- 组合式命名（Medium）
  - `LocalizedCollection.ts` 建议改为 `useLocalizedCollection.ts`，与 Nuxt 习惯保持一致，便于检索与自动导入心智统一。

## 统一约定
- 文件与目录
  - composables：`useXxx.ts`（示例：`useLocalizedCollection.ts`）。
  - 页面：`pages/webDev.vue`（帕斯卡命名不用于路由页）。
  - 工具：`utils/some-helper.ts`，避免与 composables 混用。
- 代码风格
  - TypeScript、ESM、Vue SFC `<script setup lang="ts">`。
  - 缩进 2 空格；组件/组合式函数采用明确的返回类型。
  - i18n 使用嵌套点式键：`$t('index.featuredProjects.viewDemo')`。
- 提交规范
  - 参考历史：`feat(content): ...`、`refactor(ui): ...`、`feat(pages): ...`。
  - 分支：`feat/<desc>`、`fix/<desc>`。

## 重构建议（示例）
1) 内容类型对齐（Critical）
   - 见补丁 `0001-content-config-align.patch`。
2) 工程脚本完善（High）
   - 新增脚本：`lint/typecheck/check`，见补丁 `0002-package-scripts.patch`。
3) 组合式命名（Medium）
   - 将 `LocalizedCollection.ts` 重命名为 `useLocalizedCollection.ts`（建议）。

## 示例：更严格的返回类型
```ts
export function useLocalizedCollection<B extends string>(baseName: B) {
  const { locale } = useI18n()
  type LocalizedKey = keyof { [K in keyof Collections as K extends `${B}_${string}` ? K : never]: any }
  type Schema = Collections[LocalizedKey]
  return useAsyncData<Schema | null>(`${baseName}-${locale.value}`, async () => {
    // ...
  })
}
```

