12k
All articles

ビルドとスタートだけではない、NPMスクリプトの実践的な活用法

NPMスクリプトはビルドだけでなく、リント、テスト、リリース管理にも活用できる。cross-envやrimrafを使えば、クロスプラットフォームで一貫したワークフローを維持できる。

OpenReplay Team
OpenReplay Team
ビルドとスタートだけではない、NPMスクリプトの実践的な活用法

フロントエンド開発者は多くの場合、シンプルなnpm run buildnpm run startコマンドから始めますが、NPMスクリプトはワークフローにおいてもっと多くのことを実現できます。NPMスクリプトを活用することで、反復的なタスクを自動化し、開発を効率化し、プロジェクトの保守性を向上させることができます。

重要なポイント

  • NPMスクリプトは、フロントエンドワークフローを自動化するシンプルで依存関係のない方法を提供します
  • pre/postフックを使用して、複雑な構文なしでコマンドを連鎖させることができます
  • クロスプラットフォームユーティリティを活用して、すべてのチームメンバーでスクリプトが動作することを保証します
  • 複雑なワークフローには、npm-run-allで複数のスクリプトを組み合わせます
  • 動的なスクリプトのために、環境変数を通じてpackage.jsonデータにアクセスします

NPMスクリプトとは何か、なぜ使用するのか?

NPMスクリプトは、package.jsonファイルの"scripts"セクションで定義されるカスタムコマンドです。グローバルパッケージや複雑なビルドツールをインストールすることなく、コマンドラインツールを実行し、タスクを自動化するシンプルな方法を提供します。

{
  "name": "my-project",
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build"
  }
}

GulpやGruntなどのタスクランナーと比較したNPMスクリプトの主な利点:

  • 設定不要: 任意のnpmプロジェクトですぐに使用可能
  • CLIツールへの直接アクセス: 抽象化レイヤーやプラグインを心配する必要がない
  • 依存関係の追跡: ツールがプロジェクトの依存関係としてインストールされ、全員が同じバージョンを使用することを保証
  • 簡素化されたワークフロー: 別のツールの構文を学ぶ必要がない

フロントエンド開発者のための10の実践的NPMスクリプト

1. コードのリンティングとフォーマット

一貫したコードスタイルは可読性を向上させ、エラーを減らします。コードを自動的にリントし、フォーマットするためのスクリプトを追加しましょう:

"scripts": {
  "lint": "eslint src/**/*.js",
  "lint:fix": "eslint src/**/*.js --fix",
  "format": "prettier --write \"src/**/*.{js,jsx,css,scss,json}\""
}

npm run lintを実行して問題をチェックするか、npm run formatでコードを自動的にフォーマットします。

2. ビルドディレクトリのクリーンアップ

新しいビルドを作成する前に、以前のビルド成果物をクリーンアップします:

"scripts": {
  "clean": "rimraf dist",
  "prebuild": "npm run clean",
  "build": "webpack"
}

prebuildスクリプトはbuildの前に自動的に実行され、毎回クリーンな状態を保証します。

3. 異なる設定でのテスト実行

さまざまなシナリオ用に複数のテストスクリプトを作成します:

"scripts": {
  "test": "jest",
  "test:watch": "jest --watch",
  "test:coverage": "jest --coverage",
  "test:e2e": "cypress run"
}

4. 環境変数の管理

開発、テスト、本番環境用に異なる環境を設定します:

"scripts": {
  "dev": "cross-env NODE_ENV=development webpack serve",
  "build:dev": "cross-env NODE_ENV=development webpack",
  "build:prod": "cross-env NODE_ENV=production webpack"
}

cross-envパッケージは、これらのスクリプトが異なるオペレーティングシステムで動作することを保証します。

5. 変更の監視

ファイルが変更されたときに自動的に再ビルドします:

"scripts": {
  "watch:css": "sass --watch src/styles:dist/styles",
  "watch:js": "webpack --watch",
  "watch": "npm-run-all --parallel watch:*"
}

npm-run-allパッケージは、複数のスクリプトを並列で実行することを可能にします。

6. 環境ファイルの同期

環境テンプレートファイルをコピーするスクリプトを作成します:

"scripts": {
  "sync-env": "node -e \"require('fs').copyFileSync('.env.example', '.env', fs.constants.COPYFILE_EXCL)\"",
  "postinstall": "npm run sync-env"
}

postinstallフックはnpm installの後に自動的に実行され、新しいチームメンバーが環境ファイルを取得することを保証します。

7. パッケージ依存関係の検証

古い、重複した、または脆弱な依存関係をチェックします:

"scripts": {
  "check:deps": "npm outdated",
  "check:security": "npm audit",
  "check:duplicates": "npx depcheck"
}

8. ドキュメントの生成

コードコメントから自動的にドキュメントを生成します:

