前端工程化-代码提交规范 | 公司项目
前端工程化-代码提交规范 | 公司项目
分析和结论
原公司项目禁用了eslint对.js,.vue文件的eslint,所以使用lint-staged的意义不大。
主要可以做的工作在于commit提交规范;
大致步骤:
1 安装husky, 初始化 husky, 会在根目录创建 .husky 文件夹;
2 安装commitlint @commitlint/config-conventional,执行.husky/commit-msg初始化命令,并且需要配置commitlint.config.js;
3 此时,git commit 已经可以出发commitlint的相关规则了;
4 进一步做好命令行的提示,安装commitizen cz-conventional-changelog ,添加npm set-script commit “git-cz”脚本命令,初始化编写commit指令(npx commitizen init cz-conventional-changelog –save-dev –save-exact)
5 此时,命令行有提示流程了,根据相关rules进行提交commit了;
6 进一步自由度的定制化,则可以安装commitlint-config-cz,指定配置prompt文件。
tips:
如果使用webstorm,它有个插件叫git-commit-template可以界面化来引导你按规范提交代码。
如果开发工具是VSCode,就只能用commitizen这个工具在命令行进行提交了。
具体完整步骤
格式:Angular提交规范
Angular提交规范的格式很简单,基本尝试一次就能学会。若再有命令行工具的加持,可一直用一直爽!
Angular提交规范的格式包括Header、Body和Footer三个内容。Header为必填项,Body与Footer为可缺省项,这些内容通过以下结构组成一个完整的提交格式。
1 | <type>(<scope>): <subject> |
Header
该部分仅书写一行,包括三个字段,分别是type、scope和subject。
- type:用于说明commit的提交类型,必选
- scope:用于说明commit的影响范围,可选
- subject:用于说明commit的细节描述,可选
type用于说明commit的提交类型,包括以下选项,相信这些选项已满足日常95%的应用场景。当然这些选项无需刻意记忆,我会引入命令自动完成这些提交工作。
类型 | 功能 | 描述 |
---|---|---|
feat | 功能 | 新增功能,迭代项目需求 |
fix | 修复 | 修复缺陷,修复上一版本存在问题 |
docs | 文档 | 更新文档,仅修改文档不修改代码 |
style | 样式 | 变动格式,不影响代码逻辑 |
refactor | 重构 | 重构代码,非新增功能也非修复缺陷 |
perf | 性能 | 优化性能,提高代码执行性能 |
test | 测试 | 新增测试,追加测试用例验证代码 |
build | 构建 | 更新构建,改动构建工具或外部依赖 |
ci | 脚本 | 更新脚本,改动CI或执行脚本配置 |
chore | 事务 | 变动事务,改动其他不影响代码的事务 |
revert | 回滚 | 回滚版本,撤销某次代码提交 |
merge | 合并 | 合并分支,合并分支代码到其他分支 |
sync | 同步 | 同步分支,同步分支代码到其他分支 |
impr | 改进 | 改进功能,升级当前功能模块 |
scope用于说明commit的影响范围。简要说明本次改动的影响范围,例如根据功能可划分为数据层、视图层和控制层,根据交互可划分为组件、布局、流程、视图和页面。从Angular以往的提交说明来看,还是建议你在提交时对scope补全。
subject用于说明commit的细节描述。文字一定要精简精炼,无需太多备注,因为Body部分可备注更多细节,同时尽量遵循以下规则。
- 以动词开头
- 使用第一人称现在时
- 首个字母不能大写
- 结尾不能存在句号(.)
例如本次提交说明的subject的中文是改变按钮的颜色,根据上述规则转换为英文就是change the color of the button。
理解好Header三个字段各自含义,每次提交说明通过上述规范的约束就变成以下模样。
1 | feat(View): 新增主题皮肤切换按钮 |
Body
该部分可书写多行,对subject做更详尽的描述,内容应包括改动动机与改动前后对比。
Footer
该部分只适用两种情况,分别是不兼容变动与问题关闭。
- 不兼容变动:当前代码与上一版本不兼容,则以BREAKING CHANGE开头,关联变动描述、变动理由和迁移方法
- 问题关闭:当前代码已修复某些Issue,则以Closes开头,关联目标Issue
方案:部署Git的提交格式化
理解Angular提交规范的格式后,就能在每次提交时书写标准的提交说明了,同时使用专业工具做专业事情,能输出更高质量的提交说明。接着介绍两个专业工具该如何配置与部署。
commitizen
每次执行git commit命令时,需根据上述规范整理提交说明的格式,但提交说明本身并不是项目开发的必须项, 所以可巧借工具完成提交规范。
因为当前目标还要通过工具生成与约束提交说明,而commitizen是一个基于模板驱动的约束规范工具,可扩展性很强,因此推荐使用commitizen。
使用commitizen的git cz命令可代替原生的git commit命令,帮助开发者生成符合规范的提交说明。在此还需指定一个符合Angular提交规范的书写配置cz-conventional-changelog,使得commitizen根据指定规范帮助开发者生成提交说明。
commitizen与cz-conventional-changelog可全局部署也可局部部署,如何选择只能根据实际情况了。
全局部署
全局安装commitizen与cz-conventional-changelog。
1 | npm i -g commitizen cz-conventional-changelog |
不同系统中创建.czrc文件,具体情况如下,加入以下内容。
- Windows系统:在C:/Users/$USER目录中创建.czrc文件
- MacOS系统:在~目录中创建.czrc文件
1 | { "path": "cz-conventional-changelog" } |
局部部署
局部安装commitizen与cz-conventional-changelog。
1 | npm i -D commitizen cz-conventional-changelog |
在package.json中指定scripts与config。
1 | { |
使用上述两种方式配置好commitizen,就能使用git cz或npm run commit代替git commit了,依次完成所有步骤就能规范地提交了。
自定义规范
可能Angular提交规范的某些情况不适合当前需求,可通过cz-customizable制定一份符合自己团队的提交规范。
基于上述全局部署与局部部署,以下配置也有些许不同。
对于全局部署,全局安装cz-customizable,在.czrc中重新指定path。
1 | npm i -g cz-customizable |
1 | { "path": "cz-customizable" } |
对于局部部署,局部安装cz-customizable,在package.json中重新指定config。
1 | bash |
1 | json |
不同系统中创建.cz-config.js文件,具体情况如下,制定一份符合自己团队的提交规范。为了方便理解,我将原来英文版的commit type改成中文版的commit type并增加几个type。
- 在Windows系统全局部署:在C:/Users/$USER目录中创建.cz-config.js文件
- 在MacOS系统中全局部署:再~目录中创建.cz-config.js文件
- 在项目中局部部署:在根目录中创建.cz-config.js文件
commitlint
除了规范地书写提交说明,还需借助commitlint规范地校验提交说明。commitlint的校验标准较严格,只要不符合规范的提交说明就直接拒绝。
同commitizen一样,commitlint也需一套校验配置。当然还是推荐与Angular提交规范相关校验配置@commitlint/config-conventional。然而我暂时还未能实践出commitlint的全局部署,所以目前只能参照官网实现局部部署了。
局部安装@commitlint/cli与@commitlint/config-conventional。
1 | bash |
在根目录中创建.commitlintrc.js文件,加入以下内容。
1 | js |
当然也能像commitizen那样自定义校验规范。可能Commitlint校验规范的某些情况不适合,可通过commitlint-config-cz制定一份符合自己团队的校验规范。
局部安装commitlint-config-cz。
1 | bash |
在.commitlintrc.js中重新指定extends与rules
1 | js |
husky
当您提交或推送时,您可以使用 husky 来检查您的提交消息、运行测试、检查代码等Husky 支持所有 Git 钩子。
How it works
以一种非常 Linux 的方式,要配置 Git 挂钩,您只需将可执行文本文件放入.git/hooks/, 为了能够运行用户在 .huskyrc.js中创建的任何 Git 钩子,husky 正在将所有可能的钩子安装在.git/hooks/.
例如,当提交时,每个 Git 钩子都会检查是否有相应的钩子定义.huskyrc.js:
1 | $ git commit |
它的好处:用户可以添加、更新和删除钩子,.huskyrc.js并且会自动选择更改。
不利的一面是,即使没有任何东西可以运行,节点也会启动。
【代码检测】lint-staged | husky 提交代码前的检查和修复指定文件
lint-staged 是一个用于在提交代码前检查和修复指定文件的工具。它可以帮助你在提交代码时只对修改的文件进行代码规范检查,而不是全量检查整个项目。(新版本的有点问题,建议使用@13.2.3)
基本使用:(可结合husky)
方式1:
安装代码校验依赖
1 | bash |
- 初始化 husky, 会在根目录创建 .husky 文件夹
1 | bash |
- pre-commit 执行 npx lint-staged 指令
- 根目录创建 .lintstagedrc.json 文件控制检查和操作方式
1 | json |
tips
- 对于 .js、.jsx、.ts 和 .tsx 文件:
- prettier –write .:将使用 Prettier 对这些文件进行格式化,并将更改写回到文件中。
- eslint –fix:将使用 ESLint 对这些文件执行代码规范检查,并尝试自动修复一些问题。
- 对于 .md 文件:
- prettier –write:将使用 Prettier 对 Markdown 文件进行格式化,并将更改写回到文件中。
具体而言,当你提交代码时,lint-staged 将会遍历暂存区中的文件,并根据配置来执行相应的命令。对于匹配配置中指定的文件类型的文件,lint-staged 将按顺序运行预定义的操作。
例如,如果你对一个 index.js 文件进行了修改并将其添加到 Git 暂存区,当你提交代码时,lint-staged 将按照顺序执行以下操作:
- 使用 Prettier 对 index.js 进行格式化,并将更改写回到文件中。
- 使用 ESLint 对 index.js 执行代码规范检查,并尝试自动修复一些问题。
同样地,对于一个 README.md 文件的修改,提交代码时,lint-staged 将使用 Prettier 对其进行格式化,并将更改写回到文件中。
注意:如果你想在项目中使用 prettier –write 命令,你需要确保项目中安装了 Prettier 的依赖。
方式2:
自动配置 husky
1 | yarn add husky --dev # must install |
它将设置 husky,修改package.json并创建一个pre-commit您可以编辑的示例挂钩。默认情况下,它将npm test在您提交时运行。 例如:
把示例 npm test 修改成 yarn lint-staged 或者 您自己定义的命令
在 package.json中添加 lint-staged命令
1 | "lint-staged": "lint-staged --allow-empty", |
例如
在 git commit 的时候,就会触发 .husky/pre-commit 文件下 的命令行 yarn lint-staged或者 您自己定义的命令
在检查代码成功的时候会自动格式化代码然后帮您提交,如果检测到错误就会停止提交并告知错误行,及时改正后可以再次提交
例如
当我git commit时,它会自动检测到不符合规范的代码,如果无法自主修复 则会抛出错误文件给您!
在此之前,配置好 eslint 和 prettier 是有必要的
执行结果:
commit前会有告警报错:
【commit提交检测】commitlint | @commitlint/config-conventional
- 安装,并初始化文件:
1 | npm i commitlint @commitlint/config-conventional -D |
(注意node版本的匹配)
tipsnpx 是随 Node.js 一起发布的一个用来执行 Node 包里的可执行文件的工具。它的作用类似于直接运行全局安装的 npm 包中的可执行文件,但是它可以临时安装并执行这些包,而不需要将它们作为全局依赖进行安装。
使用 npx 可以方便地运行项目依赖中的命令,而无需手动安装这些依赖。例如,你可以通过以下方式使用 npx 来执行在项目依赖中的可执行文件:
1 | bashCopy Codenpx some-package |
这将会临时安装 some-package,然后执行它的默认可执行文件。
另外,npx 还可以用来执行本地安装的 npm 包中的命令,例如:
1 | bashCopy Codenpx eslint --version |
上面的命令将会执行当前目录下安装的 eslint 包,并显示它的版本号。
总之,npx 提供了一种便捷的方式来运行项目依赖中的命令,而无需显式地安装这些依赖。
- @commitlint/config-conventional 这是一个规范配置,标识采用什么规范来执行消息校验, 这个默认是_Angular_的提交规范
类型 | 描述 |
---|---|
build | 编译相关的修改,例如发布版本、对项目构建或者依赖的改动 |
chore | 其他修改, 比如改变构建流程、或者增加依赖库、工具等 |
ci | 持续集成修改 |
docs | 文档修改 |
feat | 新特性、新功能 |
fix | 修改bug |
perf | 优化相关,比如提升性能、体验 |
refactor | 代码重构 |
revert | 回滚到上一个版本 |
style | 代码格式修改, 注意不是 css 修改 |
test | 测试用例修改 |
1 | npx husky add .husky/commit-msg 'node [dir]/filename.js' # 指定目录文件 |
需要配置commitlint.config.js:
新增commitlint.config.js:
1 | module.exports = { |
这样在git提交commit的时候就可以做rules的校验了。
此外,这里的prompt的可以为命令行中做提交提示:需要安装相关依赖【但发现用不了了提示,使用下面的commitizen cz-conventional-changelog】
IDE插件
如果使用webstorm,它有个插件叫git-commit-template可以界面化来引导你按规范提交代码。
如果开发工具是VSCode,就只能用commitizen这个工具在命令行进行提交了。
安装辅助提交依赖:(用于命令行提交的时候的辅助提示)
1 | npm i commitizen cz-conventional-changelog -D |
- 安装指令和命令行的展示信息
1 | npm set-script commit "git-cz" # package.json 中添加 commit 指令, 执行 `git-cz` 指令 |
(不行就手动添加)
- 初始化编写commit指令
1 | npx commitizen init cz-conventional-changelog --save-dev --save-exact |
or:
1 | yarn commitizen init cz-conventional-changelog --yarn --dev --exact |
- 初始化命令行的选项信息,不然没有选项
- 此时已经可以根据提示和rules进行提交commit了:
自定义提交规范(可选)
1 | npm i -D commitlint-config-cz cz-customizable |
- 变更 commitlint.config.js ,这里采用自己定义的规范,将会覆盖上面那个,所以上面那个可以不用安装
- 增加 .cz-config.js
1 | 'use strict' |
- package.json 中,将原来commit配置,变更为自定义配置
- 然后提交会变成这样