Node.jsの開発環境で、以下の機能をセットアップする方法について解説します。
- ESLintによるlint
- Prettierによるコードフォーマット
- huskyによるpre-commit git hooks
開発環境を作成する
最初に構築対象となる開発環境を用意します。
$ npm init -y
Wrote to /Users/t0k0sh1/workspace/node_lint/package.json:
{
"name": "node_lint",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
今回の説明とは関係ないため、デフォルトのままで進めます。
パッケージをインストールする
次に必要なパッケージをインストールします。
- eslint – lintツール
- prettier – formatterツール
- eslint-config-prettier – eslintのフォーマットがprettierと競合する場合はeslint側をOFFにする
- husky – pre-commit git hooksツール
$ npm i -D eslint eslint-config-prettier prettier husky
added 85 packages, and audited 86 packages in 4s
15 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
eslint-plugin-prettier
は非推奨になっているため、eslint-config-prettier
を使用しています。
インストール後のpackage.json
は以下のようになっています。
// package.json
{
"name": "node_lint",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.5.0",
"husky": "^7.0.4",
"prettier": "^2.6.2"
}
}
lintの設定を行う
まずはESLintの設定を行います。ここでは必要最低限の設定にしています。prettier
はeslint:recommend
の後に書いてください。
// .eslintrc.json
{
"extends": [
"eslint:recommended",
"prettier"
]
}
次にeslint
でのlint(修正あり)とprettier
でのフォーマットを行うスクリプトを追加します。
// package.json
{
"name": "node_lint",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"lint": "eslint --cache --fix . && prettier --write ."
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.5.0",
"husky": "^7.0.4",
"prettier": "^2.6.2"
}
}
コードを作成して動作確認を行う
実際のコードを作成して動作確認をしておきましょう。
// index.js
function hello(name) {
return 'Hello, ' + name;
}
console.log(hello("John"));
簡単なプログラムを書きました。動作確認ができるようにlintでエラーになるコードになっています。
では動作確認します。
$ node index.js
Hello, John
エラーにならず動作していることを確認できました。
では、このコードに対してlint
とprettier
を実行します。
$ npm run lint
> node_lint@1.0.0 lint
> eslint --cache --fix . && prettier --write .
/Users/t0k0sh1/workspace/node_lint/index.js
6:1 error 'console' is not defined no-undef
✖ 1 problem (1 error, 0 warnings)
console
が未定義であるとエラーになりました。これは後で修正(除去)しますが、今はこのままにしておきます。
ここまでに作成したコードをコミットしておきます。
git init
コマンドでgitリポジトリを初期化します。
$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /Users/t0k0sh1/workspace/node_lint/.git/
コミットするにあたり、node_modules
と.eslintcache
は対象から外したいので、.gitignoreを
作成しておきます。
// .gitignore
node_modules/
.eslintcache
作成したファイルをステージングエリアに追加します。
$ git add .
ローカルリポジトリにコミットしておきます。
$ git commit -m 'first commit'
[master (root-commit) ec47452] first commit
5 files changed, 1682 insertions(+)
create mode 100644 .eslintrc.json
create mode 100644 .gitignore
create mode 100644 index.js
create mode 100644 package-lock.json
create mode 100644 package.json
pre-commit git hooksを設定する
husky
を使ってpre-commit git hooksを設定していきます。手順は公式の手順(https://github.com/typicode/husky)に従いますが、pre-commit
に追加するコマンドがnpm run lint
になっている点にだけ注意してください(公式の手順ではnpm test
)
$ npm set-script prepare "husky install"
$ npm run prepare
> node_lint@1.0.0 prepare
> husky install
husky - Git hooks installed
$ npx husky add .husky/pre-commit "npm run lint"
husky - created .husky/pre-commit
$ git add .husky/pre-commit
手順どおりに進めると、package.json
がステージングエリアに追加されていないため、これを追加してローカルリポジトリにコミットします。
$ git add package.json
$ git commit -m 'setup husky'
> node_lint@1.0.0 lint
> prettier --write '**/*.js' && eslint .
index.js 25ms
/Users/t0k0sh1/workspace/node_lint/index.js
6:1 error 'console' is not defined no-undef
✖ 1 problem (1 error, 0 warnings)
husky - pre-commit hook exited with code 1 (error)
先ほどコマンド実行で確認した時と同じようにconsole
が未定義であるとエラーになりました。
pre-commit
が機能していることを確認できましたが、念のためコミットされていないかを確認しておきます。
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: .husky/pre-commit
modified: package.json
コミットが行われておらず、pre-commit
が正しく動作していることを確認できました。
コードを修正して再度コミットする
コードを修正して再度コミットしましょう。
ここでは単純にconsole.log
関数を削除しておきます。
// index.js
function hello(name) {
return "Hello, " + name;
}
hello("John");
念のため、コマンドで確認しておきます。
$ npm run lint
> node_lint@1.0.0 lint
> eslint --cache --fix . && prettier --write .
.eslintrc.json 20ms
index.js 7ms
package-lock.json 30ms
package.json 6ms
エラーにならないことを確認できましたので、ステージングエリアに追加します。
$ git add index.js
では、再度コミットしましょう。
$ git commit -m 'setup husky'
> node_lint@1.0.0 lint
> prettier --write '**/*.js' && eslint .
index.js 25ms
[master ed5dcae] setup husky
3 files changed, 7 insertions(+), 2 deletions(-)
create mode 100755 .husky/pre-commit
今度はエラーが表示されず、コミットが実行されました。
git status
とgit log
でもコミットされていることを確認します。
git status
On branch master
nothing to commit, working tree clean
$ git log
commit ed5dcae1e5e2487854e78e0d388a2f503324231d (HEAD -> master)
Author: Takashi Yamashina <takashi.yamashina@gmail.com>
Date: Sat Apr 9 12:51:04 2022 +0900
setup husky
commit 15186ea9211ed9d5ee4de9aa7dab7e2e04bac9de
Author: Takashi Yamashina <takashi.yamashina@gmail.com>
Date: Sat Apr 9 12:37:45 2022 +0900
first commit
問題なくコミットできていることが確認できました。