Prettierの「requirePragma」を理解する:なぜ必要なのか?

2025-06-06

具体的には、以下のいずれかのコメントがファイル内に記述されている必要があります。

  • @prettier-ignore (この場合、Prettierはそのファイルを無視しますが、requirePragmaが有効であれば、このコメントがないファイルはフォーマット対象外となります)
  • @format
  • @prettier

なぜこの設定があるのか?

主な理由は以下の通りです。

  1. 既存のプロジェクトへの導入時の安全性
    既に大規模なコードベースがあり、Prettierを導入する際に、意図せず全てのファイルを一度にフォーマットしてしまうのを防ぎたい場合に有用です。requirePragmaを有効にしておけば、開発者が手動でプラグマコメントを追加したファイルだけがフォーマットされるため、段階的な導入が可能です。

  2. 特定のファイルのみをフォーマットしたい場合
    プロジェクト内で、特定のファイルだけをPrettierでフォーマットしたいが、他のファイルは既存のフォーマットを維持したいといった場合に役立ちます。

  3. 予期せぬ変更の防止
    Prettierは強力なフォーマッターであり、コードの見た目を大きく変更する可能性があります。requirePragmaを使うことで、開発者が明示的にフォーマットを許可したファイルのみに変更が加えられるため、予期せぬ変更による問題を防ぐことができます。

設定方法

requirePragmaはPrettierの設定ファイル(例: .prettierrcpackage.jsonprettierフィールド)で設定します。

// .prettierrc
{
  "requirePragma": true
}

この設定をtrueにすると、「プラグマコメントがないファイルはフォーマットしない」という挙動になります。デフォルトはfalseで、コメントがなくてもPrettierは全てのファイルをフォーマットしようとします。



Prettier の「Require Pragma」に関する一般的なエラーとトラブルシューティング

Prettier の requirePragma 設定は、ファイルのフォーマットを制御するための便利な機能ですが、正しく設定されていない場合や理解されていない場合にいくつかの一般的な問題が発生することがあります。

エラー: 「ファイルがフォーマットされない(Prettierを実行しても何も起こらない)」

これは requirePragma: true に設定されているにもかかわらず、対象のファイルにプラグマコメントが記述されていない場合に最も頻繁に発生する問題です。

原因

  • フォーマットしたいファイルに @prettier または @format といったプラグマコメントが書かれていない。
  • .prettierrc または package.jsonrequirePragma: true が設定されている。

トラブルシューティング

  1. 設定の確認
    まず、Prettier の設定ファイル(例: .prettierrc, .prettierrc.json, package.json内のprettierフィールドなど)を開き、"requirePragma": true となっているか確認します。
    // .prettierrc
    {
      "requirePragma": true
    }
    
  2. プラグマコメントの追加
    フォーマットしたいファイルの先頭行(または任意の場所)に、以下のいずれかのコメントを追加します。
    // @format
    // または
    // @prettier
    
    JavaScript/TypeScript ファイルの場合:
    // @format
    console.log('Hello, Prettier!');
    
    HTML ファイルの場合:
    <!DOCTYPE html>
    <html>
    <body>
        <h1>Prettier Test</h1>
    </body>
    </html>
    
    CSS ファイルの場合:
    /* @format */
    body {
        margin: 0;
    }
    
  3. requirePragmafalse に変更する(推奨しない場合も): もし、プロジェクト全体で無条件に全てのファイルをPrettierでフォーマットしたいのであれば、requirePragmafalse に設定し直すことも検討できます。ただし、これは requirePragma を設定した意図に反する場合があるため、慎重に検討してください。
    // .prettierrc
    {
      "requirePragma": false
    }
    

エラー: 「@prettier-ignore が機能しない」

@prettier-ignore は特定のコードブロックやファイルを無視するためのプラグマですが、requirePragma と混同されることがあります。

原因

  • requirePragmatrue の場合、ファイルに @prettier-ignore があっても、それは「このファイルをフォーマットする」という指示ではないため、他のプラグマ(@format@prettier)がない限り、そのファイルはフォーマット対象外となります。
  • requirePragma: true の設定は、「プラグマコメントがないファイルをフォーマットしない」というものです。@prettier-ignore は、「このブロック(またはファイル全体)を無視する」という指示です。これらは異なる目的を持っています。

