Git钩子脚本如何检查交互设计

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何检查交互设计

  1. 📚 目录导读
  2. 为什么需要Git钩子检查交互设计?
  3. Git钩子基础与交互设计检查的切入点
  4. 常见交互设计违规场景与钩子脚本示例
  5. 实战:pre-commit钩子自动校验设计Token
  6. 高频问题解答(FAQ)
  7. 注意事项与团队落地建议

📚 目录导读

  1. 为什么需要Git钩子检查交互设计?
  2. Git钩子基础与交互设计检查的切入点
  3. 常见交互设计违规场景与钩子脚本示例
  4. 实战:pre-commit钩子自动校验设计Token
  5. 高频问题解答(FAQ)
  6. 注意事项与团队落地建议

为什么需要Git钩子检查交互设计?

很多团队在开发过程中发现:功能实现了,但交互细节频频出问题——比如按钮间距错误、颜色值偏离设计系统、字体字号与设计稿不符,传统的“开发-测试-返工”流程,往往在代码合并到主分支后才暴露问题,修复成本极高。

Git钩子脚本可以在commitpush之前,自动扫描代码中与交互设计相关的代码片段,拦截不符合设计规范的提交,这种 “左移” 质量管控思路,将交互检查从人工评审阶段提前到编码提交的一瞬间,实现“无感但有效”的防线。


Git钩子基础与交互设计检查的切入点

1 Git钩子是什么?

Git钩子是Git版本库在特定事件(如commitpushmerge)发生时自动触发的脚本,常用的是:

  • pre-commit:在输入提交信息前运行,适合检查新增或修改的文件。
  • pre-push:在推送前运行,适合检查整个仓库的完整状态。
  • post-commit:提交后运行,通常用于通知或记录。

2 交互设计检查的切入点

我们可以在pre-commit阶段扫描被变更的文件,匹配设计系统中的关键约束:

检查项 对应代码特征 检测方式
颜色值是否在设计系统内 color: #...background: ... 正则匹配+白名单
间距是否使用设计Token margin: 8pxpadding: 12px 检查是否出现硬编码数字
字体字号是否合规 font-size: 16pxfont-weight: 700 比对设计系统变量集
圆角、阴影、边框厚度 border-radius: 4pxbox-shadow: ... 正则+Token映射表

✅ 核心思想:硬编码数值是交互设计的敌人,任何直接写在CSS/JSX中的16px#3b82f6,都应该被替换为设计系统中的语义变量(如--spacing-md--color-primary)。


常见交互设计违规场景与钩子脚本示例

1 场景一:硬编码颜色值

