はじめに
チーム開発において、「シンタックスエラーのあるコードがプッシュされてCIビルドが落ちた」「インデントや改行ルールがバラバラでコードレビューがしづらい」といった課題はよく発生します。
これらのルールをメンバーの「注意」に頼って運用するのは限界があります。
Gitの仕組みである Git Hooks と、それをJavaScript環境で簡単に管理できるツール Husky を導入すれば、コミットやプッシュの直前に自動的に静的解析(ESLint)やコード成形(Prettier)、テスト(Jest等)を実行させ、不正なコードがリポジトリにコミットされるのを防ぐことができます。本記事ではその導入手順を解説します。
1. Git Hooks と Husky とは?
Git Hooksとは、Gitの特定の操作(commit、push、mergeなど)が発生した際に、自作のスクリプトを割り込ませて実行できる標準の仕組みです。
デフォルトでは .git/hooks/ ディレクトリ内にスクリプトを配置する必要がありますが、このディレクトリはGitの管理対象外(.gitignore対象)であるため、チーム内で共有・バージョン管理することが難しいという欠点がありました。
Husky は、Git Hooksの設定をプロジェクトリポジトリ内のディレクトリ(例: .husky/)に保存し、パッケージマネージャ(npm)を通じてチーム全員のPCにフック設定を自動でインストール・同期できるツールです。
2. Huskyの基本的な導入ステップ
プロジェクトフォルダで以下の手順を実施します。
ステップ1: インストールと初期設定
以下のコマンドを実行して、Huskyのインストールとフック用の初期設定を一括で行います。
# Huskyのインストールとセットアップ
npx husky-init && npm install
これにより、以下の変更が加えられます。
package.jsonのdevDependenciesにhuskyが追加される。package.jsonのscriptsに"prepare": "husky"が追加される(これにより、他のメンバーがnpm installした際にも自動的にHuskyが有効化されます)。- プロジェクトルートに
.husky/ディレクトリと、デフォルトのpre-commit(コミット前フック)ファイルが自動生成される。
ステップ2: コミット前フックの設定
生成された .husky/pre-commit ファイルを開くと、デフォルトで npm test が登録されています。これを、コミット前に実行したいコマンド(例: ESLintやPrettier)に書き換えます。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# コミット前にESLintを実行し、エラーがあればコミットを中断する
npm run lint
これで、git commit コマンドを実行した際、自動的に npm run lint が走り、警告やエラーが発生した場合はコミット処理が自動的にキャンセル(ロールバック)されるようになります。
3. lint-staged を使ったパフォーマンスの最適化
上記の基本設定では、プロジェクト内のすべてのファイルに対してLinterが実行されます。プロジェクトの規模が大きくなると、コミットするたびに数分待たされることになり、開発スピードが著しく低下します。
この問題を解決するのが lint-staged です。
lint-stagedを導入すると、「Gitのステージングエリアにある(今回変更された)ファイル」だけを対象にLinterやFormatterを実行することができます。
セットアップ手順
パッケージのインストール:
npm install --save-dev lint-stagedpackage.jsonへの設定追加: 対象とするファイルパターンと、実行するコマンドを記述します。{ "lint-staged": { "*.{js,ts,jsx,tsx}": [ "eslint --fix", "prettier --write" ], "*.css": [ "stylelint --fix", "prettier --write" ] } }.husky/pre-commitの書き換え: Huskyからlint-stagedを起動するように修正します。#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx lint-staged
これで、コミット対象のファイルだけが瞬時に自動整形・検証され、問題がなければそのまま自動でコミットされる快適な開発環境が構築できます。
まとめ
Husky と lint-staged を導入することで、コードの品質チェックを個人の意識から「システムの自動化」へとシフトさせることができます。
- HuskyでGit Hooksをリポジトリ管理する
prepareスクリプトでチームへの自動導入を担保するlint-stagedでステージングされたファイルのみを高速検証する
チーム全体の開発効率とコード品質を高めるために、ぜひプロジェクト初期から導入を検討してみてください。