トラブルシューティング

  • もしファイル全体をフォーマットしたくないが、requirePragma: true で運用している場合は、そのファイルに @prettier@format を追加せず、@prettier-ignore を使う必要はありません(なぜなら、元々フォーマットされないため)。
  • @prettier-ignore は、requirePragmafalse の場合や、requirePragma: true でかつファイルに他のプラグマ(@format など)が存在する場合に、特定の箇所をフォーマットから除外するために使用します。

エラー: 「Prettier の拡張機能(VS Codeなど)を使っているのに、保存時にフォーマットされない」

これは多くの場合、上記1のエラー(プラグマコメントの不足)が原因ですが、エディタの設定や他の拡張機能との競合も考えられます。

原因

  • 他のフォーマッター拡張機能(ESLint など)が競合している。
  • VS Code の Prettier 拡張機能が有効になっていない、または「保存時にフォーマット」設定が有効になっていない。
  • 上記1と同じく、requirePragma: true でプラグマコメントがない。

トラブルシューティング

  1. プラグマコメントの追加
    まずは、ファイルに @format または @prettier コメントを追加して、手動で Prettier を実行してみます。
  2. エディタ設定の確認(VS Codeの場合)
    • VS Code の設定(Ctrl+, または Cmd+,)を開きます。
    • "editor.formatOnSave": true が設定されていることを確認します。
    • "editor.defaultFormatter" が Prettier に設定されていることを確認します(例: "editor.defaultFormatter": "esbenp.prettier-vscode")。
    • ワークスペース設定でこれらの設定が上書きされていないか確認します。
  3. 競合する拡張機能の無効化
    他のフォーマッター拡張機能(例: ESLint の自動修正機能など)がPrettierと競合していないか確認します。一時的に無効にして、Prettierが正常に動作するか試します。
    • ESLint を使用している場合は、eslint-config-prettiereslint-plugin-prettier を適切に設定することで、ESLint と Prettier の競合を避けることができます。

誤解: 「requirePragma は Prettier のパフォーマンスを向上させる」

原因

  • requirePragma はパフォーマンスを直接的に向上させるものではありません。フォーマット対象となるファイルを減らすことで、間接的にフォーマット処理にかかる時間を短縮する可能性はありますが、これはパフォーマンスチューニングの主要な手段ではありません。

トラブルシューティング

  • requirePragma の主な目的は、Prettierの導入を安全かつ段階的に行うことです。パフォーマンスが問題となる場合は、--ignore-path を使用して無視するファイルを増やす、またはより高速なハードウェアを使用するなどの別の手段を検討してください。

requirePragma は、Prettier を既存のプロジェクトに段階的に導入する際に非常に役立つ機能です。しかし、この設定が有効になっている場合は、フォーマットしたいファイルに必ずプラグマコメントを追加する必要があることを覚えておくことが重要です。問題が発生した場合は、まず設定ファイルと対象ファイルのプラグマコメントの有無を確認することから始めましょう。 Prettier の requirePragma に関する一般的なエラーとトラブルシューティングについてご説明します。

requirePragma: true を設定した場合、Prettier はファイルの先頭に特定のコメント(プラグマ)がないとファイルをフォーマットしないため、この設定に関連する問題は主に「Prettier がファイルをフォーマットしてくれない」という形で見られます。