"scripts": {
  "docs": "jsdoc -c jsdoc.json",
  "predeploy": "npm run docs"
}

9. カスタムリリースワークフロー

バージョニングとリリースを自動化します:

"scripts": {
  "version:patch": "npm version patch",
  "version:minor": "npm version minor",
  "version:major": "npm version major",
  "release": "npm run build && npm publish"
}

10. アセットの最適化

画像やその他のアセットを圧縮します:

"scripts": {
  "optimize:images": "imagemin src/images/* --out-dir=dist/images",
  "prebuild": "npm run clean && npm run optimize:images"
}

高度なNPMスクリプトテクニック

Pre/Postフックによるスクリプトの連鎖

NPMは「pre」または「post」で始まるスクリプトを、メインスクリプトの前後に自動的に実行します:

"scripts": {
  "prebuild": "npm run lint",
  "build": "webpack",
  "postbuild": "npm run test"
}

npm run buildを実行すると、自動的にprebuildbuildpostbuildの順で実行されます。

スクリプトへの引数の渡し方

--を使用してスクリプトに引数を渡します:

npm run lint -- --fix

これにより、--fixフラグが実際のリンティングコマンドに渡されます。

スクリプトでの環境変数の使用

環境変数を通じてpackage.jsonデータにアクセスします:

"scripts": {
  "echo-version": "echo $npm_package_version"
}

npm run echo-versionを実行すると、パッケージバージョンが出力されます。

クロスプラットフォーム互換性

以下のツールを使用して、すべてのオペレーティングシステムでスクリプトが動作することを保証します:

  1. rimraf - rm -rfのクロスプラットフォーム代替
  2. cross-env - プラットフォーム間で環境変数を設定
  3. npm-run-all - 複数のスクリプトを順次または並列で実行

クロスプラットフォームスクリプトの例:

"scripts": {
  "clean": "rimraf dist",
  "copy": "copyfiles -u 1 src/**/*.html dist",
  "dev": "cross-env NODE_ENV=development npm-run-all clean copy --parallel watch:*"
}

実例:完全なフロントエンドワークフロー

モダンなフロントエンドプロジェクトのための包括的なスクリプトセットです:

{
  "scripts": {
    "clean": "rimraf dist",
    "lint:js": "eslint src/**/*.js --fix",
    "lint:css": "stylelint src/**/*.scss --fix",
    "lint": "npm-run-all --parallel lint:*",
    "test": "jest",
    "test:watch": "jest --watch",
    "format": "prettier --write \"src/**/*.{js,jsx,scss,json,md}\"",
    "validate": "npm-run-all --parallel lint test",
    "build:css": "sass src/styles:dist/styles --style compressed",
    "build:js": "webpack --mode production",
    "build": "npm-run-all clean lint --parallel build:*",
    "watch:css": "sass --watch src/styles:dist/styles",
    "watch:js": "webpack --watch",
    "serve": "browser-sync start --server dist --files dist",
    "dev": "npm-run-all clean --parallel watch:* serve",
    "prepublish": "npm run build",
    "version": "npm run format && git add -A src",
    "postversion": "git push && git push --tags"
  }
}

この設定により以下が提供されます:

  • リンティングとテストによるコード品質チェック
  • 自動フォーマット
  • 本番環境用の最適化されたビルド
  • ホットリロード付きの開発サーバー
  • バージョン管理と公開ワークフロー

まとめ

これらの実践的なNPMスクリプトを実装することで、開発プロセスを効率化し、コード品質を向上させ、プロジェクトの保守性を高めることができます。最も頻繁に実行するタスクのスクリプトを追加することから始めて、徐々に自動化ツールキットを拡張していきましょう。

よくある質問

NPMスクリプトはGulpなどのタスクランナーと比較してどうですか?

NPMスクリプトはよりシンプルで、プラグインが不要で、設定もゼロです。単純なタスクには理想的ですが、きめ細かい制御が必要な複雑なビルドプロセスにはGulpの方が適している場合があります。

NPMスクリプトをデバッグできますか?

はい、詳細な出力を見るには--loglevel verboseを追加するか、さらに詳しい情報が必要な場合はdebugパッケージで'npm run debug'を使用してください。

複数のスクリプトを並列で実行するにはどうすればよいですか?

npm-run-allパッケージを--parallelフラグと一緒に使用します:npm-run-all --parallel script1 script2。

NPMスクリプトでワイルドカードを含める最良の方法は何ですか?

NPMスクリプトでワイルドカードを安全に使用するには、シェル展開を防ぐためにパターンを引用符で囲みます。これにより、スクリプトが異なる環境やシェル設定で確実に動作します。

スクリプトでpackage.jsonの値にアクセスするにはどうすればよいですか?

NPMはそれらを環境変数として公開します:$npm_package_name、$npm_package_versionなど。

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers

We use cookies to improve your experience. By using our site, you accept cookies.