/* 违规示例 */
.btn { background: #3b82f6; }

钩子脚本逻辑:读取项目中已定义的颜色变量集合(如从tokens.json读取),扫描新增的CSS/JSX文件,如果发现颜色值不在集合内,则阻止提交。

2 场景二:非标准间距

// 违规示例
<div style={{ marginLeft: 12 }}>...</div>

钩子脚本逻辑:检查行内样式或样式对象中的marginpadding数字是否为设计系统定义的倍率(如4px的倍数:4、8、12、16、20……)。

3 场景三:字体字号脱离设计系统

// 违规示例{ font-size: 22px; }

钩子脚本逻辑:扫描所有font-size声明,如果值不在$font-sizes: (12, 14, 16, 20, 24, 32)中,则输出警告并终止提交。


实战:pre-commit钩子自动校验设计Token

1 创建钩子文件

在项目根目录的.git/hooks/下新建pre-commit文件(无后缀),并赋予可执行权限:

chmod +x .git/hooks/pre-commit

2 编写核心脚本(Node.js版本)

因为交互设计检查需要对CSS/JSX进行语义解析,推荐用Node.js编写,示例脚本逻辑:

#!/usr/bin/env node
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
// 1. 获取本次变更的文件列表(仅包含CSS/JSX/TSX)
const changedFiles = execSync('git diff --cached --name-only --diff-filter=ACM')
  .toString()
  .split('\n')
  .filter(f => f.match(/\.(css|scss|jsx|tsx)$/));
// 2. 加载设计系统Token
const designTokens = JSON.parse(fs.readFileSync('./tokens.json', 'utf-8'));
const validColors = designTokens.colors;    // ["#1a1a2e", "#16213e", ...]
const validSpacings = designTokens.spacings; // [4, 8, 12, 16, 24, 32]
// 3. 逐文件检查
let errors = [];
changedFiles.forEach(file => {
  const content = fs.readFileSync(file, 'utf-8');
  // 检查颜色值:hex或rgba格式
  const colorRegex = /#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b/g;
  let match;
  while ((match = colorRegex.exec(content)) !== null) {
    if (!validColors.includes(match[0])) {
      errors.push(`${file}: 发现未授权的颜色值 ${match[0]}`);
    }
  }
  // 检查硬编码间距(非Token方式)
  const spacingRegex = /(margin|padding)[\s:]+(\d+)px/g;
  while ((match = spacingRegex.exec(content)) !== null) {
    const value = parseInt(match[2], 10);
    if (!validSpacings.includes(value)) {
      errors.push(`${file}: 间距值 ${value}px 不符合设计系统,建议使用 designToken`);
    }
  }
});
// 4. 如有错误则中止提交
if (errors.length > 0) {
  console.error('❌ 交互设计检查失败:\n' + errors.join('\n'));
  process.exit(1);
} else {
  console.log('✅ 交互设计检查通过');
}

3 集成到团队工作流

不要手动复制钩子文件——推荐使用Huskylefthook这些工具统一管理Git钩子,例如用Husky:

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "node scripts/check-interaction.js"
    }
  }
}

高频问题解答(FAQ)

Q1:钩子脚本会不会拖慢提交速度?
A:只扫描本次变更的文件(不是全量扫描),且检查逻辑通常只需几百毫秒,如果团队有数千个文件,可以进一步限流(比如只检查CSS/JSX文件,跳过图片和配置文件)。

Q2:交互设计标准经常变化怎么办?
A:将设计Token单独存储为JSON或YAML文件(如tokens.json),并纳入Git版本管理,设计师和前端开发者共同维护此文件,钩子脚本只读取该文件,无需硬编码规则。

Q3:如果某些硬编码是故意的(如第三方组件样式)怎么跳过?
A:在脚本中加入“忽略文件路径”白名单(例如node_modules/vendor/),或者在代码中用特殊注释标记:/* skip-interaction-check */

Q4:钩子脚本一定要用Node.js吗?
A:不强制,可以用Python、Shell甚至Go,但Node.js常用于前端项目,因为可以直接复用package.json依赖(如stylelinteslint-plugin-design-tokens)。

Q5:除了颜色和间距,还能检查什么?
A:可以检查border-radius是否非标准化、font-weight是否使用数字而非关键词(如700而非bold)、line-height是否与字体大小成对应比例,更进阶的可以结合视觉回归工具(如Percy、Chromatic)在pre-push阶段截图对比。


注意事项与团队落地建议

  1. 渐进式推行:不要第一天就全量限制,先让钩子输出警告(warn)而非阻止提交,收集团队反馈后逐步收紧。
  2. 设计师参与:设计Token的定义需要设计师签字确认,否则钩子脚本会引发“谁说了算”的矛盾。
  3. 与Linter组合:交互设计检查不应替代ESLint或Stylelint,而是补充,例如让Stylelint检查CSS语法,钩子检查设计系统一致性。
  4. 跨平台兼容:确保脚本在Windows(Git Bash)、macOS、Linux上都能运行,避免path.sep差异导致报错。
  5. 回滚机制:如果钩子脚本出错,允许开发者用--no-verify跳过检查应急提交(但需事后补修)。

通过以上实践,Git钩子脚本不仅能检查交互设计规范,还能倒逼团队养成良好的设计Token使用习惯,它是一种 “代码即文档、提交即校验” 的工程化文化,最终实现交互质量的前移管控。

抱歉,评论功能暂时关闭!