diff --git a/source/_posts/2020-09-10-git-commit-control.md b/source/_posts/2020-09-10-git-commit-control.md new file mode 100644 index 0000000000..38b10c7200 --- /dev/null +++ b/source/_posts/2020-09-10-git-commit-control.md @@ -0,0 +1,297 @@ +title: 规范GIT代码提交信息&自动化版本管理 +subtitle: +cover: https://img11.360buyimg.com/imagetools/jfs/t1/123611/18/12202/317391/5f5a1073E7dc03d83/9f2adf4821068f28.jpg +category: 经验分享 +tags: + - git + - git commit + - Conventional Commits + - semver + - standard version + - commitizen +author: + nick: eijil +date: 2020-09-10 17:00:00 +--- +## 前言 + +`git`作为一个开发人员必不可少的工具,代码提交也是日常一个非常频繁的操作,如果你或你的团队目前对提交信息还没有一个规范或约束,那么你有必要看看本文的内容了。 + +## 为什么要规范提交信息 + +首先规范提交信息肯定是有必要的,简单总结下几点好处: + +* 让项目的维护或使用人员能了解提交了哪些更改 +* 清晰的历史记录,可能某天自己就需要查到呢 +* 规范的提交记录可用于自动生成修改日志(CHANGELOG.MD) +* 基于提交类型,触发构建和部署流程 + + +## 使用什么规范 + +**`Conventional Commits`(约定式提交规范)**,是目前使用最广泛的提交信息规范,其主要受[AngularJS规范](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines)的启发,下面是一个规范信息的结构: +``` +[optional scope]: +//空一行 +[optional body] +//空一行 +[optional footer(s)] +``` +### 规范说明 + + +**`type`** 提交的类别,必须是以下类型中的一个 + +``` +feat:增加一个新功能 +fix:修复bug +docs:只修改了文档 +style:做了不影响代码含义的修改,空格、格式化、缺少分号等等 +refactor:代码重构,既不是修复bug,也不是新功能的修改 +perf:改进性能的代码 +test:增加测试或更新已有的测试 +chore:构建或辅助工具或依赖库的更新 + +``` +**`scope`** 可选,表示影响的范围、功能、模块 + +**`subject`** +必填,简单说明,不超过50个字 + +**`body`** +选填,用于填写更详细的描述 + +**`footer`** +选填,用于填关联`issus`,或`BREAK CHANGE` + +**`BREAKING CHANGE`** + +必须是大写,表示引入了破坏性 API 变更,通常是一个大版本的改动,`BREAKING CHANGE:` 之后必须提供描述,下面一个包含破坏性变更的提交示例 +``` +feat: allow provided config object to extend other configs + +BREAKING CHANGE: `extends` key in config file is now used for extending other config files +``` + + +>更详细的说明请看[约定式提交规范](https://www.conventionalcommits.org/zh-hans/v1.0.0-beta.4/#%e7%ba%a6%e5%ae%9a%e5%bc%8f%e6%8f%90%e4%ba%a4%e8%a7%84%e8%8c%83) + + +### 如何约束规范 + +怎么确保每个提交都能符合规范呢,最好的方式就是通过工具来生成和校验,`commitizen`是一个nodejs命令行工具,通过交互的方式,生成符合规范的git commit,界面如下: + +![](https://github.com/commitizen/cz-cli/raw/master/meta/screenshots/add-commit.png) + +开始安装: + +``` +# 全局安装 +npm install -g commitizen +# 或者本地安装 +$ npm install --save-dev commitizen +# 安装适配器 +npm install cz-conventional-changelog +``` +`packages.json`在配置文件中指定使用哪种规范 + +``` js +... + "config": { + "commitizen": { + "path": "cz-conventional-changelog" + } + } +``` +安装完成后可以使用`git cz` 来代替`git commit`,然后根据提示一步步输入即可 + +### 格式校验commitlint +可能你不想每次都通过交互界面来生成,还是想使用`git commit -m 'message'`,那么为了确保信息的正确性,可以结合`husky`对提交的信息进行格式验证 + +安装依赖 +``` bash +npm install --save-dev @commitlint/{config-conventional,cli} +# 安装husky +npm install --save-dev husky + +``` +添加 `commitlint.config.js`文件到项目 +``` bash +echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js +``` +`package.json`配置 +``` + +#git提交验证 +"husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + }, +``` + +OK到这一步就完成了,最后给你项目README.MD加上一个`commitizen-friendly`的标识吧 +``` +[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) +``` + +[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) + +## 自动版本管理和生成CHANGELOG + +规范化的提交信息除了能很好描述项目的修改,还有一个很好的作用就是能根据提交记录来生成CHANGELOG.MD和自动生成版本号等功能。 + + +### standard-version + +一个用于生成`CHANGELOG.md`和进行`SemVer(语义化版本号)`发版的命令行工具 + +主要功能: +* 自动修改最新版本号,可以是`package.json`或者自定义一个文件 +* 读取最新版本号,创建一个最新的`git tag` +* 根据提交信息,生成`CHANGELOG.md` +* 创建一个新提交包括 `CHANGELOG.md`和`package.json` + + +### 语义化版本控制(SemVer) + +先简单了解下什么是语义化的版本控制,其是由`GitHub`发起的一份用于规范版本号递增的规则, +##### 版本格式 +主版本号.次版本号.修订号,版本号递增规则如下: + +* 主版本号(major):当你做了不兼容的 API 修改, +* 次版本号(minor):当你做了向下兼容的功能性新增,可以理解为Feature版本, +* 修订号(patch):当你做了向下兼容的问题修正,可以理解为Bug fix版本。 + +先行版本号可以加到“主版本号.次版本号.修订号”的后面,作为延伸。 + +##### 先行版本 +当即将发布大版本改动前,但是又不能保证这个版本的功能 100% 正常,这个时候可以发布先行版本: + +* alpha: 内部版本 +* beta: 公测版本 +* rc: 候选版本(Release candiate) + +比如:1.0.0-alpha.0,1.0.0-alpha.1,1.0.0-rc.0,1.0.0-rc.1等。 + + `standard-version` 会根据提交的信息类型来自动更改对应的版本号,如下: +* feat: 次版本(minor)+1 +* fix: 修订号(patch) +1 +* BREAK CHANGE: 主板号(marjor) +1 + +> `standard-verstion` 生成的`CHANGELOG`只会包含`feat`,`fix`,`BREACK-CHANGE`类型的提交记录 + + +#### 使用 +``` bash +npm i --save-dev standard-version +``` + +添加`npm script` + +``` +{ + scripts:{ + "release": "standard-version", + "release:alpha": "standard-version --prerelease alpha", + "release:rc": "standard-version --prerelease rc" + } +} +``` +执行: +``` bash +# npm run script +npm run release +# or global bin +standard-version +``` +或者你想指定发行版本号: + +``` bash +#指定类型 patch/minor/marjor +npm run release -- --release-as patch +#指定版本号 +npm run release -- -- release-as 1.1.0 +``` + +##### 生命周期 + +* `prerelease`:所有脚本执行之前 +* `prebump`/`postbump`: 修改版本号之前和之后 +* `prechangelog`/`postchangelog`:生成changelog和生成changelog之后 +* `pretag`/`postag`:生成tag标签和之后 + +`standard-version`本身只针对本地,并没有`push`才操作,我们可以在最后一步生成tag后,执行push操作,在`paceage.json`中添加 +``` +"standard-version": { + "scripts": { + "posttag": "git push --follow-tags origin master && npm publish" + } + } +``` + + + +还有更多配置功能自行查阅 [官方文档](https://github.com/conventional-changelog/standard-version) + +#### 其它类似工具 +除了`standard-version`,还有其它类似的工具,有兴趣可以去了解下 +* [semantic-release](https://github.com/semantic-release/semantic-release) +* [lerna](https://lerna.js.org/) + + +## 修改Git Commit + +为了使`CHANGELOG.MD`更能加直观看到每个版本的修改,我们尽量保证每次提交都是有意义的,但实际开发过程中,不可避免会提交了一些错误的commit message,下面介绍几个`git`命令来修改`commit` + + +### 1 修改最后一次提交 +`git commit --amend` + +该命令会创建一个提交并覆盖上次提交,如果是因为写错或者不满意上次的提交信息,使用该命令就非常适合。 +### 2 合并多条提交 +`git reset --soft [commitID]` + +如果你想合并最近几条提交信息的话,那么就需要使用上面的命令来操作,指定要撤销的ccommitId,该命令会保留当前改动并撤销指定提交后的所有commit记录,如果不指定ID的话可以使用HEAD~`{num}` 来选择最近`{num}`条提交 +``` +git reset --soft HEAD~2 #合并最近两条提交 +git commit -m 'feat: add new feat' +``` +>带 `--soft` 参数的区别在于把改动内容添加到暂存区 相当于执行了`git add .` + +### git rebase -i + +`git rebase`的功能会更加强大,如果我想修改最近3条提交记录,执行 +``` bash +git rebase -i HEAD~3 +``` +会出现如下编辑器界面(vim编辑器): + + +![](https://img14.360buyimg.com/imagetools/jfs/t1/146374/23/7928/299480/5f5994e4E612057a2/96c528644441ab76.png) + +上面显示的是我最近3条提交信息 ,下面是命令说明, +修改方式就是将commit信息前的`pick`改为你需要的命令,然后退出`:wq`保存 + +下面是常用的命令说明: +``` +p,pick = 使用提交 +r,reword = 使用提交,但修改提交说明 +e,edit = 使用提交,退出后使用git commit --amend 修改 +s,squash = 使用提交,合并前一个提交 +f,fixup = 和squash相同,但丢弃提交说明日志 +d,drop = 删除提交,丢弃提交记录 +``` + +## 最后 +文本主要介绍了如何规范`git commit`和自动语义化版本管理,以及如何修改`git commit`,遵循一个规范其实没比之前随意填写信息增加多少工作量,但依赖规范却可以实现更多提升效率的事情。 + +## 参考 +* [conventional commits](https://www.conventionalcommits.org/zh-hans/v1.0.0-beta.4) + +* [standard version](https://github.com/conventional-changelog/standard-version) + +* [semver.org](https://semver.org/lang/zh-CN/) + +* [Semver(语义化版本号)扫盲](https://juejin.im/post/6844903591690534926) + diff --git a/source/_posts/2020-09-25-taro-vue3.md b/source/_posts/2020-09-25-taro-vue3.md new file mode 100644 index 0000000000..6bdc0ca2ba --- /dev/null +++ b/source/_posts/2020-09-25-taro-vue3.md @@ -0,0 +1,410 @@ +title: 使用 Vue3 开发小程序 +subtitle: Vue3的新特性主要有 Composition API、Teleport、Fragments 等。我们是否也可以在小程序开发中使用这些特性呢? +cover: https://img14.360buyimg.com/ling/jfs/t1/114796/40/19245/125315/5f715516E5765ae26/2375d621a3c73e76.png +category: 小程序 +tags: + - Vue3 + - Taro3 + - Taro + - 小程序 +author: + nick: lillian +date: 2020-09-28 09:00:00 +--- + +## 前言 + +9 月 19 日凌晨,Vue3 在经过多个开发版本的迭代后,终于迎来了它的正式版本,"One Piece" 的代号也昭示了其开拓伟大航路的野心。 + +Vue3的新特性主要有 Composition API、Teleport、Fragments 和 ` +``` +编译运行微信小程序 +```plain +npm run dev:weapp +``` +编译后,打开微信开发者工具导入编译后的`dist`目录,首页内容和编译成 H5的表现都如下图: +![图片](https://uploader.shimo.im/f/pzxlgUkWCEgGpvdC.png!thumbnail) + +## 验证Taro3对Vue3的支持度 + +### Composition API + +写个比较简单的 todolist 计数组件,假设目前已有 4 项代办事项,点击后将新增一项。这里会使用到Composition API 思路,以及 computed计算属性。 + +在用户点击时,第二行“当前操作新增”会根据点击次数递增,总计条数会在 4的基础上累加。 + +```plain + + +``` +页面表现如下所示,可见对于 Composition API 的支持的还是不错的。 + +![todo计数](https://img14.360buyimg.com/imagetools/jfs/t1/122176/18/13461/1349845/5f6c5d14Eaffd062c/f36c7a7279f8aac6.gif) + +### Teleport + +写个初次登录用户的欢迎弹窗。用户名从`index.vue`传入。首页代码如下: + +```plain + +``` +在 Toast.vue 中,我们会写个属性 to 为 teleportToast 的 Teleport 组件,代码如下: +```plain + + + +``` +在 H5 下是正常显示的,弹窗展示以及关闭功能效果如下;在小程序上却报错了,Taro 团队还需要加把劲: + +![Teleport](https://img10.360buyimg.com/imagetools/jfs/t1/111884/14/18645/2307115/5f6c6e91E963e9fcc/0b7230301e9d2e0a.gif) + +### Fragments + +Fragments 特性已经在上面的例子中得到验证,使用没有问题。 + +### script setup 语法糖 + +我们尝试一下` +``` +上述`script`标签里的代码效果等同于下面: +```plain + +``` +调用它的代码传入 mgs 如下: +```plain + +``` +运行后,小程序和 H5 都是支持的,页面整体表现如下: + +![script setup 语法糖](https://img10.360buyimg.com/imagetools/jfs/t1/132702/4/11153/1478203/5f705361E4db3e0cc/d32765423246de84.gif) + +可以看到,运用新特性进行开发,代码书写更加便捷,逻辑更清晰。 + +### style vars 语法糖 + +` +``` +调用它的页面里的代码如下: +```plain + + +``` +小程序和 H5 都没有问题,功能效果如下: + +![style vars 语法糖](https://img11.360buyimg.com/imagetools/jfs/t1/146777/39/9447/1836911/5f702d5eE52e470f9/dea5082ff993a478.gif) + +## 结语 + +我们将上述几个Demo 整合在一个项目中,放在[Github](https://github.com/lillian98/vue3)上,有兴趣的同学可以看看。在线预览地址在[这里](https://lillian98.github.io/vue3/dist/#/pages/index/index)。 + +经过验证,Taro3 支持使用最新的Vue3开发多端应用,相比之下H5的支持度更好一些。 + +值得一提的是,Taro 团队在技术上一直保持进取,在Taro2.0 版本支持了ReactHooks;根据[Taro RFCS](https://github.com/NervJS/taro-rfcs/blob/master/rfcs/0001-vue-3-support.md),早在`2020-06-03`也已经打算支持Vue3 了。截至目前,Taro 对 Vue3 的支持在小程序端的稍有补足,希望 Taro 团队可以早日补足这个短板。 + +推荐文章: + +* [Vue3和React ](https://zhuanlan.zhihu.com/p/133819602)[H](https://zhuanlan.zhihu.com/p/133819602)[ooks对比](https://zhuanlan.zhihu.com/p/133819602) +* [SWR](https://github.com/vercel/swr) +* [自定义渲染器的应用](http://hcysun.me/vue-design/zh/renderer-advanced.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B8%B2%E6%9F%93%E5%99%A8%E7%9A%84%E5%BA%94%E7%94%A8) + +参考文章: + +* [1][Compsition API](https://v3.cn.vuejs.org/guide/composition-api-introduction.html) +* [2][Teleport](https://v3.cn.vuejs.org/guide/teleport.html#%E4%B8%8E-vue-components-%E4%B8%8E-vue-components-%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8) +* [3]`