よくあるエラーと問題

  1. プラグマコメントの書き忘れ/誤り

    • エラーの状況
      requirePragma: true に設定しているにも関わらず、対象のファイルに @prettier@format といったプラグマコメントを書き忘れている。あるいは、コメントの形式が間違っている。
    • トラブルシューティング
      • ファイルの先頭、通常はJSDoc形式のブロックコメント内、または単一行コメントとして /** @format */// @prettier などのプラグマコメントが正しく記述されているか確認します。
      • @prettier@format 以外の、Prettierが認識しないコメントを使用していないか確認します。
      • プラグマコメントのスペルミスがないか確認します。
  2. プラグマコメントの位置が正しくない

    • エラーの状況
      プラグマコメントがファイルの先頭(または最初のdocblockコメント内)ではない、あるいは他のコメントやコードの後に記述されている。
    • トラブルシューティング
      Prettierは、プラグマコメントがファイルの先頭にあることを期待します。他のコメントやコードの後に記述されていると認識されないことがあります。ファイルの冒頭に移動させてみてください。特に、@flow などの他のプラグマが存在する場合、Prettierのプラグマがその後に来ると認識されないという過去の事例もあります(現在は改善されている可能性もありますが、先頭付近が確実です)。
  3. insertPragma オプションとの混同

    • エラーの状況
      insertPragma オプションと requirePragma オプションの役割を混同している。
    • トラブルシューティング
      • insertPragma: true は、Prettierがフォーマットを実行する際に、ファイルの先頭にプラグマコメントを自動的に挿入するためのオプションです。これは、requirePragma: true とは独立した機能です。
      • requirePragma: true の場合、Prettierはプラグマがないとフォーマットしません。つまり、プラグマを挿入したい場合は、requirePragma を一時的に false にするか、手動でプラグマを追加してからPrettierを実行する必要があります。既存のファイルを一度にフォーマットし、プラグマを追加したい場合は、CLIで --insert-pragma フラグを使用するのが便利です(例: prettier --write "src/**/*.js" --insert-pragma)。
  4. キャッシュの問題

    • エラーの状況
      過去のPrettierのキャッシュが原因で、設定変更が反映されない。
    • トラブルシューティング
      Prettierのキャッシュをクリアしてみます。CLIで --no-cache オプションを付けて実行するか、Prettierのキャッシュファイル(通常は node_modules/.cache/prettier/.prettier-cache など)を直接削除します。
  5. Prettierのバージョンが古い

    • エラーの状況
      古いバージョンのPrettierでは、現在の設定や期待する動作がサポートされていない場合がある。
    • トラブルシューティング
      Prettierを最新バージョンにアップデートします。npm install prettier@latest または yarn add prettier@latest
  • prettier --check の活用
    フォーマットされるべきファイルが正しく認識されているかを確認するために、prettier --check "path/to/file.js" コマンドを使用すると、フォーマットが必要なファイルがあればそのパスが表示されます。
  • シンプルなプロジェクトで再現
    問題が複雑な設定や複数のツール(ESLintなど)との連携によるものではないか確認するため、最小限のファイルと設定でPrettierを試してみると原因の切り分けがしやすくなります。
  • VS Codeの場合
    • 「Output」パネルで「Prettier」を選択し、出力ログを確認します。
    • 「Format Document With...」コマンド(Ctrl+Shift+P または Cmd+Shift+P で検索)でPrettierがデフォルトのフォーマッターとして選択されていることを確認します。
    • settings.json にて、言語ごとのデフォルトフォーマッターが設定されているか確認します(例: "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" })。
  • 詳細なログの確認
    Prettierの実行時に PRETTIER_DEBUG=true のように環境変数を設定すると、より詳細なデバッグ情報が出力されることがあります。エディタのPrettier拡張機能を使用している場合は、その拡張機能の出力ログを確認します。


Prettier の requirePragma に関連するプログラミング例として、主に以下の2つの側面から見ていきます。

  1. Prettier の設定ファイルにおける requirePragma の指定
  2. requirePragma: true の場合に Prettier がファイルをフォーマットするための、コード内でのプラグマコメントの記述例

Prettier の設定ファイルにおける requirePragma の指定

Prettier の設定ファイルは、.prettierrc.prettierrc.jsonpackage.json など様々ですが、ここでは一般的な .prettierrc.json を例に取ります。

例1: requirePragma: true (プラグマコメントがないとフォーマットしない)

// .prettierrc.json
{
  "semi": true,
  "singleQuote": true,
  "printWidth": 80,
  "requirePragma": true // ここが重要: プラグマコメントがないとフォーマットされない
}

この設定の場合、Prettier はファイルの先頭に @prettier または @format などのプラグマコメントがないファイルをフォーマットしません。

例2: requirePragma: false (デフォルト: プラグマコメントがなくてもフォーマットする)

// .prettierrc.json
{
  "semi": true,
  "singleQuote": true,
  "printWidth": 80,
  "requirePragma": false // ここが重要: プラグマコメントがなくてもフォーマットされる
}

