NPM
17 Nov 2021
2 min read
tags: linterNPMpackagelint-stagedhuskyESLintstylelint

程式碼守門員 - Husky + Lint-Staged

Don’t let 💩 slip into your code base! 這段話出自 lint-staged,非常符合這篇文章想傳達的主旨。

此文是紀錄筆者在專案上如何使用 husky + lint-staged,主要需求有:

  1. 每次 git commit 前自動執行
  2. 自動修正 lint 錯誤和程式碼排版
  3. 檢查失敗且不能自動修復時,不要 commit

介紹

- husky 🐶

可以讓我們在 git commitgit push 等 git action 執行前,預先處理我們指定的任務。

- lint-staged 🚫 💩

指定檢查範圍,只針對有變動的檔案,而非整個專案,也可以依據檔案類型,分別設置不同指令。

Installation

npm install husky lint-staged -D

husky 設定

- 初始化設定:

專案最初設定一次即可,會在根目錄下產生一個 .husky 資料夾,存放 husky 的相關腳本。

npm set-script prepare "husky install"
npm run prepare

- 增加 hook:

指定在 git commit 前先跑過 npx lint-staged 腳本,如果失敗的話,git commit 不會被執行。

npx husky add .husky/pre-commit "npx lint-staged"

輸入完上面指令後,會在 .husky 資料夾下面產生一個 pre-commit 檔案,如果有想到其他腳本想加入,比如說單元測試腳本,都可以直接在下一行新增。

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

💡 補充
如果對其他的 git hooks 有興趣的話,可以參考 git 官網文件

lint-staged 設定

這邊設定是根據檔案類型,分別需要經過 linter 檢查和 prettier format,可依照自己的需求調整。

提供兩種設置方法,擇一即可:

1. package.json

// package.json

 "lint-staged": {
    "*.{ts,js,vue}": [
      "eslint --fix"
    ],
    "*.{html,scss,css,vue}": [
      "prettier --write",
      "stylelint --fix"
    ]
 },

2. .lintstagedrc.json

// .lintstagedrc.json

{
    "*.{ts,js,vue}": [
      "eslint --fix"
    ],
    "*.{html,scss,css,vue}": [
      "prettier --write",
      "stylelint --fix"
    ]
}

Usage

每次 git commit 就會自動觸發,程式碼都要符合 eslintstylelint 的設定檔規則,確保程式碼都是跟團隊規範保持一致的。


可以先試打一段可怕的程式碼,可以看到 eslint 哀嚎不已:

接著把這份檔案直接 git commit 後,排版自動變整齊,error 也被自動修復了 🎉。


但也是有不能被自動修復的情境,例如下圖中 bar 宣告了,卻沒有使用,這時會顯示錯誤訊息,如果馬上 git commit ,就會直接失敗,不會進入 git history 中,直到手動修正錯誤。

主要也是要阻擋這類的程式碼被 commit 進入 code base 中,因為現在幾乎都會設定 VScode 在存檔時,自動修正和 format,大部分的錯誤在開發中就會被解決了,但這類的錯誤,只要檔案沒被開啟,VScode linter 插件就無法及時提供警告。

總結

husky + lint-staged 的搭配,相當多了位 Code Reviewer 把關程式碼,也可以減輕團隊 code review 的壓力,確保不會有 error 會被推到 repository,且程式碼也是符合團隊規範。

如果一開始就能修正,後期維護會輕鬆些,不然隨著專案變大,錯誤和警告數量一多,也是很頭疼的。

參考資料

  1. husky GitHub
  2. lint-staged GitHub
  3. 使用 ESLint, Prettier, Husky, Lint-staged 以及 Commitizen 提升專案品質及一致性
NPMpackagehuskylint-stagedESLintStylelint
Published on 17 Nov 2021
Updated on 09 Aug 2023