NodeJS 速習チュートリアル

Node.js Linting & Formatting

1. コード品質 (Code Quality)

一貫したコード品質とスタイルを維持することは、特にチーム開発における Node.js プロジェクトにおいて極めて重要です。
これにより、以下のメリットが得られます。

  • コードの可読性とメンテナンス性の向上
  • バグの早期発見と防止
  • チーム内での一貫したコーディングスタイルの確立
  • コードレビューの自動化
  • 開発者エクスペリエンス(DX)の改善

       注意: このガイドでは、リンティングとフォーマットの共通エコシステムを共有している JavaScript と TypeScript の両方のツールセットについて解説します。

2. ESLint: JavaScript/TypeScript のリンティング

ESLint は、JavaScript および TypeScript のコード内のパターンを特定して報告する、もっともポピュラーなリンティングツールです。高度なカスタマイズが可能で、以下の機能をサポートしています。

  • カスタムルールと設定の作成
  • @typescript-eslint/parser による TypeScript サポート
  • フレームワーク固有のルールのためのプラグインエコシステム
  • 一般的な問題の自動修正(Auto-fixing)

2.1 インストール

npm install --save-dev eslint

2.2 包括的な ESLint 設定例

以下は、TypeScript をサポートする Node.js プロジェクト向けの標準的な .eslintrc.json 設定ファイルです。

{
  "env": {
    "node": true,
    "es2021": true,
    "browser": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 12,
    "sourceType": "module"
  },
  "plugins": ["@typescript-eslint"],
  "rules": {
    "semi": ["error", "always"], // セミコロンを必須にする
    "quotes": ["error", "single"], // シングルクォートを使用する
    "indent": ["error", 2], // インデントはスペース2つ
    "no-console": "warn", // console.log は警告を表示
    "no-unused-vars": "warn" // 未使用の変数は警告を表示
  }
}

2.3 ESLint の高度な活用

基本的なリンティング以外にも、ESLint はコード品質を維持するための強力な機能を提供します。

よく使うコマンド:

# すべての JavaScript/TypeScript ファイルをリンティング
npx eslint .

# 自動修正可能な問題を修正
npx eslint --fix .

# 特定のファイルをリンティング
npx eslint src/index.js

3. Prettier: コードフォーマッター

Prettier は、コードをパースし、独自のルールで再出力することで一貫したスタイルを強制する「Opinionated(強いこだわりを持つ)」なコードフォーマッターです。

  • JavaScript、TypeScript、JSX、CSS、SCSS、JSON などをサポート
  • 最小限の設定で済む強力なデフォルト設定
  • ESLint やその他のツールとの統合
  • エディタとの統合サポート

       ヒント: フォーマット(整形)には Prettier を、潜在的なエラーの検出やコードパターンの強制には ESLint を使用するのがベストプラクティスです。

3.1 インストール

npm install --save-dev --save-exact prettier

3.2 包括的な Prettier 設定例

以下は、一般的なオプションを含めた .prettierrc 設定ファイルです。

{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "es5",
  "printWidth": 100,
  "bracketSpacing": true,
  "arrowParens": "avoid"
}

3.3 Prettier の高度な活用

Prettier はワークフローに合わせてカスタマイズや統合が可能です。

よく使うコマンド:

# すべてのファイルを整形
npx prettier --write .

# 変更を加えずにフォーマットをチェック
npx prettier --check .

# 特定のファイルを整形
npx prettier --write src/index.js

4. ESLint + Prettier のシームレスな統合

ESLint と Prettier のルールが衝突するのを防ぐために、適切な統合設定を行う必要があります。

重要: ルールの競合を防ぐために、以下のパッケージをインストールしてください。

npm install --save-dev eslint-config-prettier eslint-plugin-prettier

その後、ESLint の設定を更新します:

{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended" // Prettier 統合を最後に追加
  ]
}

5. エディタの高度な統合

プロのヒント: 生産性を最大化するために、ファイルを保存する際に自動で修正とフォーマットが行われるようエディタを設定しましょう。

5.1 VS Code: 究極のセットアップ

