代码规范与静态检查
【摘要】 代码规范与静态检查规范的意义不是统一审美,而是把「这类争论」一次性解决掉,让代码评审聚焦逻辑而不是分号。 一、规范分层:哪些该管,哪些别管层次例子处理方式格式缩进、引号、尾逗号、行宽工具自动格式化,人不要讨论风格命名、文件组织、导出方式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)