これは Prettier のデフォルトの挙動であり、ほとんどの新規プロジェクトではこの設定(または requirePragma を省略する)が使われます。

requirePragma: true が設定されている場合、Prettier にファイルをフォーマットさせるためには、そのファイルのどこかに特定の「プラグマコメント」を記述する必要があります。通常、ファイルの先頭付近に記述します。

JavaScript / TypeScript / JSX / TSX の場合

例 A: JSDoc スタイルのブロックコメントで記述

最も一般的で推奨される形式です。

/**
 * @format
 */

// または
/**
 * @prettier
 */

// または、他のJSDocタグと組み合わせる場合
/**
 * このファイルはPrettierによってフォーマットされます。
 * @param {string} name - 名前
 * @returns {string} 挨拶メッセージ
 * @prettier
 */
function greet(name) {
  return `Hello, ${name}!`;
}

例 B: 単一行コメントで記述

// @format

// または
// @prettier

const x = 10;
const y = 20;

if (x > y) {
  console.log("x is greater");
} else {
  console.log("y is greater or equal");
}

HTML / Vue / Angular (テンプレート部分) の場合

HTMLコメントを使用します。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>Welcome</h1>
    <p>This is a paragraph.</p>
  </body>
</html>

CSS / SCSS / Less の場合

CSSのコメント形式を使用します。

/*
  @format
*/

/* または */
/* @prettier */

body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 20px;
}

h1 {
  color: #333;
}

Markdown の場合

MarkdownファイルでPrettierを適用する場合も、HTMLコメント形式を使用できます。

# これはタイトルです

## サブタイトル

これは**Markdown**の例です。

- リストアイテム1
- リストアイテム2

requirePragma と混同されやすいオプションに insertPragma があります。

  • insertPragma: true: フォーマットしたファイルにプラグマコメントを自動的に「挿入する」。
  • requirePragma: true: プラグマコメントがないとフォーマット「しない」。

例えば、既存のたくさんのファイルに一括でプラグマコメントを挿入したい場合、以下のように Prettier CLI を実行できます。

prettier --write "src/**/*.{js,jsx,ts,tsx,html,css}" --insert-pragma

このコマンドは、指定された拡張子のファイル全てをPrettierでフォーマットし、もしファイルがフォーマットされたら、自動的にファイルの先頭に /** @format */ または // @format のようなプラグマコメントを挿入します。これは、requirePragma: true を導入する前の「準備」として非常に便利です。



.prettierignore ファイルを使用する(推奨)

これは requirePragma の最も直接的かつ一般的な代替方法であり、多くの場合、こちらのアプローチが推奨されます。

  • 使い方
    プロジェクトのルートディレクトリに .prettierignore という名前のファイルを作成し、無視したいファイルやディレクトリのパスを記述します。


    # .prettierignore
    build/
    dist/
    node_modules/
    coverage/
    *.min.js
    src/legacy-code/ # このディレクトリ内のファイルはフォーマットしない
    

    この設定により、build/node_modules/ 内のファイル、.min.js 拡張子のファイル、src/legacy-code/ ディレクトリ内のファイルは、Prettier によってフォーマットされなくなります。

    • requirePragma のように各ファイルにコメントを記述する必要がないため、非常に管理が容易です。
    • 無視したいファイルを一元的に管理できます。
    • 特定のディレクトリ全体を無視したり、特定の拡張子を持つファイルだけを無視したりと、柔軟な設定が可能です。
    • デフォルトでPrettierがフォーマットする全てのファイルを対象とし、除外したいものだけを明示的に指定するという「ホワイトリスト」または「ブラックリスト」形式の運用が可能です。

CLI オプションで特定のファイルのみを対象とする

