javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 前端项目commits changelog规范

如何使用工具规范前端项目的commits与changelog技巧

作者:Super_x

这篇文章主要为大家介绍了如何使用工具规范前端项目的commits与changelog技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

项目的 Changelog 文件作为记录版本之间的差异和变更的主要“公示板”,主要用于传达一些关键的变更和指南,是直接与使用者对话的一种形式,所以 changelog 文件的整洁、直观一直是衡量一个项目质量的重要指标。

而且在我们翻阅一些组件库或者开源框架的 changelog 变动页的时候,经常看到一些项目的整齐、直观、井井有条如下面示例。这样的 log 日志必然不是手动排版出来的,大部分都是根据 commit 的描述自动生成的。

那么它们是如何配置,或者使用了什么工具包呢?想必大家都比较好奇。接下来我们就来一步一步揭开它神秘的面纱,并一步步的配置我们的组件库的 commit 规范,使我们的 commit 和 changelog 文件也能如此优雅。

示例一:semi 的 changelog 文件

示例二:antd 的 github changelog

Conventional Commits 规范

要保持 commit 信息的可读性,一个合理的 commit 格式规范是必不可少的,而 Conventional Commits 就是一种基于提交消息的轻量级约定。官方是这样描述它的:

它提供了一组用于创建清晰的提交历史的简单规则; 这使得编写基于规范的自动化工具变得更容易。 这个约定与SemVer相吻合, 在提交信息中描述新特性、bug 修复和破坏性变更。 --- Conventional Commits 官网

由此可以看出 Conventional Commits 是一个非常友好且清晰的规范,那遵循它的好处有哪些? 我们来进行一个总结:

那么 Conventional Commits 规则到底是如何的呢,我们接着往下看。通过官网的文档可以发现,它提交说明的结构如下所示:

<类型>[可选的作用域]: <描述>
[可选的正文]
[可选的脚注]
举例:
fix(docs): 修复文档中字符错误
feat(components): tooltip 组件初始化

可以看到,结构里面包含类型、作用域、描述、正文、脚注。

对于简短描述的扩充填写,可选

可以看出 Conventional Commits 规范非常高效且上手难度很低,并且 Conventional Commits 已经被很多知名的开源项目所集成,是一个被大家广泛接受的标准。而我们的组件库也需要遵循它来规范我们的 commit。

要如何遵循此规范呢?用插件来约束我们的 commit 是一个比较好的解决方案。接下来,我们来看下有哪些插件可以让我们愉快的使用。

哪些工具可以组合起来规范我们的 commit?

Commitizen

上面我们说到了 Conventional Commits 规范,我们要遵循此规范时,可能手动去处理 commit 信息会比较繁琐,并且出错率也很高,比如在我们书写 fix(scope): xxx 时,很容易对于符合的全角还是半角输入法搞混,这样很容易造成信息格式化的失败。那么我们该如何高效稳定的遵循 Conventional Commits 规范呢?Commitizen 应声而来。

Commitizen 可以说是一个交互性日志提交工具,用于辅助开发者提交符合规范的 commit 信息。它可以说是提供了“保姆式”的提交体验,在我们触发 commit 的脚本后,只需要根据提示来选择我们的提交信息,就可以生成一个符合规范的 commit。

? Select the type of change that you're committing: (Use arrow keys)
❯ feat:     A new feature 
  fix:      A bug fix 
  docs:     Documentation only changes 
  style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) 
  refactor: A code change that neither fixes a bug nor adds a feature 
  perf:     A code change that improves performance 
  test:     Adding missing tests or correcting existing tests 
(Move up and down to reveal more choices)

cz-customizable

cz-customizable 作为一个用于自定义 Commitizen 的扩展插件,可以在原生 Commitizen 的标准上,根据配置文件来自定义我们的提交规范。可以说是用来扩展 Commitizen 的神器。一般都用于 Commitizen 的配套使用。

? 选择一种你的提交类型: (Use arrow keys)
❯ feat 🍄:    新增新的特性 
  fix 🐛:    修复 BUG 
  docs 📄:    修改文档、注释 
  refactor 🎸:    代码重构,注意和特性、修复区分开 
  perf ⚡:    提升性能 
  test 👀:    添加一个测试 
  tool 🚗:    开发工具变动(构建、脚手架工具等) 
