Node.jsプロジェクトのMakefile

npmスクリプトをラップし、install、build、test、lint、開発サーバーターゲットを持つNode.jsプロジェクト用Makefileを作成し、一貫したインターフェースを提供します。

Language-Specific

詳細な説明

なぜNode.jsでMakeを使うのか?

Node.jsプロジェクトは通常package.jsonのnpmスクリプトを使用しますが、Makefileは多言語プロジェクト間で一貫したインターフェース、依存関係の追跡(package.jsonが変更された場合のみ再インストール)、複雑なワークフローの組み合わせ能力を追加します。

依存関係の追跡

node_modules: package.json package-lock.json
	npm ci
	@touch node_modules

install: node_modules

ここがMakeが真に輝く部分です。node_modulesターゲットはpackage.jsonpackage-lock.jsonに依存しています。Makeはどちらかのファイルが変更された場合にのみnpm ciを実行し、繰り返しビルドの時間を節約します。@touchは正確な追跡のためにディレクトリの変更時間を更新します。

ビルドパイプライン

DIST_DIR = dist

build: node_modules
	npm run build

dev: node_modules
	npm run dev

test: node_modules
	npm test

lint: node_modules
	npm run lint

lint-fix: node_modules
	npm run lint -- --fix

各ターゲットはnode_modulesに依存しており、操作の前にパッケージがインストールされていることを保証します。よくある「npm installを実行しましたか?」という質問がなくなります。

プロダクションビルド

.PHONY: production
production: clean install build
	@echo "Production build complete"

productionターゲットはcleaninstallbuildを順番にチェーンし、CI/CDパイプラインに単一のコマンドを提供します。

クリーンターゲット

clean:
	rm -rf $(DIST_DIR) node_modules .next .cache coverage

徹底的なクリーンターゲットはビルド成果物、インストールされたパッケージ、キャッシュディレクトリを削除します。

主な利点

  • make buildはプロジェクトがnpm、yarn、pnpmのいずれを使用していても同じように動作する
  • ターゲット間の依存関係により、パッケージインストール前のテスト実行を防止する
  • ファイルベースの依存関係追跡により不必要なnpm installの実行を回避する

ユースケース

Node.jsモノレポやチームプロジェクトで標準的なビルドインターフェースを提供する場合、またはNode.jsビルドをより大きな多言語ビルドシステムに統合する場合に使用します。

試してみる — Makefile Generator

フルツールを開く