[lint] 檢查 git staged 的檔案是否符合 ESLint 規範 (git hook, husky, lint-staged, eslint)
說明
記錄一下怎麼檢查 git staged 的檔案是否符合 ESLint 規範,先以 vue 專案為例,因為使用 npx create-vue@latest
可以快速幫我們建好 ESLint 的檔案和環境。
順便說一下,我的 demo 專案已經有初始化 git 了,所以要跟著操作的話,記得要先將專案的 git 環境設定好。
建立專案
先執行以下指令
npx create-vue@latest
然後在詢問是否安裝 ESLint
和 Prettier
的時候,選擇是
。
eslint
當你打開專案的 .eslintrc.cjs
檔案時,可以在 rules
區塊中加入你常用的檢查規則,也就是你希望執行 git commit
後,套用哪些規則來檢查程式碼。
以下是我個人常用的規則。如果想了解這些規則檢查的程式碼問題,可以參考這篇文章,這裡就不再詳細介紹了。
/* eslint-env node */
require("@rushstack/eslint-patch/modern-module-resolution");
module.exports = {
root: true,
extends: [
"plugin:vue/vue3-recommended",
"eslint:recommended",
"@vue/eslint-config-prettier/skip-formatting",
],
rules: {
"vue/no-undef-components": "error",
"vue/no-undef-properties": "error",
"vue/eqeqeq": "warn",
"vue/no-unused-properties": "error",
"vue/no-unused-emit-declarations": "error",
"array-callback-return": "error",
eqeqeq: "warn",
},
parserOptions: {
ecmaVersion: "latest",
},
};
安裝 husky & lint-staged
husky
是讓我們可以很簡單使與快速使用 git hook
的工具,而 lint-staged
是用來幫我們檢查 git 暫存區(staged) 的檔案是否有符合 ESLint 規範的工具。
安裝 husky
和 lint-staged
,並安裝在 devDependencies
。
npm i husky lint-staged -D
lint staged config
安裝完後,我們可以在 package.json
內新增 lint-staged
的屬性。
- line 4:因為我們在初始化專案的時候,已經有安裝
Prettier
了,所以可以直接使用prettier
指令,來格式化src
底下的檔案,這邊我們是指定了副檔名包含 js、html、css、vue 的檔案,這樣做是為了讓程式碼的風格統一,因為不一定所有人都有安裝Prettier
並且把formatOnSave
開啟。 - line 5:直接執行
eslint
指令,並加上--fix
參數,當我們在 ESLint 中使用了 --fix 參數時,ESLint 會嘗試自動修復那些它認為可以自動修復的問題。這些問題可能包括但不限於:- 修復未關閉的大括號 {}。
- 新增缺失的分號 ;。
- 修復不必要的空白行。
- 修復不必要的空格。
- 修復不必要的換行。
- 修復不必要的縮排。
{
...
"lint-staged": {
"src/**/*.{js.html.css.vue}": "prettier --write",
"src/**/*.{js,vue}" : "eslint --fix"
}
}
現在我們可以執行以下程式碼來測試 lint-staged
npx lint-staged
如果出現 No staged files found.
代表設定成功了,但目前我們的 git 暫存區是沒有任何檔案的。
初始化 husky
現在要在專案初始化 husky,讓我們可以使用 git hook 的功能。
npx husky-init
成功的話會看到以下畫面
並且在你的專案內,應該會看到 .husky
資料夾,並且裡面有一支檔案,叫做 pre-commit
,這就是 git hook,讓我們在 commit 發送後,執行裡面的指令。
所以現在執行 git commit
的話,就會先執行 npm test
。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm test
但我們並不想執行這個指令,所以把它替換為 npx lint-staged
。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
提交檔案
現在我們將 App.vue
的程式碼改成以下
<template>
<div></div>
{{ c }}
<TestComponet />
</template>
<script setup>
const a = ''
const b = ''
const c = 1
const d = c == 1 ? 'a' : 'b'
</script>
如果你是套用我的 ESLint 規則,現在應該會看到以下紅通通的畫面。
而現在我們將 App.vue
使用 git add 新增到暫存區。
git add .\src\App.vue
現在執行以下指令
git commit -m "你的 commit message"
你會發現我們的 commit 失敗了,並且出現以下訊息,告訴我們的 App.vue
有 4 個 errors,1 個 warning,這也就是我們 ESLint 裡面定義的 rules。
現在把 App.vue
的程式碼改成以下,並重新執行 git add
。
<template>
<p>{{ a }}</p>
</template>
<script setup>
const a = 'Hello'
</script>
再次 commit 後,會發現成功提交了。