Prettierの「requirePragma」を理解する:なぜ必要なのか?
具体的には、以下のいずれかのコメントがファイル内に記述されている必要があります。
@prettier-ignore
(この場合、Prettierはそのファイルを無視しますが、requirePragma
が有効であれば、このコメントがないファイルはフォーマット対象外となります)@format
@prettier
なぜこの設定があるのか?
主な理由は以下の通りです。
-
既存のプロジェクトへの導入時の安全性
既に大規模なコードベースがあり、Prettierを導入する際に、意図せず全てのファイルを一度にフォーマットしてしまうのを防ぎたい場合に有用です。requirePragma
を有効にしておけば、開発者が手動でプラグマコメントを追加したファイルだけがフォーマットされるため、段階的な導入が可能です。 -
特定のファイルのみをフォーマットしたい場合
プロジェクト内で、特定のファイルだけをPrettierでフォーマットしたいが、他のファイルは既存のフォーマットを維持したいといった場合に役立ちます。 -
予期せぬ変更の防止
Prettierは強力なフォーマッターであり、コードの見た目を大きく変更する可能性があります。requirePragma
を使うことで、開発者が明示的にフォーマットを許可したファイルのみに変更が加えられるため、予期せぬ変更による問題を防ぐことができます。
設定方法
requirePragma
はPrettierの設定ファイル(例: .prettierrc
やpackage.json
のprettier
フィールド)で設定します。
// .prettierrc
{
"requirePragma": true
}
この設定をtrue
にすると、「プラグマコメントがないファイルはフォーマットしない」という挙動になります。デフォルトはfalse
で、コメントがなくてもPrettierは全てのファイルをフォーマットしようとします。
Prettier の「Require Pragma」に関する一般的なエラーとトラブルシューティング
Prettier の requirePragma
設定は、ファイルのフォーマットを制御するための便利な機能ですが、正しく設定されていない場合や理解されていない場合にいくつかの一般的な問題が発生することがあります。
エラー: 「ファイルがフォーマットされない(Prettierを実行しても何も起こらない)」
これは requirePragma: true
に設定されているにもかかわらず、対象のファイルにプラグマコメントが記述されていない場合に最も頻繁に発生する問題です。
原因
- フォーマットしたいファイルに
@prettier
または@format
といったプラグマコメントが書かれていない。 .prettierrc
またはpackage.json
でrequirePragma: true
が設定されている。
トラブルシューティング
- 設定の確認
まず、Prettier の設定ファイル(例:.prettierrc
,.prettierrc.json
,package.json
内のprettier
フィールドなど)を開き、"requirePragma": true
となっているか確認します。// .prettierrc { "requirePragma": true }
- プラグマコメントの追加
フォーマットしたいファイルの先頭行(または任意の場所)に、以下のいずれかのコメントを追加します。
JavaScript/TypeScript ファイルの場合:// @format // または // @prettier
HTML ファイルの場合:// @format console.log('Hello, Prettier!');
CSS ファイルの場合:<!DOCTYPE html> <html> <body> <h1>Prettier Test</h1> </body> </html>
/* @format */ body { margin: 0; }
requirePragma
をfalse
に変更する(推奨しない場合も): もし、プロジェクト全体で無条件に全てのファイルをPrettierでフォーマットしたいのであれば、requirePragma
をfalse
に設定し直すことも検討できます。ただし、これはrequirePragma
を設定した意図に反する場合があるため、慎重に検討してください。// .prettierrc { "requirePragma": false }
エラー: 「@prettier-ignore が機能しない」
@prettier-ignore
は特定のコードブロックやファイルを無視するためのプラグマですが、requirePragma
と混同されることがあります。
原因
requirePragma
がtrue
の場合、ファイルに@prettier-ignore
があっても、それは「このファイルをフォーマットする」という指示ではないため、他のプラグマ(@format
や@prettier
)がない限り、そのファイルはフォーマット対象外となります。requirePragma: true
の設定は、「プラグマコメントがないファイルをフォーマットしない」というものです。@prettier-ignore
は、「このブロック(またはファイル全体)を無視する」という指示です。これらは異なる目的を持っています。
トラブルシューティング
- もしファイル全体をフォーマットしたくないが、
requirePragma: true
で運用している場合は、そのファイルに@prettier
や@format
を追加せず、@prettier-ignore
を使う必要はありません(なぜなら、元々フォーマットされないため)。 @prettier-ignore
は、requirePragma
がfalse
の場合や、requirePragma: true
でかつファイルに他のプラグマ(@format
など)が存在する場合に、特定の箇所をフォーマットから除外するために使用します。
エラー: 「Prettier の拡張機能(VS Codeなど)を使っているのに、保存時にフォーマットされない」
これは多くの場合、上記1のエラー(プラグマコメントの不足)が原因ですが、エディタの設定や他の拡張機能との競合も考えられます。
原因
- 他のフォーマッター拡張機能(ESLint など)が競合している。
- VS Code の Prettier 拡張機能が有効になっていない、または「保存時にフォーマット」設定が有効になっていない。
- 上記1と同じく、
requirePragma: true
でプラグマコメントがない。
トラブルシューティング
- プラグマコメントの追加
まずは、ファイルに@format
または@prettier
コメントを追加して、手動で Prettier を実行してみます。 - エディタ設定の確認(VS Codeの場合)
- VS Code の設定(
Ctrl+,
またはCmd+,
)を開きます。 "editor.formatOnSave": true
が設定されていることを確認します。"editor.defaultFormatter"
が Prettier に設定されていることを確認します(例:"editor.defaultFormatter": "esbenp.prettier-vscode"
)。- ワークスペース設定でこれらの設定が上書きされていないか確認します。
- VS Code の設定(
- 競合する拡張機能の無効化
他のフォーマッター拡張機能(例: ESLint の自動修正機能など)がPrettierと競合していないか確認します。一時的に無効にして、Prettierが正常に動作するか試します。- ESLint を使用している場合は、
eslint-config-prettier
やeslint-plugin-prettier
を適切に設定することで、ESLint と Prettier の競合を避けることができます。
- ESLint を使用している場合は、
誤解: 「requirePragma は Prettier のパフォーマンスを向上させる」
原因
requirePragma
はパフォーマンスを直接的に向上させるものではありません。フォーマット対象となるファイルを減らすことで、間接的にフォーマット処理にかかる時間を短縮する可能性はありますが、これはパフォーマンスチューニングの主要な手段ではありません。
トラブルシューティング
requirePragma
の主な目的は、Prettierの導入を安全かつ段階的に行うことです。パフォーマンスが問題となる場合は、--ignore-path
を使用して無視するファイルを増やす、またはより高速なハードウェアを使用するなどの別の手段を検討してください。
requirePragma
は、Prettier を既存のプロジェクトに段階的に導入する際に非常に役立つ機能です。しかし、この設定が有効になっている場合は、フォーマットしたいファイルに必ずプラグマコメントを追加する必要があることを覚えておくことが重要です。問題が発生した場合は、まず設定ファイルと対象ファイルのプラグマコメントの有無を確認することから始めましょう。
Prettier の requirePragma
に関する一般的なエラーとトラブルシューティングについてご説明します。
requirePragma: true
を設定した場合、Prettier はファイルの先頭に特定のコメント(プラグマ)がないとファイルをフォーマットしないため、この設定に関連する問題は主に「Prettier がファイルをフォーマットしてくれない」という形で見られます。
よくあるエラーと問題
-
プラグマコメントの書き忘れ/誤り
- エラーの状況
requirePragma: true
に設定しているにも関わらず、対象のファイルに@prettier
や@format
といったプラグマコメントを書き忘れている。あるいは、コメントの形式が間違っている。 - トラブルシューティング
- ファイルの先頭、通常はJSDoc形式のブロックコメント内、または単一行コメントとして
/** @format */
や// @prettier
などのプラグマコメントが正しく記述されているか確認します。 @prettier
や@format
以外の、Prettierが認識しないコメントを使用していないか確認します。- プラグマコメントのスペルミスがないか確認します。
- ファイルの先頭、通常はJSDoc形式のブロックコメント内、または単一行コメントとして
- エラーの状況
-
プラグマコメントの位置が正しくない
- エラーの状況
プラグマコメントがファイルの先頭(または最初のdocblockコメント内)ではない、あるいは他のコメントやコードの後に記述されている。 - トラブルシューティング
Prettierは、プラグマコメントがファイルの先頭にあることを期待します。他のコメントやコードの後に記述されていると認識されないことがあります。ファイルの冒頭に移動させてみてください。特に、@flow
などの他のプラグマが存在する場合、Prettierのプラグマがその後に来ると認識されないという過去の事例もあります(現在は改善されている可能性もありますが、先頭付近が確実です)。
- エラーの状況
-
insertPragma
オプションとの混同- エラーの状況
insertPragma
オプションとrequirePragma
オプションの役割を混同している。 - トラブルシューティング
insertPragma: true
は、Prettierがフォーマットを実行する際に、ファイルの先頭にプラグマコメントを自動的に挿入するためのオプションです。これは、requirePragma: true
とは独立した機能です。requirePragma: true
の場合、Prettierはプラグマがないとフォーマットしません。つまり、プラグマを挿入したい場合は、requirePragma
を一時的にfalse
にするか、手動でプラグマを追加してからPrettierを実行する必要があります。既存のファイルを一度にフォーマットし、プラグマを追加したい場合は、CLIで--insert-pragma
フラグを使用するのが便利です(例:prettier --write "src/**/*.js" --insert-pragma
)。
- エラーの状況
-
キャッシュの問題
- エラーの状況
過去のPrettierのキャッシュが原因で、設定変更が反映されない。 - トラブルシューティング
Prettierのキャッシュをクリアしてみます。CLIで--no-cache
オプションを付けて実行するか、Prettierのキャッシュファイル(通常はnode_modules/.cache/prettier/.prettier-cache
など)を直接削除します。
- エラーの状況
-
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つの側面から見ていきます。
- Prettier の設定ファイルにおける
requirePragma
の指定 requirePragma: true
の場合に Prettier がファイルをフォーマットするための、コード内でのプラグマコメントの記述例
Prettier の設定ファイルにおける requirePragma の指定
Prettier の設定ファイルは、.prettierrc
、.prettierrc.json
、package.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 の例)
- インストール
npm install --save-dev husky lint-staged prettier
- 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" } }
- Husky の有効化
npx husky install
これにより、
git commit
を実行する前に、ステージングされたファイルのうち、lint-staged
で指定された拡張子のファイルに対してprettier --write
が実行されます。 - インストール
-
利点
requirePragma
がなくても、変更されたファイルだけがフォーマットされるため、CI/CD パイプラインでのフォーマットチェックが効率的になります。- 開発者がフォーマットし忘れても、コミット時に自動的に修正されるため、コードベースのフォーマットの一貫性を保ちやすくなります。
requirePragma: true
は特定のニッチなユースケース(特に段階的な移行)で有用ですが、多くの場合、以下の代替手段がより効率的で管理しやすいでしょう。
- デフォルトの
requirePragma: false
のまま、.prettierignore
を使って無視するファイルを明示する。 これが最も一般的で推奨されるアプローチです。 - Git フック(
husky
+lint-staged
)を使って、コミット時に変更されたファイルのみをフォーマットする。 これにより、コードベース全体のフォーマット一貫性を保ちつつ、開発者の手間を最小限に抑えられます。