From a446f71c0458191eceb3408522d9bba4d134a0cc Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Wed, 17 Dec 2025 19:19:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20pre-commit=20hook?= =?UTF-8?q?=20=E6=A3=80=E6=9F=A5=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增文件必须使用 TypeScript (.ts/.tsx) - 禁止使用 fetch,提示使用 axios - 安装 husky 和 lint-staged 依赖 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .husky/pre-commit | 110 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + 2 files changed, 112 insertions(+) create mode 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..105ea923 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,110 @@ +#!/bin/sh + +# ============================================ +# Git Pre-commit Hook +# ============================================ +# 规则: +# 1. src 目录下新增的代码文件必须使用 TypeScript (.ts/.tsx) +# 2. 修改的代码不能使用 fetch,应使用 axios +# ============================================ + +# 颜色定义 +RED='\033[0;31m' +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +has_error=0 + +echo "" +echo "🔍 正在检查代码规范..." +echo "" + +# ============================================ +# 规则 1: 新文件必须使用 TypeScript +# ============================================ + +# 获取新增的文件(只检查 src 目录下的代码文件) +new_js_files=$(git diff --cached --name-only --diff-filter=A | grep -E '^src/.*\.(js|jsx)$' || true) + +if [ -n "$new_js_files" ]; then + echo "${RED}❌ 错误: 发现新增的 JavaScript 文件${NC}" + echo "${YELLOW} 新文件必须使用 TypeScript (.ts/.tsx)${NC}" + echo "" + echo " 以下文件需要改为 TypeScript:" + echo "$new_js_files" | while read file; do + echo " - $file" + done + echo "" + echo " 💡 提示: 请将文件扩展名改为 .ts 或 .tsx" + echo "" + has_error=1 +fi + +# ============================================ +# 规则 2: 禁止使用 fetch,应使用 axios +# ============================================ + +# 获取所有暂存的文件(新增 + 修改) +staged_files=$(git diff --cached --name-only --diff-filter=AM | grep -E '^src/.*\.(js|jsx|ts|tsx)$' || true) + +if [ -n "$staged_files" ]; then + # 检查暂存内容中是否包含 fetch 调用 + # 使用 git diff --cached 检查实际修改的内容 + fetch_found="" + + for file in $staged_files; do + # 检查该文件暂存的更改中是否有 fetch 调用 + # 排除注释和字符串中的 fetch + # 匹配: fetch(, await fetch, .fetch( + fetch_matches=$(git diff --cached -U0 "$file" 2>/dev/null | grep -E '^\+.*[^a-zA-Z_]fetch\s*\(' | grep -v '^\+\s*//' || true) + + if [ -n "$fetch_matches" ]; then + fetch_found="$fetch_found +$file" + fi + done + + if [ -n "$fetch_found" ]; then + echo "${RED}❌ 错误: 检测到使用了 fetch API${NC}" + echo "${YELLOW} 请使用 axios 进行 HTTP 请求${NC}" + echo "" + echo " 以下文件包含 fetch 调用:" + echo "$fetch_found" | while read file; do + if [ -n "$file" ]; then + echo " - $file" + fi + done + echo "" + echo " 💡 修改建议:" + echo " ${GREEN}// 替换前${NC}" + echo " fetch('/api/data').then(res => res.json())" + echo "" + echo " ${GREEN}// 替换后${NC}" + echo " import axios from 'axios';" + echo " axios.get('/api/data').then(res => res.data)" + echo "" + has_error=1 + fi +fi + +# ============================================ +# 检查结果 +# ============================================ + +if [ $has_error -eq 1 ]; then + echo "${RED}========================================${NC}" + echo "${RED}提交被阻止,请修复以上问题后重试${NC}" + echo "${RED}========================================${NC}" + echo "" + exit 1 +fi + +echo "${GREEN}✅ 代码规范检查通过${NC}" +echo "" + +# 运行 lint-staged(如果配置了) +# 可选:在 package.json 中添加 "lint-staged" 配置来启用代码格式化 +# if [ -f "package.json" ] && grep -q '"lint-staged"' package.json; then +# npx lint-staged +# fi diff --git a/package.json b/package.json index fec6e2f6..60d5cb62 100755 --- a/package.json +++ b/package.json @@ -131,12 +131,14 @@ "eslint-plugin-prettier": "3.4.0", "gulp": "4.0.2", "gulp-append-prepend": "1.0.9", + "husky": "^9.1.7", "imagemin": "^9.0.1", "imagemin-mozjpeg": "^10.0.0", "imagemin-pngquant": "^10.0.0", "kill-port": "^2.0.1", "less": "^4.4.2", "less-loader": "^12.3.0", + "lint-staged": "^16.2.7", "msw": "^2.11.5", "prettier": "2.2.1", "react-error-overlay": "6.0.9",