代码规范与静态检查

举报
miracle_dai 发表于 2026/11/11 07:32:16 2026/11/11
【摘要】 代码规范与静态检查规范的意义不是统一审美,而是把「这类争论」一次性解决掉,让代码评审聚焦逻辑而不是分号。 一、规范分层:哪些该管,哪些别管层次例子处理方式格式缩进、引号、尾逗号、行宽工具自动格式化,人不要讨论风格命名、文件组织、导出方式lint 规则 + 团队约定设计模块边界、错误处理、抽象层次代码评审,工具管不了架构依赖方向、分层、跨模块调用设计评审 + 依赖检查工具一条实用原则:能用工...

代码规范与静态检查

规范的意义不是统一审美,而是把「这类争论」一次性解决掉,让代码评审聚焦逻辑而不是分号。

一、规范分层:哪些该管,哪些别管

层次 例子 处理方式
格式 缩进、引号、尾逗号、行宽 工具自动格式化,人不要讨论
风格 命名、文件组织、导出方式 lint 规则 + 团队约定
设计 模块边界、错误处理、抽象层次 代码评审,工具管不了
架构 依赖方向、分层、跨模块调用 设计评审 + 依赖检查工具

一条实用原则:能用工具自动修的,绝不写进评审意见。评审意见里出现「这里多了一个空格」,说明工具链没配好。

二、Node / TypeScript 项目的推荐工具链

// package.json(片段)
{
  "scripts": {
    "lint": "eslint . --max-warnings=0",
    "format": "prettier --write .",
    "typecheck": "tsc --noEmit"
  },
  "lint-staged": {
    "*.{ts,tsx,vue,js}": ["eslint --fix", "prettier --write"],
    "*.{json,md,css}": ["prettier --write"]
  }
}
// .eslintrc.cjs 关键规则思路(示意)
module.exports = {
  rules: {
    'no-console': ['warn', { allow: ['warn', 'error'] }],
    'eqeqeq': ['error', 'always', { null: 'ignore' }],
    '@typescript-eslint/no-floating-promises': 'error',
    '@typescript-eslint/no-explicit-any': 'warn'
  }
};

@typescript-eslint/no-floating-promises 这类规则的价值远高于「缩进 2 还是 4」:它能直接拦住未 await 的异步调用这类真实线上故障源。

三、四道门禁

门禁 时机 拦截内容
编辑器 保存时 格式、明显语法错误
pre-commit 提交前 lint、格式化、密钥扫描
CI 推送后 typecheck、单测、构建、依赖漏洞
分支保护 合入前 上述全绿 + 至少一人评审

提交前钩子用 husky + lint-staged 即可,只检查暂存文件,否则大仓库里每次提交格式化全项目会让人抓狂。

四、命名与组织的实用约定

  • 布尔值用 is / has / should 开头:isExpired、hasPermission。
  • 函数名体现动作与对象:fetchUserOrders 而非 getData。
  • 常量替代魔法值:ORDER_EXPIRE_MINUTES = 30,别在代码里散落 30。
  • 一个文件一个主要职责;工具函数放 utils/,且不要造万能 common.ts 垃圾抽屉。
  • 目录按业务域划分优先于按技术类型划分:orders/ 下放自己的 service、dto、test,胜过全局 services/ 堆 200 个文件。
  • 注释写「为什么」,不写「是什么」:// 兼容旧客户端未传时区,默认按 UTC+8 处理 有价值,// 循环订单 没有。

五、错误处理里最该被 lint 拦住的写法

// ❌ 吞掉异常,线上出问题时毫无痕迹
try { await save(order); } catch (e) {}

// ❌ 空 catch + 只有 console.log,日志进不了采集系统
catch (e) { console.log(e); }

// ✅ 保留上下文、交给统一错误处理
catch (e) {
  logger.error('order.save_failed', { orderId: order.id, err: e });
  throw new BizError('ORDER_SAVE_FAILED', { cause: e });
}

建议把「空 catch 块」「Promise 未处理拒绝」「直接对 any 取属性」列为 error 级规则。

六、常见坑与对策

坑 对策
一次性引入全套严格规则,几千条报错 先开 5~10 条高价值规则,存量用基线文件(eslint baseline)豁免,增量从严
规范和 formatter 打架 关掉 ESLint 里所有格式类规则,交给 Prettier
CI 与本地结果不一致 锁定依赖版本、把 node 版本写进 .nvmrc / engines、容器化 CI
规则没人维护 每条规则的增删走一次简短评审,并在配置文件里注明原因
--no-verify 成为日常操作 查原因:多半是钩子太慢或误报太多

七、落地检查清单

  • [ ] 保存即格式化,提交即 lint,CI 即全量检查
  • [ ] 格式类规则与逻辑类规则分开,不互相覆盖
  • [ ] 开启类型检查(tsc --noEmit)并纳入 CI
  • [ ] 有密钥 / 敏感信息提交扫描
  • [ ] 规范文档只有一页,且链接到可执行的配置文件

八、小结

好的规范让人几乎感觉不到它的存在:写完代码保存,格式自动好了;提交时两条真正危险的规则拦住了隐患;评审会上大家只在讨论「这个抽象合不合理」。反过来,如果团队每周都在争论引号,那不是人的问题,是工具链缺位。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。