前端工程化-图片自动压缩
团队开启了一个新项目,希望能在原来项目的工程化基础上再进一步,于是想到了图片自动压缩。 这里的图片自动压缩并不是在webpack构建阶段压缩,而是在git commit的时候进行。 pre-commitpre-commit 是git hook 众多钩子中的一个,在每次 git commit 前执行,可以是shell等任何可执行的脚本文件,通过返回0 or 1 来表示commit是否通过。在bash中,非零返回值代表失败. pre-commit.js市面上有许多通过node.js来封装pre-commit的npm包,我使用了功能最精简的pre-commit.js , 按README在package.json中简单配置后,可以看到 .git/hooks/pre-commit脚本如下所示: #!/bin/bash./node_modules/pre-commit/hookRESULT=$?[ $RESULT -ne 0 ] && exit 1exit 0pre-commit.js重写了原来的示例钩子,在git commit时执行自己的/hook脚本. hook bash# 之前的代码主要确认node环境# git commit --dry-run 的情况(测试性提交,执行动作不产生结果),不对提交作任何处理if [[ $* == *--dry-run* ]]; then if [[ -z "$BINARY" ]]; then # 但还是要检查下NODE是否存在,不存在返回非零值代表失败 exit 1 fielse # 用NODE 执行 'pre-commit/index.js' 模块 "$BINARY" "$("$BINARY" -e "console.log(require.resolve('pre-commit'))")"fi最终pre-commit/index.js 将读取package.json中配置好的路径来执行指定的脚本。 pre-commit/index.js// 执行自定义钩子脚本的核心部分Hook.prototype.run = function runner() { var hooked = this; (function again(scripts) { // 脚本数组为空,则返回0,执行本次 commit . if (!scripts.length) return hooked.exit(0); // 否则弹出一个脚本来执行 var script = scripts.shift(); // 使用的是异步执行子进程方法child_process.spawn. spawn(hooked.npm, ['run', script, '--silent'], { env: process.env, cwd: hooked.root, stdio: [0, 1, 2] }).once('close', function closed(code) { // 监听了执行结束的close事件,递归继续执行下一个脚本 if (code) return hooked.log(hooked.format(Hook.log.failure, script, code)); again(scripts); }); })(hooked.config.run.slice(0));};从上述代码中可以看出,即使我们定义的钩子脚本有异步处理逻辑也是可以的,因为整个脚本都是新开了一个异步的子进程来执行的,通过监听close事件来确认异步逻辑执行完毕,最终exit(0)通知成功,执行commit。 ...