(Move up and down to reveal more choices)

commitlint

commitlint 用来校验检查我们的提交 commit 是否符合conventional commit format。类似于 eslint,commitlint 可以根据我们的配置文件或者默认的选项值来校验我们的 commit 信息,不通过的校验会被直接打回。

standard-version

standard-version 是一款遵循语义化版本(semver)和 commit message 标准规范的版本自动化工具,它还可以使生成 changelog 自动化。并且将我们符合 Conventional Commits 规范的提交信息格式化,并完成以下操作:

总体来说,它帮助我们自动化的进行了发版所需要的步骤,并且根据 commit 信息,生成 log 日志。这样我们就只需要专注于我们的逻辑开发,其他的都可以交给 standard-version 去完成。

以上是我们规范 commit 信息、根据提交的 commit 信息自动化更新 changelog、发版等一条龙服务所必须用到的插件。经过简单的熟悉后,我们来进行实际的配置,让我们组件库的 commit 优美起来。

安装配置

俗话说的好,动手是第一生产力。接下来我们将一步步安装配置我们的 commit 规范。

1. 安装 commitizen 和 cz-customizable

pnpm install -D commitizen cz-customizable

在最外层 package.json 文件中添加脚本命令和配置项,使 commitizen 使用cz-customizable 插件。

{
  ...
  "scripts" : {
    ...
    "commit": "git cz"
  }
  ...
  "config": {
    "commitizen": {
      "path": "cz-customizable"
    }
  }
}

接下来在根目录新建 .cz-config.js 文件,并加入我们的汉化配置。

 // .cz-config.js module.exports = {
    types: [
        { value: "feat", name: "feat 🍄:    新增新的特性" },
        { value: "fix", name: "fix 🐛:    修复 BUG" },
        { value: "docs", name: "docs 📄:    修改文档、注释" },
        { value: "refactor", name: "refactor 🎸:    代码重构,注意和特性、修复区分开" },
        { value: "perf", name: "perf ⚡:    提升性能" },
        { value: "test", name: "test 👀:    添加一个测试" },
        { value: "tool", name: "tool 🚗:    开发工具变动(构建、脚手架工具等)" },
        { value: "style", name: "style ✂:    对代码格式的修改不影响逻辑" },
        { value: "revert", name: "revert 🌝:     版本回滚" },
        { value: "update", name: "update ⬆:    第三方库升级 " }
    ],
    scopes: [{ name: '组件' }, { name: '样式' }, { name: '文档更改' }, { name: '其它变更' }],
    allowTicketNumber: false,
    isTicketNumberRequired: false,
    ticketNumberPrefix: 'TICKET-',
    ticketNumberRegExp: '\d{1,5}',
    messages: {
        type: "选择一种你的提交类型:",
        scope: "选择一个scope (可选):",         
        customScope: "Denote the SCOPE of this change:",
        subject: "简要说明:\n",
        body: '详细说明,使用"|"换行(可选):\n',
        breaking: "非兼容性说明 (可选):\n",
        footer: "关联关闭的issue,例如:#31, #34(可选):\n",
        confirmCommit: "确定提交?"
    },
    allowCustomScopes: true,
    allowBreakingChanges: ['新增', '修复'],     subjectLimit: 100   };

配置好后我们先进行测试:npm run commit ,得出下面结果:

All lines except first will be wrapped after 100 characters.
? 选择一种你的提交类型: (Use arrow keys)
❯ feat 🍄:    新增新的特性 
  fix 🐛:    修复 BUG 
  docs 📄:    修改文档、注释 
  refactor 🎸:    代码重构,注意和特性、修复区分开 
  perf ⚡:    提升性能 
  test 👀:    添加一个测试 
  tool 🚗:    开发工具变动(构建、脚手架工具等) 

说明配置完成,我们可以接着往下进行。

2. 安装 commitlint

pnpm install -D commitlint-config-cz @commitlint/cli yorkie

