工程实践··

前端全栈项目的开发规范链:让 AI 写代码也有门禁

从本地 lint-staged、约定式提交,到 CI、PR 审阅与依赖更新,整理一条可复用的研发规范链,并说明如何给 AI 当上下文使用。

前言

一个产品往往对应多个仓库:后端 API、管理后台、用户前台。单靠口头约定,很难让协作者和 AI 保持一致。

更稳妥的做法是把规范拆成一条可执行的链——本地快检、远程 CI、PR 审阅、合并上线,每一环都有工具兜底。这篇文章分享的是这条链本身,不涉及具体业务。

你也可以把下文直接贴给 Cursor / Copilot 当上下文,减少「能跑但没 lint、没类型、没走 PR」的代码。


分支策略(建议)

多仓库可以统一采用 develop + main 双分支:

分支用途
develop日常开发、联调、测试环境
main生产发布,只通过 PR 合并

推荐流程:

本地开发 → commit → push develop
    → 在测试环境验证
    → 开 PR:develop → main
    → CI 全绿 + 看过 diff
    → 合并 → 生产更新

个别老仓库生产分支可能叫 master,思路一样,注意 PR 的 base 分支即可。


规范链总览

┌─────────────────────────────────────────────────────────┐
│ ① 本地                                                   │
│    lint-staged(暂存文件)+ commitlint(提交信息)          │
└──────────────────────────┬──────────────────────────────┘
                           │ push develop
                           ▼
┌─────────────────────────────────────────────────────────┐
│ ② 远程 develop                                           │
│    CI 全量:lint / typecheck / test / build              │
└──────────────────────────┬──────────────────────────────┘
                           │ 开 PR
                           ▼
┌─────────────────────────────────────────────────────────┐
│ ③ Pull Request                                           │
│    CI 再跑 + 自动 review + 人工看 diff(建议)            │
│    Test plan:手动验收清单                               │
└──────────────────────────┬──────────────────────────────┘
                           │ merge
                           ▼
┌─────────────────────────────────────────────────────────┐
│ ④ 生产 main                                              │
│    按各仓库既有发布方式更新                                │
└─────────────────────────────────────────────────────────┘

三条设计原则:

  • 本地要快:只检查本次改动的文件,避免每次 commit 跑全量 test。
  • 远程要严:CI 跑全量 lint、类型、测试、构建,作为合并门槛。
  • 测试与生产分离:develop 先验证,稳定后再 PR 到生产分支。

① 本地:提交前门禁

用 Husky 挂两个钩子:

钩子作用
pre-commitlint-staged,只处理暂存区文件
commit-msgcommitlint,强制约定式提交(如 feat:、fix:、ci:)

不同技术栈可以选不同格式化 / lint 工具,常见组合:

类型常见工具
Node 后端(Nest 等)ESLint + Prettier
React 管理端Biome,或 ESLint + Prettier
Next.js 前台ESLint + Prettier

刻意不在 pre-commit 做的: 全量 typecheck、test、build——这些交给 CI,避免本地提交卡顿。

另外可以提交共享的 .vscode/settings.json 与 extensions.json,统一保存时格式化;个人主题、字体等不要写进仓库。


② CI:push / PR 时的全量检查

触发时机: main / develop 的 push,以及指向这两者的 PR。

按仓库类型划分 job,思路一致,内容可按栈调整:

后端 API

Job典型内容
lint全量 ESLint
typechecktsc --noEmit
test单元测试(如 Jest)
build框架构建命令
e2e可选,独立 workflow

管理后台

Job典型内容
lintBiome / ESLint
typechecktsc
testVitest / Jest
build生产构建
coverage可选,独立 workflow

用户前台

Job典型内容
lintESLint
typechecktsc
buildnext build 等
test有则加,没有可后续补

要点: CI 是合并前的硬门槛,红灯不应被忽视。


③ PR:审阅与依赖更新

自动 Code Review(PR-Agent)

可在 PR 打开、更新时自动:

  • 给出 review 意见
  • 辅助生成 PR 描述

需要配置对应 LLM 的 API Key(如 DeepSeek、OpenAI 等),放在仓库 Secrets。

Dependabot

建议统一策略,避免和 Renovate 等工具重复:

  • 包管理器(npm / pnpm):定期检查,可忽略 patch、分组合并
  • GitHub Actions:定期检查 workflow 依赖

Test plan 是什么?

PR 模板里的 Test plan 是人工验收清单,不是自动测试,例如:

  • CI 全绿
  • 测试环境核心流程点过
  • 合并后生产环境关键项确认

合并前建议逐项勾选。

人工 Review

小团队或免费版 GitHub 往往开不了完整的分支保护,因此:

  • 可能无法强制「必须有人 Approve」
  • 可能无法从技术上禁止直推 main

这时更要靠流程习惯:走 PR、看 diff、CI 不过不合并。


给 AI 的协作约定

把下面几段放进对话,或写入仓库根目录的 AGENTS.md / CLAUDE.md,可显著减少「能跑但不符合项目规范」的代码。

必须遵守

  1. 提交信息使用约定式格式:feat: / fix: / chore: / ci: 等。
  2. 改完代码确保能通过该仓库的 lint 与 typecheck;有单测的仓库改动需考虑测试。
  3. 不要手改自动生成代码(如 OpenAPI client、ORM entity 生成物等),走项目规定的生成命令。
  4. 环境变量、密钥不要写进仓库。
  5. 合并到生产走 PR,并在 Test plan 里说明如何验证。

建议 AI 改完后的自检

按仓库 package.json 里的脚本跑一遍,常见组合:

npm run lint && npm run typecheck && npm run test && npm run build

有 monorepo 或多包时,在对应子包目录执行。

PR 描述建议结构

## Summary
- 改了什么、为什么

## Test plan
- [ ] CI 通过
- [ ] 测试 / 本地关键路径验证
- [ ] 合并后需确认的事项

常见薄弱项

诚实列出来,方便后续补强:

项目说明
分支保护免费版可能开不了,靠流程约束
强制 Approve小团队常未配置
前台单测很多项目初期没有,可逐步补
多仓库分支命名不一致main vs master,开 PR 时注意 base

小结

规范链不是 paperwork,而是分层门禁:

  • 本地 lint-staged 拦住低级格式问题;
  • CI 拦住类型、测试、构建;
  • PR + 自动 review 拦住设计疏漏;
  • 分支策略拦住「没测就上生产」。

把这篇文章或 AGENTS.md 交给 AI,等于告诉它:不仅要写出能跑的代码,还要写出能过门禁、能合并、能上线的代码。