Prettier をコマンドラインから実行する際に、対象とするファイルを明示的に指定する方法です。

  • 考慮点
    この方法は、エディタのPrettier拡張機能による自動フォーマットには直接影響しません。エディタの挙動を制御したい場合は、上記 .prettierignore や後述の「エディタのファイル関連付け」などを検討する必要があります。

  • 使い方


    # src ディレクトリ内の全ての .js ファイルをフォーマットする
    prettier --write "src/**/*.js"
    
    # components ディレクトリ内の .tsx ファイルのみをフォーマットする
    prettier --write "src/components/**/*.tsx"
    
    # 新しく追加・変更されたファイルだけをフォーマットする(Gitと組み合わせる)
    # 例: git diff --name-only --cached --diff-filter=ACM | xargs prettier --write --ignore-unknown
    
  • 利点

    • 設定ファイルを変更することなく、一時的に特定のファイルだけをフォーマットしたい場合に便利です。
    • CI/CD パイプラインなどで、特定のサブセットのファイルだけをフォーマットするスクリプトを組む際に役立ちます。

エディタの設定でファイル関連付けを制御する

VS Code などのエディタには、ファイル拡張子や特定のパスに基づいてフォーマッターを適用するかどうかを制御する設定があります。

  • 考慮点
    この設定はエディタに依存するため、チーム全体でフォーマットルールを共有する目的には適していません。チーム全体で共有すべき設定は、.prettierignore や Prettier の設定ファイル (.prettierrc) で行うべきです。

  • 使い方 (VS Code の例)

    例 A: 特定の言語のフォーマッターを無効にする

    // .vscode/settings.json またはユーザー設定
    {
      "javascript.format.enable": false, // JavaScriptの組み込みフォーマッターを無効にする
      "typescript.format.enable": false, // TypeScriptの組み込みフォーマッターを無効にする
      "prettier.disableLanguages": ["html", "css"] // PrettierによるHTMLとCSSのフォーマットを無効にする
    }
    

    例 B: デフォルトフォーマッターを制御する(推奨されないが、代替案として) 特定の言語でPrettier以外のフォーマッターを使いたい場合など。

    // .vscode/settings.json
    {
      "[javascript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode" // JavaScriptファイルのデフォルトフォーマッターをPrettierに設定
      },
      "[typescript]": {
        "editor.defaultFormatter": null // TypeScriptファイルのデフォルトフォーマッターを設定しない
      }
    }
    
  • 利点

    • エディタの自動フォーマット機能を細かく制御できます。
    • プロジェクト全体の設定とは別に、個人の開発環境で特定のファイルをフォーマット対象外にしたい場合に有用です。

Git フック(特に pre-commit フック)を利用して、コミット前に変更されたファイルのみを Prettier でフォーマットするアプローチです。

  • 使い方 (Husky + lint-staged の例)

    1. インストール
      npm install --save-dev husky lint-staged prettier
      
    2. package.json に設定を追加
      // package.json
      {
        "name": "my-project",
        "version": "1.0.0",
        "scripts": {
          "format": "prettier --write ."
        },
        "devDependencies": {
          "husky": "^9.0.0",
          "lint-staged": "^15.0.0",
          "prettier": "^3.0.0"
        },
        "husky": {
          "hooks": {
            "pre-commit": "lint-staged"
          }
        },
        "lint-staged": {
          "*.{js,jsx,ts,tsx,json,css,md}": "prettier --write"
          // または、prettier --check を使ってフォーマットエラーがあればコミットをブロックすることも可能
          // "*.{js,jsx,ts,tsx,json,css,md}": "prettier --check"
        }
      }
      
    3. Husky の有効化
      npx husky install
      

    これにより、git commit を実行する前に、ステージングされたファイルのうち、lint-staged で指定された拡張子のファイルに対して prettier --write が実行されます。

  • 利点

    • requirePragma がなくても、変更されたファイルだけがフォーマットされるため、CI/CD パイプラインでのフォーマットチェックが効率的になります。
    • 開発者がフォーマットし忘れても、コミット時に自動的に修正されるため、コードベースのフォーマットの一貫性を保ちやすくなります。

requirePragma: true は特定のニッチなユースケース(特に段階的な移行)で有用ですが、多くの場合、以下の代替手段がより効率的で管理しやすいでしょう。

  1. デフォルトの requirePragma: false のまま、.prettierignore を使って無視するファイルを明示する。 これが最も一般的で推奨されるアプローチです。
  2. Git フック(husky + lint-staged)を使って、コミット時に変更されたファイルのみをフォーマットする。 これにより、コードベース全体のフォーマット一貫性を保ちつつ、開発者の手間を最小限に抑えられます。