在 package.json 中的 husky hook 中添加每次 commit 信息的校验回调。

ps:没有安装 husky 的先自行安装 pnpm install -D husky

{
"husky": {
    "hooks": {
      "commit-msg": "commitlint -e -V",
    }
  }
}

在根目录构建 commitlint.config.js 文件,进行 commitlint 的配置。

module.exports = {
  extends: ['cz'],
  parserPreset: {
    parserOpts: {
      headerPattern: /^(.*?)((.*?)):\s?(.*)$/,
      headerCorrespondence: ['type', 'scope', 'subject'],
    },
  },
  rules: {
    'type-empty': [2, 'never'],
    'subject-empty': [2, 'never'],
  },
};

接下来我们实验一下,提交一个空内容。

? 选择一种你的提交类型: feat 🍄:    新增新的特性
? 选择一个scope (可选): 其它变更
? 简要说明:
➜  sten-design git:(master) ✗ git commit -m 'feat' 
husky &gt; commit-msg (node v14.17.0)
⧗   input: feat
✖   type may not be empty [type-empty]
✖   subject may not be empty [subject-empty]
✖   found 2 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint
husky &gt; commit-msg hook failed (add --no-verify to bypass)

会报错,说明我们的 commitlint 已经生效。

3. 安装 standard-version

pnpm install -D standard-version

配置脚本。

 // package.json
{
  "scripts": {
    "release": "standard-version"
  }
}

增加 .versionrc.js 文件来格式化 log ,使我们的 changelog 根据 Conventional Commits 规范更加语义化。

module.exports = {
    "types": [
      { "type": "feat", "section": "✨ Features | 新功能" },
      { "type": "fix", "section": "🐛 Bug Fixes | Bug 修复" },
      { "type": "init", "section": "🎉 Init | 初始化" },
      { "type": "docs", "section": "✏️ Documentation | 文档" },
      { "type": "style", "section": "💄 Styles | 风格" },
      { "type": "refactor", "section": "♻️ Code Refactoring | 代码重构" },
      { "type": "perf", "section": "⚡ Performance Improvements | 性能优化" },
      { "type": "test", "section": "✅ Tests | 测试" },
      { "type": "revert", "section": "⏪ Revert | 回退" },
      { "type": "build", "section": "📦 Build System | 打包构建" },
      { "type": "update", "section": "🚀 update | 构建/工程依赖/工具升级" },
      { "type": "tool", "section": "🚀 tool | 工具升级" },
      { "type": "ci", "section": "👷 Continuous Integration | CI 配置" }
    ]
  }

先提交一个 commit 再测试:

然后我们再执行 yarn release 升级版本:

yarn run v1.22.11
$ standard-version
✔ bumping version in package.json from 0.0.1 to 0.0.2
✔ created CHANGELOG.md
✔ outputting changes to CHANGELOG.md
✔ committing package.json and CHANGELOG.md
husky &gt; commit-msg (node v14.17.0)
⧗   input: chore(release): 0.0.2
✔   found 0 problems, 0 warnings
✔ tagging release v0.0.2
ℹ Run `git push --follow-tags origin master` to publish
✨  Done in 2.79s.

我们再看下 CHANGELOG.md 文件:

# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.1.1]( https://github.com/fanshyiis/sten-design/compare/v0.0.8...v0.1.1) (2022-02-12)
### 🚀 tool | 工具升级
* **其它变更:** 测试 commit 信息 ([6446270](https://github.com/fanshyiis/sten-design/commit/64462708008fa863abcfc026191fe20499f586f8))
### ✨ Features | 新功能
* **组件:** 我是一个新功能 ([9b9d30f](https://github.com/fanshyiis/sten-design/commit/9b9d30f7bac36b9b8c6e4786be45031cea6bfba6))

和具体 Git 上展示效果:

总结

在 Conventional Commits 和一系列组件的约束下,可以使我们的 changelog 文件更加直观、优美。并且,全自动化的配置,也不需要我们过多的关注,只需要用心写好每一个 commit 的描述信息即可。

以上就是如何使用工具规范前端项目的commits与changelog技巧的详细内容,更多关于前端项目commits changelog规范的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文