はじめに
コードを作るときには(基本的には)複数のチェック(?)を通す必要がある。
なんか色々あってよくわからん!ってなってきたので理解しようと思った。
Node.jsでよく設定するスクリプト
まずはnpmのスクリプト設定について知っておこうと思い、package.jsonの例についてGPT-5.6 Lunaに聞いてみた。
Node.js の小規模なプロジェクトなら、まずは次の構成が扱いやすいです。
"scripts": { "start": "node src/index.js", "dev": "node --watch src/index.js", "test": "node --test", "lint": "eslint .", "format": "prettier --write .", "typecheck": "tsc --noEmit", "build": "tsc" }
追加するなら、プロジェクトの種類に応じて次のようなスクリプトがあります。
"scripts": { "start": "node src/index.js", "dev": "node --watch src/index.js", "test": "node --test", "test:watch": "node --test --watch", "test:coverage": "c8 npm test", "lint": "eslint .", "lint:fix": "eslint . --fix", "format": "prettier --write .", "format:check": "prettier --check .", "typecheck": "tsc --noEmit", "build": "tsc", "clean": "rm -rf dist", "prepare": "husky" }
とりあえずtest、lint、format、typecheck、buildあたりは設定しておくべきということらしい(場合によるとは思うが)。
それぞれ見ていきたい。
test
testは、テストコードを実行して期待どおりに動作するかどうかを確かめる。
JavaScriptやTypeScriptでは、Node.js組み込みのテストランナー(上記の例)、Jest、Vitestなどがある。
PythonだとPytestとか、JavaだとJUnitとかがよく使われる。
仕様どおりに動作するかを確かめるために、開発者がテストコードを書いて実行するのがtestの役割である。
JS、TSにおけるテストパッケージ間の違いについては、こちらを参照のこと。
lint
コードの静的解析を行い、構文エラーやコーディング規約違反、潜在的なバグにつながる問題を検出する。
コードの品質改善を目的としたツール。
lintの原義は「糸くず」で、C言語のlintが始まり(現在もコマンドとしてlintは残っている)。
TypeScriptならESLint、Pythonならflake8、JavaならPMD、Checkstyle、SpotBugsなどがよく使われる。
format
インデントや行の最大文字数などを、決められた形式に整える。
lintはコーディング規約違反を指摘するが、formatterはコーディング規約に従ってコードを修正する。
TypeScriptならprettier(linterと一緒になったBiomeを使うこともある)、PythonならBlack、isortとかがよく使われる。
typecheck
特にTypeScriptの場合、JavaScriptにトランスパイルすると型の情報が消えるといった制約があるため、型が正しく使われているかを確認したほうがよい。
それを行うのがtypecheckである。
ビルドをすればわかるとはいえ、ビルドに時間がかかる、ビルド前に確認したい(CIとか)など、ビルドをせずとも型チェックだけ行ったほうが良い場合も多い。
tsc --noEmitがよく使われる。
build
実際に本番環境で動かせる形にコードを変換・生成できるかを確かめる。
必ずしも実行ファイルを作ることを意味しない(インタプリタ型の言語の場合には実行ファイルは作られない)。
少なくとも実行可能な成果物を生成できることは確認できるが、その動作自体の整合性やバグの有無などは保証されない。
それぞれの違い
| コマンド | 主に確認すること | コードを実行するか |
|---|---|---|
lint |
書き方やバグになりやすいパターン | 基本的に実行しない |
format |
コードの見た目 | 実行しない |
typecheck |
型の整合性 | 基本的に実行しない |
test |
期待した動作をするか | テストコードを実行する |
build |
配布・実行できる形に変換できるか | プロジェクトによる |
(TypeScriptの場合の)基本的な実行順
npm run format
npm run lint
npm run typecheck
npm test
npm run build
終わりに
基本的にはTypeScriptの場合の話になったが、それぞれの差に関しては理解することができた。