VS Code で最高の開発体験を得るには、以下の手順に従ってください。

  1. 以下の拡張機能をインストールします。
    • ESLint
    • Prettier - Code formatter
    • EditorConfig for VS Code
    • Error Lens (インラインでのエラーハイライト用)
  2. VS Code の settings.json に以下の設定を追加します。
{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"],
  "prettier.requireConfig": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode"
}

5.2 その他のエディタの設定

  • WebStorm/IntelliJ: ESLint と Prettier のサポートが組み込まれています。
  • Atom: linter-eslintprettier-atom パッケージをインストールしてください。
  • Sublime Text: SublimeLinterSublimeLinter-eslint をインストールしてください。

6. Husky と lint-staged による Git フック

コミット前に自動でフォーマットとリンティングを実行する Pre-commit フックを設定することで、不適切なコードがリポジトリに混入するのを防ぎます。

なぜ Pre-commit フックを使うのか? コミット前に自動的にスタイル上の問題を修正することで、チーム全体で一貫したコード品質を保証できるからです。

6.1 インストール

npm install --save-dev husky lint-staged

6.2 設定 (package.json)

{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{json,md,yml}": [
      "prettier --write"
    ]
  }
}

7. 高度なベストプラクティス

7.1 モノリポジトリ (Monorepo) でのセットアップ

モノリポジトリ構造を使用するプロジェクトの場合:

// ルートの package.json
{
  "workspaces": ["packages/*"],
  "scripts": {
    "lint": "yarn workspaces run lint",
    "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\""
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^5.0.0",
    "@typescript-eslint/parser": "^5.0.0",
    "eslint": "^8.0.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "husky": "^7.0.4",
    "lint-staged": "^12.0.0",
    "prettier": "^2.5.0",
    "typescript": "^4.5.0"
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{json,md,yml,yaml}": [
      "prettier --write"
    ]
  }
}

7.2 パフォーマンスの最適化

大規模プロジェクトでは、ESLint のパフォーマンスを最適化しましょう。

// .eslintrc.js
module.exports = {
  cache: true, // キャッシュを有効化
  cacheLocation: '.eslintcache', // キャッシュファイルの場所
  ignorePatterns: ['**/node_modules/**', '**/dist/**'], // 無視するパターン
  parserOptions: {
    project: './tsconfig.json', // TypeScript の場合のみ
    projectFolderIgnoreList: ['**/node_modules/**']
  }
};

7.3 エディタ間の一貫性を保つ EditorConfig

異なるエディタや IDE 間でコーディングスタイルを維持するために、.editorconfig ファイルを追加します。

# EditorConfig の詳細: https://EditorConfig.org
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.{json,yml}]
indent_style = space
indent_size = 2

[*.{cmd,sh}]
indent_style = tab

7.4 CI/CD への統合

CI/CD パイプラインにリンティングとフォーマットのチェックを追加します。

# .github/workflows/ci.yml
name: CI

on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: '16'
      - run: npm ci
      - run: npm run lint
      - run: npm run format:check

8. リンティングのベストプラクティス

  • ベースとなる設定(eslint:recommended など)から始め、必要に応じて拡張する
  • ルールの重要度(errorwarnoff)を一貫させる
  • 例外的なルールがある場合は、コメントでその理由をドキュメント化する
  • ESLint とプラグインのバージョンを定期的にアップデートする
  • TypeScript を使用している場合は、TypeScript 固有のルールを活用する

9. フォーマットのベストプラクティス

  • 1行の長さを適切に保つ(80〜120文字程度)
  • 引用符(シングルまたはダブル)のスタイルを一貫させる
  • セミコロンの使用を一貫させる
  • Diff を綺麗にするために、オブジェクトや配列には末尾のカンマ(Trailing commas)を使用する
  • 保存時に自動フォーマットされるようエディタを設定する

10. チームでのワークフロー

  • ESLint と Prettier の設定をチーム全体で共有する
  • CI/CD パイプラインにリンティングとフォーマットのチェックを組み込む
  • Git フック(Husky)を使用して、問題を早期に発見する
  • コードスタイルの決定事項をドキュメント化する
  • コードスタイルガイドを定期的に見直し、更新する