独立产品代码评审该看哪些细节
线上突发报警,一个并不复杂的支付回调接口在处理第三方请求时全线挂起。查了半天日志,根因居然是一行看起来人畜无害的代码:await fetch(paymentUrl)。由于没有显式设置 Timeout 超时时间,当第三方网关遇到高延迟时,这个请求无限期挂起,直接抽干了后端的 Worker 线程池。
独立开发者或小团队由于缺少大厂层层把关的专职 QA 部门,“代码评审(Code Review)”往往沦为随便扫一眼就点 Approve 的形式主义。然而,线上 80% 的致命故障——无 Timeout 的 HTTP 请求、未释放的数据库连接、并发竞态下的全局变量污染——全都隐藏在这些看似正常的代码细节里。要把想法安全地变成稳健上线的服务,应建立起一套自动化工程门禁与死角审查清单。
质量门禁与 CR 多重拦截体系
依靠人眼检查细节极不可靠。应将可量化的质量规则下沉到 Git Hooks 与 CI 流水线中,人眼 CR 只聚焦在架构逻辑与边界设计上:
命令行工程诊断:自动化抓出隐蔽的代码隐患
在代码审查前,可以通过命令行与静态分析工具对仓库进行全面体检:
# 1. 静态扫描:查找代码库中所有未加 Timeout 的 fetch 或 axios 调用 grep -rn "fetch(" src/ | grep -v "signal" # 2. 运行 ESLint 严格模式,检查未处理的 Promise 与类型安全问题 npx eslint --ext .ts,.tsx src/ --max-warnings 0 # 3. 检查依赖包中的已知高危漏洞 npm audit --audit-level=high # 4. 统计最近 10 次提交的代码改动规模,防止过大的 PR 导致审查失效 git log --oneline -n 10 --stat简单的诊断脚本就撕开了代码的伪装:静态扫描直接揪出了 6 处未经AbortController保护的远程 HTTP 调用。如果不经过自动化门禁拦截,这些漏洞一旦上了生产环境,遇到网络抖动就是一场雪崩。
可落地的 AST 代码审查插件与 CI 门禁实现
人眼容易疲劳,但 AST(抽象语法树)静态检查从不撒谎。下面是基于 ESLint 自定义的工程质量门禁插件代码,强制要求所有 HTTP 请求应传入超时信号:
import { Rule } from 'eslint'; // 自定义 ESLint 规则:强制要求 fetch 调用应包含 signal/timeout 选项 const FetchTimeoutRule: Rule.RuleModule = { meta: { type: 'problem', docs: { description: 'Enforce timeout control (AbortSignal) on all fetch API calls to prevent thread hanging.', category: 'Possible Errors', recommended: true, }, messages: { missingSignal: 'SECURITY RISK: fetch() call is missing Timeout control. Pass an AbortSignal to options.', }, }, create(context) { return { CallExpression(node: any) { // 匹配 fetch(...) 函数调用 if (node.callee.type === 'Identifier' && node.callee.name === 'fetch') { const args = node.arguments; // 如果只有 1 个参数,说明完全没有传 options 配置项 if (args.length < 2) { context.report({ node, messageId: 'missingSignal' }); return; } const optionsArg = args[1]; // 校验 options 是否包含 signal 属性 if (optionsArg.type === 'ObjectExpression') { const hasSignal = optionsArg.properties.some( (prop: any) => prop.key && (prop.key.name === 'signal' || prop.key.value === 'signal') ); if (!hasSignal) { context.report({ node, messageId: 'missingSignal' }); } } } }, }; }, }; export default FetchTimeoutRule;独立开发者审查清单避坑公约
在产品从 MVP 走向商业化的全流程中,代码评审应盯紧这四项关键细节:
- 异步资源应显式释放:所有的 EventSource 连接、Timer 定时器、数据库 Client 句柄,应在
finally块或 ReactuseEffect清理函数中显式关闭。 - 并发写操作应加锁/事务:涉及账户余额、库存扣减、状态修改的逻辑,应校验数据库悲观/乐观锁,严禁在内存中做非原子更新。
- 日志绝对禁止打印敏感信息:代码审查应死盯
console.log,严禁将用户的 Token、密码、密钥以及个人隐私明文写进日志文件。
把重复的细节交给静态检查门禁,把精力的聚焦留给业务逻辑。守住了代码评审的质量门禁,才能守住产品线的安全生命线。