其他
用 Anthony Fu 约定搭建/规范 JS/TS…
在新建或整理 JavaScript/TypeScript 项目时,按 Anthony Fu 的偏好配置代码组织、TypeScript、测测、ESLint、Git hooks 与 pnpm 版本管理。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 39/100 ×0.15
适用场景
用 Anthony Fu 约定搭建/规范特定
解决思路
- 代码组织:每个源文件保持单一职责,范围/目的清晰聚焦
- 文件变大或承担过多关注点时拆分文件
- 类型分离:把所有类型和接口放到 `types.ts` 或 `types/*.ts`
- 常量提取:把常量搬到专门的 `constants.ts` 文件
- 运行时环境:尽量写同构代码,在 Node、浏览器、worker 中都能运行
- 环境特定代码:在文件顶部加注释标明运行环境,如 `// @env node`、`// @env browser`
- TypeScript:尽可能显式声明函数返回类型
- 避免复杂的内联类型,把复杂类型抽成独立的 `type` 或 `interface` 声明
- 显式性:优先写显式、可追溯的代码而非隐式「魔法」,让读者(人或 agent)无需运行工具就能看出每个名字的来源
- 显式导入:优先写显式 `import` 语句;避免 auto-import,若框架(如 Nuxt/Nitro)默认提供,在新项目中将其关闭
- 默认不用路径别名:使用相对导入(`./foo`、`../bar`);只有当项目**已经**配置了路径别名(`@/`、`~/`、`#imports` 等)时才沿用,不要为新代码引入新别名
- 注释:避免无必要的注释,代码应自解释
- 注释写「为什么」而不是「怎么做」,描述推理与意图,而非代码在做什么
- 测试(Vitest):测试文件与源文件同目录,命名 `foo.ts` → `foo.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`、`nlx fast-npm-meta version "nuxt@^3.5"`(支持范围)、`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` 或直接读 registry 里的 `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` 格式化代码并修复风格问题
- Git hooks 配置:在 package.json 中设 `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 管理版本——`prod`(生产依赖)、`inlined`(打包器内联依赖)、`dev`(开发工具:linter、打包器、测试)、`frontend`(前端库);避免使用默认 catalog,catalog 名称可按项目需要调整
适用边界 · 注意事项
- 项目已有既定的 ESLint/格式化规范或团队约定不同时,不要强行换成 @antfu/eslint-config
- 不使用 pnpm 或不属于 JS/TS 前端工具链的项目(如纯其他语言后端)
- 已有路径别名配置的项目不要改写成相对导入;相对导入规则只针对新写的 greenfield 代码