关于如何规范前端团队代码

693 阅读4分钟

规范,是指群体所确立的行为标准,是一个企业内部各个工作岗位、各个 工作流程明文规定的标准,是我们工作中的行为准则。

前端规范的目的

规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快乐的。

现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。 —— 《阿里规约》

如何保证前端代码规范

我们都知道项目中中都会存在一定的规范,但是一半代码的规范具体表现在哪些部分呢。其实在我的理解中,大致分为两个部分。一是代码层级规范化;二是通过前端工程化实现规范化。

代码约束实现前端代码规范化

其实这个是比较好理解的,就是在我们写代码的时候,我们需要知道我们到底在写什么。可以通过规范化文档去实现我们的代码。

以我最近的项目为例,类似于HTML,CSS规范之类的这里就不再多描述

文件

项目文件夹/静态资源命名

全部采用小写并以中划线分隔。

正例:biz-module

反例:bizModule or biz_module

自定义组件

统一使用大驼峰命名

正例:BizModule

反例:bizModule or biz_module

页面模块

统一使用小驼峰命名

正例:bizModule

反例:BizModule or biz_module

代码

异步请求

统一使用async/await

正例: await getUserData() 反例: getUserData().then(res => {})

自定义样式

对于less文件覆盖umi样式,统一使用adm-*为前缀;自定义样式使用com-*为前缀

例子:

// 覆盖类样式,依然使用 .adm- 前缀 .adm-button { ... }

// 覆盖叠加类样式,使用 .com- 前缀 .adm-nav-bar.com-nav-bar-immersive { ... }

// 公共自定义样式,使用 .com- 前缀 .com-test { ... }

常量

统一使用全大写并有下划线连接

正例: CONST_VALUE 反例: const_value/constValue

工程化

ESLint

可组装的JavaScript和JSX检查工具

具体文档可参考ESLint中文文档:eslint.cn/

ESLint是一个组装的Js和JSX工具。这是官网上的一句话。在项目中,主要目的是提示代码的格式是否符合lint config匹配文件。可以依赖代码工具进行代码检查.

配置文件格式:

module.exports = {
  extends: ['default/eslint-config-loan/react-typescript'],
  rules: {
    '@typescript-eslint/strict-boolean-expressions': 0,
    'no-redeclare': 0
  },
  parserOptions: {
    project: './tsconfig.json'
  },
  env: {
    browser: true,
    es6: true,
    jest: true
  }
}

Prettier

Prettier 主要是配合ESLint对代码进行自动的格式化处理。同时也会统一由于不同IDE导致缩进的问题。

我们会在package.json中配置prettier命令

"prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",

Git Commit

对于代码的提交,我们需要去验证代码是否符合Lint规范和正确的commit信息。精确的commit信息也会帮助我们理解每个提交是具体做了什么事情。

在package.json中,我们会配置如下命令

  "gitHooks": {
    "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS",
    "pre-commit": "lint-staged"
  },
  "lint-staged": {
    "*.{js,jsx,less,md,json}": [
      "prettier --write"
    ],
    "*.ts?(x)": [
      "prettier --parser=typescript --write"
    ]
  },

额外

这里其实没有具体规范,可以用来当作参考。

get 获取/set 设置,
add 增加/remove 删除
create 创建/destory 移除
start 启动/stop 停止
open 打开/close 关闭,
read 读取/write 写入
load 载入/save 保存,
create 创建/destroy 销毁
begin 开始/end 结束,
backup 备份/restore 恢复
import 导入/export 导出,
split 分割/merge 合并
inject 注入/extract 提取,
attach 附着/detach 脱离
bind 绑定/separate 分离,
view 查看/browse 浏览
edit 编辑/modify 修改,
select 选取/mark 标记
copy 复制/paste 粘贴,
undo 撤销/redo 重做
insert 插入/delete 移除,
add 加入/append 添加
clean 清理/clear 清除,
index 索引/sort 排序
find 查找/search 搜索,
increase 增加/decrease 减少
play 播放/pause 暂停,
launch 启动/run 运行
compile 编译/execute 执行,
debug 调试/trace 跟踪
observe 观察/listen 监听,
build 构建/publish 发布
input 输入/output 输出,
encode 编码/decode 解码
encrypt 加密/decrypt 解密,
compress 压缩/decompress 解压缩
pack 打包/unpack 解包,
parse 解析/emit 生成
connect 连接/disconnect 断开,
send 发送/receive 接收
download 下载/upload 上传,
refresh 刷新/synchronize 同步
update 更新/revert 复原,
lock 锁定/unlock 解锁
check out 签出/check in 签入,
submit 提交/commit 交付
push 推/pull 拉,
expand 展开/collapse 折叠
begin 起始/end 结束,
start 开始/finish 完成
enter 进入/exit 退出,
abort 放弃/quit 离开
obsolete 废弃/depreciate 废旧,
collect 收集/aggregate 聚集

结束语

2022.1.28

木更