项目文件夹

文件
2026-07-13 21:35:40 +08:00

4.4 KiB

name, description, metadata
name description metadata
antfu Anthony Fu 对 JavaScript/TypeScript 项目的个人工具链与编码约定。适用于新建项目、配置 ESLint/Prettier 替代方案、monorepo、库发布,或当用户提到 Anthony Fu 的偏好时。
author version
Anthony Fu 2026.05.01

编码实践

代码组织

  • 单一职责:每个源文件应有清晰、聚焦的范围/用途
  • 拆分大文件:当文件变得庞大或处理过多职责时应进行拆分
  • 类型分离:始终将类型和接口分离到 types.tstypes/*.ts
  • 常量提取:将常量提取到专用的 constants.ts 文件中

运行时环境

  • 优先使用同构代码:尽可能编写运行时无关的代码,使其能在 Node、浏览器和 Worker 中运行
  • 标明运行时环境:当代码与环境相关时,在文件顶部添加注释:
// @env node
// @env browser

TypeScript

  • 显式返回类型:尽可能显式声明返回类型
  • 避免复杂的内联类型:将复杂类型提取到专用的 typeinterface 声明中

注释

  • 避免不必要的注释:代码应能自解释
  • 解释「为什么」而非「怎么做」:注释应描述推理过程或意图,而非代码本身做了什么

测试(Vitest

  • 测试文件:foo.tsfoo.test.ts(同一目录)
  • 使用 describe/it API(而非 test
  • 对复杂输出使用 toMatchSnapshot
  • 对语言相关的快照使用带显式路径的 toMatchFileSnapshot

工具选择

@antfu/ni 命令

命令 描述
ni 安装依赖
ni <pkg> / ni -D <pkg> 添加依赖 / 开发依赖
nr <script> 运行脚本
nu 升级依赖
nun <pkg> 卸载依赖
nci 纯净安装(pnpm i --frozen-lockfile
nlx <pkg> 执行包(npx

检查 npm 包版本

使用 fast-npm-meta 查询包的最新版本——它查询一个小型元数据端点,而非下载完整的注册表数据(每个包可能达数兆字节)。

nlx fast-npm-meta version vite              # 7.3.1
nlx fast-npm-meta version "nuxt@^3.5"       # 3.5.22 — 支持范围感知
nlx fast-npm-meta version vite nuxt vue     # 同时查询多个
nlx fast-npm-meta version vite --json       # JSON 格式输出,适合脚本处理
nlx fast-npm-meta full vite                 # 完整版本列表 + dist-tags

当你只需要最新版本时,优先使用此方式替代 npm view <pkg> version,也优于直接从注册表读取 package.json

TypeScript 配置

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true
  }
}

ESLint 配置

// eslint.config.mjs
import antfu from '@antfu/eslint-config'

export default antfu()

完成任务后,运行 pnpm run lint --fix 来格式化代码并修复编码风格。

详细配置选项请参见:antfu-eslint-config

Git 钩子

{
  "simple-git-hooks": {
    "pre-commit": "pnpm i --frozen-lockfile --ignore-scripts --offline && npx lint-staged"
  },
  "lint-staged": { "*": "eslint --fix" },
  "scripts": {
    "prepare": "npx simple-git-hooks"
  }
}

pnpm Catalogs

pnpm-workspace.yaml 中使用具名 catalog 进行版本管理:

Catalog 用途
prod 生产依赖
inlined 打包器内联依赖
dev 开发工具(linter、打包器、测试)
frontend 前端库

避免使用默认 catalog。Catalog 名称可根据项目需求调整。


参考

主题 描述 参考文档
ESLint 配置 框架支持、格式化器、规则覆盖、VS Code 设置 antfu-eslint-config
项目设置 .gitignore、GitHub Actions、VS Code 扩展 setting-up
应用开发 Vue/Nuxt/UnoCSS 约定与模式 app-development
库开发 tsdown 打包、纯 ESM 发布 library-development
Monorepo pnpm workspaces、集中式别名、Turborepo monorepo