git commit前检测拦截【pre-commit、lint-staged、husky、tsc-files】

1,923 阅读3分钟

背景:

项目经常在编译的时候发现同事提交的代码缺胳膊少腿,切在编译前的tsc检测占用了时间,导致领导一直吐槽为什么用vite编译还这么慢...

前提:

项目已支持 eslint、prettier检测支持,开发环境node版本需要14以上(原因)

方案:

预计先用pre-commithusky结合做提交前拦截,在用lint-stagedgit暂存区域内容检测,tsc-files对暂存tsc、ts文件做检测

步骤:

配置git commit message前拦截
  • 安装npm install pre-commit husky -D

  • 在到项目根目录(这很重要,指的是项目git的根目录) 执行npx husky install path/.husky

    ⚠️ 这里需要注意:假设你的项目目录为 (以下项目说明路径均假设为当前文件目录结构)
      -- root
        -- project
          -- web(配置项目)
          
    那这里你的执行脚本要在root目录下执行:"npx husky install project/web/.husky"
    执行成功后在项目web目录下查看是否生成下图文件(如果成功则说明上述操作成功)
    

    image.png

      这个步骤添加后,为了所有项目参与者都方便,可以直接在package.json中的`scripts`
      配置命令:` "prepare": "cd ../.. && husky install project/web/.husky"`,
      这样参与者在npm i的时候都可以直接生成husky目录
    
  • 添加钩子npx husky add .husky/pre-commit "npm test"

      这步直接在web目录下执行即可,执行完毕,可在.husky目录下查看到一个pre-commit文件,如下图
      
    

    image.png

     这个时候执行git commit message的时候就会在提交前npm test命令
    
添加暂存区域检测
  • 安装: npm install lint-staged -D

  • 配置:(在项目package.json内添加配置)

    "lint-staged": {
        "./src/**/*.{ts,tsx}": "eslint",
        "./src/**/*.{js,jsx,ts,tsx,less,json}": "prettier --loglevel warn --write",
        "./static/locale/*.json": "prettier --loglevel warn --write"
      }
    
      然后再去pre-commit内将内部文件内容修改为
    
    #!/usr/bin/env sh
    . "$(dirname -- "$0")/_/husky.sh"
    
    cd project/web
    npx lint-staged
    
    

    此时项目在git commit message的时候都会对需要提交的内容文件做prettier检测

ts、tsc文件内容检测
  • 安装npm install tsc-files对当个暂存tsc文件进行检测

  • 配置(将package.json的lint-staged调整为):

      "lint-staged": {
        "./src/**/*.{ts,tsx}": ["eslint", "tsc-files --noEmit ./src/vite-env.d.ts"],
        "./src/**/*.{js,jsx,ts,tsx,less,json}": "prettier --loglevel warn --write",
        "./static/locale/*.json": "prettier --loglevel warn --write"
      }
    
         注意:这里需要注意点的是,tsc-files --noEmit ./src/vite-env.d.ts这个配置,我的是vite项目,
     所以我的全局文件类型声明都在这个vite-env.d.ts内,所以需要引入这个,不然会报svg、less等文件未声明识别错误。
    

完结:

以上就是基于vite、react项目基础配置的git commit message拦截配置了,全部配置流程,现在执行git commit的时候,就会对暂存内容做tsc检测了,可以在编译的时候去除tsc检测,以便加快编译速度;同时也可以减少所有项目参与人员提交文件"缺胳膊少腿"的现象了

附带tsc-files的文件类型声明补充isuess