vue-cli创建的项目中的gitHooks原理解析


Posted in Javascript onFebruary 14, 2020

前言

在使用 vue create my-app 创建项目的时候,Vue 会自动帮我们做好一些预配置,你可以不使用它,但是一旦需要的时候,突然发现,咦~原来它已经帮我做好准备工作了,只需要按自己的需求配置一下就可以了,就会觉得 vue-cli 很贴心啊,帮我们节省了很多时间。

package.json 文件中会发现 gitHookslint-staged 等字段,不难看出它是在我们执行 git 命令的时候会自动执行的一些额外的操作,比如语法提示、错误提示等。

这个完整的过程是怎样的呢?

流程解析

yorkie 包

执行 vue create 命令的时候,会安装一个包,叫: yorkie ,这个包是尤大 fork 自 husky 的,它俩功能是一样的,都是生成一些 git hooks 文件,读取项目中 package.json 的相关配置项去执行一些命令,区别是尤大做了一些逻辑和配置上的改动。

安装完这个包以后,会自动执行 yorkie 包里面的一个脚本: bin/install.js

vue-cli创建的项目中的gitHooks原理解析

这个脚本会在你项目下的 .git/hooks 目录中生成很多 git hooks 文件:

vue-cli创建的项目中的gitHooks原理解析

当你执行一些 git 命令的时候,比如: git push, git commit 等,git 就会执行相应的 hook。

package.json

git commit -a -m'123' 这个命令为例子,执行这个命令的时候,git 会去执行 pre-commit 这个 hook。

先把 package.json 的相关内容贴出来,让大家先有个印象:

"gitHooks": {
 "pre-commit": "lint-staged",
},
"lint-staged": {
 "*.{js,jsx,vue}": [
 "vue-cli-service lint",
 "git add"
 ]
}

pre-commit hook

接下来我们看 pre-commit 的文件内容:

##...
has_hook_script () {
 [ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:"
}
# 检查 package.json 文件中是否定义了 pre-commit
has_hook_script pre-commit || exit 0

# 运行 hook 
node "./node_modules/yorkie/src/runner.js" pre-commit || {
 echo
 echo "pre-commit hook failed (add --no-verify to bypass)"
 exit 1
}

可以看到 pre-commit 文件去检查了一下 package.json 文件中是否定义了pre-commit,如果定义了,就执行 yorkie 的 runner.js 脚本。

yorkie 的 runner.js 脚本

我们继续看 runner.js 脚本的内容:

//...
const cwd = process.cwd()
const pkg = fs.readFileSync(path.join(cwd, 'package.json'))
// 取到 package.json 里面定义的 gitHooks 内容
const hooks = JSON.parse(pkg).gitHooks
if (!hooks) {
 process.exit(0)
}
// 从上文得知,这个值是 pre-commit
const hook = process.argv[2]
// 取 gitHooks 里面定义的 pre-commit 的内容,也就取到:lint-staged
const command = hooks[hook]
if (!command) process.exit(0)
// 执行 lint-staged 命令
execa.shellSync(command, { stdio: 'inherit' })

从这个过程中可以看到,当我们执行 git commit -a -m'123' 这个 git 命令的时候,git hook 执行了 yorkie 的一个脚本去读取了 package.json 文件中的内容,取到相关的配置项,然后执行配置项中的命令。

在上述例子中,因为执行了 lint-staged 命令,它会读取 package.json 中的 "lint-staged" 配置项,进而又继续执行了 vue-cli-service lint 这个命令,整个执行的过程就像像链条一样一环连着一环,直到所有命令都执行完毕。

实践

明白了这个流程后,在项目中就可以根据需求灵活地做一些配置了,比如在执行 commit-msg hook 的时候加上 commitlint ,规范协作者提交的git 信息,加上这个以后,执行之前的示例命令: git commit -a -m'123' 就会有提交信息不规范的错误提示,根据提示改成: git commit -a -m'feat: 123' 就可以提交了。

同样的,与 pre-commit 搭配使用的 lint-staged ,也可以加上一些命令,比如这里加了 pretty-quick 用来统一代码格式。

示例:

"gitHooks": {
 "pre-commit": "lint-staged",
 "commit-msg": "commitlint -E GIT_PARAMS"
},
"lint-staged": {
 "*.{js,jsx,vue}": [
 "pretty-quick --staged",
 "vue-cli-service lint",
 "git add"
 ]
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
浅谈tudou土豆网首页图片延迟加载的效果
Jun 23 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
Javascript学习笔记之相等符号与严格相等符号
Nov 23 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
Apr 26 Javascript
JavaScript登录记住密码操作(超简单代码)
Mar 22 Javascript
javascript编写简易计算器
May 06 Javascript
React-Native之定时器Timer的实现代码
Oct 04 Javascript
基于JavaScript实现报警器提示音效果
Oct 27 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
使用vue for时为什么要key【推荐】
Jul 11 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 14 #Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 #Javascript
JavaScript实现Tab选项卡切换
Feb 13 #Javascript
Angular 多模块项目构建过程
Feb 13 #Javascript
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 #Javascript
JavaScript实现省市区三级联动
Feb 13 #Javascript
jquery传参及获取方式(两种方式)
Feb 13 #jQuery
You might like
PHP+javascript液晶时钟
2006/10/09 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
jQuery ready函数滥用分析
2011/02/16 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
python实现弹跳小球
2019/05/13 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
食品厂厂长岗位职责
2014/01/30 职场文书
大学新闻系求职信
2014/06/03 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书