tags: linter
、NPM
、package
、lint-staged
、husky
、ESLint
、stylelint
程式碼守門員 - Husky + Lint-Staged
Don’t let 💩 slip into your code base! 這段話出自 lint-staged
,非常符合這篇文章想傳達的主旨。
此文是紀錄筆者在專案上如何使用 husky
+ lint-staged
,主要需求有:
- 每次
git commit
前自動執行 - 自動修正 lint 錯誤和程式碼排版
- 檢查失敗且不能自動修復時,不要 commit
介紹
- husky
🐶
可以讓我們在 git commit
、git 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
就會自動觸發,程式碼都要符合 eslint
、stylelint
的設定檔規則,確保程式碼都是跟團隊規範保持一致的。
可以先試打一段可怕的程式碼,可以看到 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,且程式碼也是符合團隊規範。
如果一開始就能修正,後期維護會輕鬆些,不然隨著專案變大,錯誤和警告數量一多,也是很頭疼的。