Prettierオプションでよくあるエラーと解決策【トラブルシューティング】
Prettier の「Options」(オプション)とは何か
Prettier は、コードを自動的にフォーマット(整形)してくれるツールです。その際に、どのようにコードをフォーマットするかを細かく設定できるのが「Options」(オプション)です。これらのオプションを使うことで、チームや個人のコーディングスタイルに合わせて Prettier の挙動をカスタマイズできます。
例えば、インデントのスペース数、セミコロンの有無、クォーテーションの種類(シングルかダブルか)などを設定できます。
なぜオプションが重要なのか
- プロジェクトへの適合: プロジェクトの既存のコーディング規約や好みに合わせて Prettier の動作を調整できます。
- 手動での修正の削減: コードスタイルに関する細かい修正を手動で行う必要がなくなります。Prettier が自動的に設定されたルールに従って整形してくれるため、開発者はコードの中身に集中できます。
- 一貫性の確保: チーム開発において、全員が同じコーディングスタイルで書くことで、コードの可読性が向上し、レビューがしやすくなります。オプションを設定し、それを共有することで、この一貫性を簡単に保つことができます。
主なオプションの例
Prettier には非常に多くのオプションがありますが、よく使われるものをいくつかご紹介します。
-
printWidth
(プリント幅):- 1行の最大文字数を指定します。この値を超えると、Prettier はコードを自動的に改行しようとします。
- 例:
printWidth: 80
(1行を80文字以内にする)
-
tabWidth
(タブ幅):- インデントに使用するスペースの数を指定します。
- 例:
tabWidth: 2
(インデントをスペース2つにする)
-
useTabs
(タブを使用するか):- インデントにスペースではなくタブを使用するかどうかを指定します。
- 例:
useTabs: true
(タブを使用する)
-
semi
(セミコロン):- 文末にセミコロンを付けるかどうかを指定します。
- 例:
semi: true
(セミコロンを付ける)
-
singleQuote
(シングルクォート):- 文字列を囲む際にシングルクォート (
'
) を使用するか、ダブルクォート ("
) を使用するかを指定します。 - 例:
singleQuote: true
(シングルクォートを使用する)
- 文字列を囲む際にシングルクォート (
-
trailingComma
(末尾のカンマ):- オブジェクトや配列の最後の要素の後に末尾のカンマを付けるかどうかを指定します。(ES5, none, all のいずれか)
- 例:
trailingComma: "es5"
(ES5 のルールに従って末尾のカンマを付ける)
-
bracketSpacing
(ブラケットとスペース):- オブジェクトリテラルの波括弧
(
と)
の間にスペースを入れるかどうかを指定します。 - 例:
bracketSpacing: true
({ foo: bar }
のようにスペースを入れる)
- オブジェクトリテラルの波括弧
-
arrowParens
(アロー関数の括弧):- アロー関数の引数が1つの場合に括弧を付けるかどうかを指定します。(always, avoid のいずれか)
- 例:
arrowParens: "always"
((x) => x
のように常に括弧を付ける)
これらのオプションは、いくつかの方法で設定できます。
-
エディタの統合: VS Code などのエディタの拡張機能を通じて、GUI でオプションを設定できる場合もあります。
-
CLI (コマンドラインインターフェース): Prettier をコマンドラインで実行する際に、オプションを直接指定することもできます。
prettier --print-width 80 --single-quote true --write "src/**/*.js"
-
.prettierrc
ファイル: プロジェクトのルートディレクトリに.prettierrc
という名前のファイルを作成し、JSON、YAML、または JavaScript 形式でオプションを記述します。// .prettierrc { "printWidth": 80, "tabWidth": 2, "singleQuote": true, "semi": true }
-
package.json
:package.json
ファイル内にprettier
キーを追加し、その中にオプションを記述します。{ "name": "my-project", "version": "1.0.0", "prettier": { "printWidth": 80, "tabWidth": 2, "singleQuote": true, "semi": true } }
Prettier のオプションはコードフォーマットの一貫性を保つ上で非常に便利ですが、設定ミスや競合によって予期せぬ挙動を引き起こすことがあります。ここでは、よくあるエラーとその解決策をいくつかご紹介します。
オプションが適用されない、または期待通りに動作しない
原因:
- キャッシュの問題: 特にエディタの統合の場合、キャッシュが原因で古い設定が適用され続けることがあります。
- Prettier のバージョン: 使用している Prettier のバージョンが古い場合、新しいオプションがサポートされていなかったり、既存のオプションの挙動が変わっていたりすることがあります。
- エディタの統合の問題: VS Code などのエディタで Prettier 拡張機能を使用している場合、エディタの設定が Prettier のプロジェクト設定を上書きしている可能性があります。
- ファイルの種類とパーサー: Prettier はファイルの拡張子に基づいて自動的に適切なパーサーを推測しますが、特殊なファイルや、Prettier がデフォルトで認識しないファイルタイプの場合、正しくフォーマットされないことがあります。
- 設定ファイルの読み込み順序: Prettier は複数の設定ファイル(例:
package.json
内のprettier
キー、.prettierrc
、.prettierrc.json
など)を特定の優先順位で読み込みます。意図しない設定ファイルが優先されている可能性があります。
トラブルシューティング:
- キャッシュのクリア: エディタの拡張機能や、ビルドツールに組み込まれている場合、キャッシュをクリアすると解決することがあります。
- Prettier のバージョンアップ:
npm install prettier@latest
またはyarn add prettier@latest
で最新バージョンに更新することを検討してください。 - エディタの設定を確認:
- VS Code の場合:
ファイル
>ユーザー設定
>設定
を開き、「prettier」で検索します。prettier.configPath
やprettier.requireConfig
などの設定が適切か確認します。また、editor.defaultFormatter
が Prettier に設定されていることを確認してください。 - エディタの再起動や、Prettier 拡張機能の再インストールも試してみてください。
- VS Code の場合:
- パーサーの指定: フォーマットしたいファイルが Prettier に認識されていない場合、
overrides
オプションで明示的にパーサーを指定します。// .prettierrc { "overrides": [ { "files": "*.vue", "options": { "parser": "vue" } } ] }
- CLI での確認: コマンドラインで Prettier を実行し、オプションが適用されるか確認します。
特定のファイルに対してオプションを明示的に指定して試すことも有効です。npx prettier --write "src/**/*.js"
npx prettier --print-width 100 --single-quote true --write src/your-file.js
ESLint との競合によるエラー (Delete \CR` [prettier/prettier]` など)
原因:
- 特に、Windows 環境で作成されたコードを Unix/Linux 環境(またはその逆)で編集する際に、改行コードの違い(CRLF vs LF)によって
Delete \
CR`` エラーが発生することがよくあります。 - Prettier はコードのスタイルを整形し、ESLint はコードの品質や潜在的なバグをチェックします。しかし、両者が同じルール(例: インデントのスタイル、セミコロンの有無、改行コードの種類など)について異なる設定を持っていると、フォーマットするたびにエラーが発生し、無限ループに陥ることがあります。
トラブルシューティング:
- 改行コードの統一 (
endOfLine
オプション):.prettierrc
にendOfLine
オプションを追加し、プロジェクト全体で改行コードを統一します。"endOfLine": "lf"
: Unix/Linux スタイル(推奨)"endOfLine": "crlf"
: Windows スタイル"endOfLine": "auto"
: 既存の改行コードを維持
// .prettierrc { "endOfLine": "lf" }
- Git の設定で
core.autocrlf
を適切に設定することも重要です。
「Ignored unknown option」エラー
原因:
- 設定ファイルに、Prettier が認識しないオプション名が記述されている場合に発生します。これは、タイポ(スペルミス)であったり、古いバージョンの Prettier ではサポートされていない新しいオプションを使用している場合によく見られます。
トラブルシューティング:
- Prettier のバージョンを確認: 使用している Prettier のバージョンが、そのオプションをサポートしているか確認してください。必要であれば、最新バージョンに更新してください。
- オプション名のスペルを確認: Prettier の公式ドキュメントでオプション名を再確認し、設定ファイルの記述と一致しているか確認してください。
特定のファイルやディレクトリがフォーマットされない
原因:
- 対象ファイルの指定ミス: CLI コマンドで指定するファイルパスが正しくない、またはワイルドカードが意図したファイルをカバーしていない。
.gitignore
との競合: Prettier はデフォルトで.gitignore
を尊重しますが、カスタム設定によって無視されている可能性もあります。.prettierignore
ファイル: プロジェクトのルートディレクトリに.prettierignore
ファイルが存在し、フォーマットしたくないファイルやディレクトリがそこに記述されている可能性があります。
トラブルシューティング:
- CLI コマンドの確認: コマンドラインで Prettier を実行する際のファイル指定が正しいか確認してください。
.prettierignore
の確認:.prettierignore
ファイルの内容を確認し、フォーマットしたいファイルが誤って無視されていないか確認してください。
Prettier のオプションに関するエラーは、主に設定ファイルの読み込み、他のツールとの競合、バージョンの問題、または単純な設定ミスが原因で発生します。これらの問題を解決するためには、以下のステップが有効です。
- 段階的なデバッグ: 問題を特定するために、一度に一つの変更だけを行い、その都度 Prettier の動作を確認します。
- CLI でのテスト: エディタの統合の問題か、Prettier 自体の問題かを切り分けるために、まずは CLI で実行して挙動を確認します。
eslint-config-prettier
とeslint-plugin-prettier
の活用: ESLint と併用する場合は、これらを適切に設定することが非常に重要です。
Prettier オプションの例とコードの変化
ここでは、.prettierrc
ファイルにオプションを設定する形式で説明します。
printWidth (プリント幅)
- デフォルト:
80
- 説明: 1行の最大文字数を指定します。この値を超えると、Prettier はコードを自動的に改行しようとします。
設定例:
// .prettierrc
{
"printWidth": 50
}
整形前 (before):
const longLineOfCode = "This is a very long string that will exceed the print width if it's set to a small number.";
const anotherLongLine = (param1, param2, param3, param4, param5) => { console.log(param1, param2, param3, param4, param5); };
整形後 (after):
const longLineOfCode =
"This is a very long string that will exceed the print width if it's set to a small number.";
const anotherLongLine = (
param1,
param2,
param3,
param4,
param5
) => {
console.log(
param1,
param2,
param3,
param4,
param5
);
};
tabWidth (タブ幅) & useTabs (タブを使用するか)
- デフォルト:
tabWidth: 2
,useTabs: false
useTabs
説明:true
の場合、インデントにタブ文字を使用します。false
の場合、tabWidth
で指定された数のスペースを使用します。tabWidth
説明: インデントに使用するスペースの数を指定します。
設定例 (スペース2つ):
// .prettierrc
{
"tabWidth": 2,
"useTabs": false
}
整形前 (before):
function greet(name) {
if (name) {
console.log("Hello, " + name);
}
}
整形後 (after):
function greet(name) {
if (name) {
console.log("Hello, " + name);
}
}
設定例 (タブ):
// .prettierrc
{
"useTabs": true
}
整形前 (before): (上記と同じ)
function greet(name) {
if (name) {
console.log("Hello, " + name);
}
}
整形後 (after): (タブ文字でインデントされる)
function greet(name) {
if (name) {
console.log("Hello, " + name);
}
}
semi (セミコロン)
- デフォルト:
true
- 説明: 文末にセミコロンを付けるかどうかを指定します。
設定例 (セミコロンを付けない):
// .prettierrc
{
"semi": false
}
整形前 (before):
const message = "Hello world";
console.log(message);
function add(a, b) {
return a + b;
}
整形後 (after):
const message = "Hello world"
console.log(message)
function add(a, b) {
return a + b
}
singleQuote (シングルクォート)
- デフォルト:
false
(ダブルクォートを使用) - 説明: 文字列を囲む際にシングルクォート (
'
) を使用するか、ダブルクォート ("
) を使用するかを指定します。
設定例 (シングルクォートを使用):
// .prettierrc
{
"singleQuote": true
}
整形前 (before):
const name = "Alice";
const greeting = "Hello, " + name + "!";
console.log("This is a string.");
整形後 (after):
const name = 'Alice';
const greeting = 'Hello, ' + name + '!';
console.log('This is a string.');
trailingComma (末尾のカンマ)
- デフォルト:
"es5"
- 説明: オブジェクトや配列の最後の要素の後に末尾のカンマを付けるかどうかを指定します。(
"es5"
,"none"
,"all"
のいずれか)"es5"
: ES5 で有効な場所(オブジェクトリテラル、配列など)に末尾のカンマを付けます。"none"
: 末尾のカンマを付けません。"all"
: 可能な限り全ての場所(関数の引数リストなど)に末尾のカンマを付けます。
設定例 ("es5"
):
// .prettierrc
{
"trailingComma": "es5"
}
整形前 (before):
const obj = {
a: 1,
b: 2
};
const arr = [
1,
2
];
function func(
param1,
param2
) {
// ...
}
整形後 (after):
const obj = {
a: 1,
b: 2, // ES5で許可される場所
};
const arr = [
1,
2, // ES5で許可される場所
];
function func(
param1,
param2 // 関数の引数には付けない (ES5モード)
) {
// ...
}
設定例 ("all"
):
// .prettierrc
{
"trailingComma": "all"
}
整形後 (after):
const obj = {
a: 1,
b: 2,
};
const arr = [
1,
2,
];
function func(
param1,
param2, // 関数の引数にも付ける (allモード)
) {
// ...
}
bracketSpacing (ブラケットとスペース)
- デフォルト:
true
- 説明: オブジェクトリテラルの波括弧
{
と}
の間にスペースを入れるかどうかを指定します。
設定例 (false
- スペースを入れない):
// .prettierrc
{
"bracketSpacing": false
}
整形前 (before):
const myObject = { key: "value" };
const { property } = someObject;
整形後 (after):
const myObject = {key: "value"};
const {property} = someObject;
arrowParens (アロー関数の括弧)
- デフォルト:
"always"
- 説明: アロー関数の引数が1つの場合に括弧を付けるかどうかを指定します。(
"always"
または"avoid"
)"always"
: 常に括弧を付けます(例:(x) => x
)。"avoid"
: 可能な限り括弧を付けません(例:x => x
)。
設定例 ("avoid"
):
// .prettierrc
{
"arrowParens": "avoid"
}
整形前 (before):
const greet = (name) => `Hello, ${name}`;
const add = (a, b) => a + b;
整形後 (after):
const greet = name => `Hello, ${name}`; // 括弧が削除される
const add = (a, b) => a + b; // 複数の引数の場合は維持される
jsxBracketSameLine (JSX ブラケットの同一行)
- デフォルト:
false
- 説明: JSX の最後の
>
を、閉じタグの開始タグと同じ行に配置するかどうかを指定します。
設定例 (true
):
// .prettierrc
{
"jsxBracketSameLine": true
}
整形前 (before):
// React Component (JSX)
const MyComponent = () => (
<div
className="container"
id="main-container"
>
<p>Hello, Prettier!</p>
</div>
);
整形後 (after):
// React Component (JSX)
const MyComponent = () => (
<div
className="container"
id="main-container"> {/* 閉じ括弧が同じ行に移動 */}
<p>Hello, Prettier!</p>
</div>
);
endOfLine (改行コード)
- デフォルト:
"lf"
- 説明: ファイルの末尾に使用する改行コードを指定します。(
"lf"
,"crlf"
,"auto"
,"preserve"
のいずれか)"lf"
: Unix/Linux スタイル (\n
)"crlf"
: Windows スタイル (\r\n
)"auto"
: 既存の改行コードを検出し、そのスタイルを維持しようとします。"preserve"
: 既存の改行コードを保持し、変更しません。
設定例 ("crlf"
):
// .prettierrc
{
"endOfLine": "crlf"
}
整形後 (after):
(この変更は目に見える形でコードに反映されませんが、ファイルのバイトレベルで改行コードが \r\n
になります。)
これらのオプションは、以下のような方法で設定できます。
.prettierrc
ファイル (JSON, YAML, JS 形式): 最も一般的な方法です。// .prettierrc.json { "printWidth": 100, "singleQuote": true, "trailingComma": "all" }
package.json
:// package.json { "name": "my-project", "version": "1.0.0", "prettier": { "printWidth": 100, "singleQuote": true } }
- CLI (コマンドラインインターフェース): 一時的なフォーマットや特定のファイルに対して。
npx prettier --print-width 120 --arrow-parens avoid --write "src/**/*.js"
「代替方法」という文脈で、主に以下の3つの側面からご説明します。
- オプションの設定場所の選択肢
- 特定のファイルやディレクトリのフォーマットを制御する方法
- 他のツールとの連携によるオプションの適用と制御
オプションの設定場所の選択肢 (Configuration Files)
Prettier のオプションを設定する最も一般的な方法は設定ファイルを使用することですが、どこに設定するかによっていくつかの選択肢があります。
-
CLI (コマンドラインインターフェース) オプション
- 説明: Prettier をコマンドラインで実行する際に、オプションを直接指定する方法です。
- 利点:
- 一時的なフォーマットや、スクリプト内での特定のフォーマット実行に便利。
- デバッグ時に特定のオプションの動作を確認するのに役立つ。
- 欠点:
- オプションが多い場合、コマンドが長くなる。
- プロジェクト全体で一貫したフォーマットを強制するには向かない。
- 例:
# シングルクォートとセミコロンなしでファイルを整形 prettier --single-quote --no-semi --write "src/**/*.js" # 1行の幅を120文字に設定してフォーマット prettier --print-width 120 --write "index.ts"
-
インライン設定 (コメント)
- 説明: ファイルの先頭に特別なコメントブロックを追加することで、そのファイルにのみ適用される Prettier オプションを設定できます。
- 利点:
- 特定のファイルに対して、グローバル設定やプロジェクト設定とは異なる一時的なフォーマットルールを適用したい場合に便利。
- 欠点:
- 大規模な適用には向かない(各ファイルに記述が必要)。
- コードと設定が混在する。
- 例 (JavaScript/TypeScript):
/** * @prettier * @printWidth 120 * @singleQuote false */ const longLineOfCode = "This is a very long string that will now be formatted with a print width of 120 and double quotes.";
- 例 (HTML):
<div> <p> This HTML will be formatted with specific Prettier options. </p> </div>
-
- 説明: プロジェクトのルートディレクトリに配置する最も一般的な方法です。
.prettierrc
、.prettierrc.json
、.prettierrc.yaml
、.prettierrc.yml
、.prettierrc.js
、.prettierrc.cjs
、.prettierrc.mjs
といった名前でファイルを作成できます。 - 利点:
- プロジェクトのフォーマットルールを一元管理しやすい。
.js
や.mjs
ファイルを使用すれば、JavaScript のロジックを使ってオプションを動的に設定することも可能。- 複数のプロジェクトで共通の設定を使用したい場合、
--config
オプションでパスを指定することも可能(ただし一般的ではない)。
- 例 (
.prettierrc.json
):{ "singleQuote": true, "semi": false, "tabWidth": 2 }
- 例 (
.prettierrc.js
):
この// .prettierrc.js module.exports = { printWidth: 80, tabWidth: 2, singleQuote: true, trailingComma: 'es5', overrides: [ { files: '*.ts', options: { parser: 'typescript', }, }, { files: '*.json', options: { tabWidth: 4, }, }, ], };
.js
形式を使うことで、ファイルタイプごとに異なるオプションを適用するoverrides
などのより複雑な設定が可能になります。
- 説明: プロジェクトのルートディレクトリに配置する最も一般的な方法です。
特定のファイルやディレクトリのフォーマットを制御する方法
-
overrides
オプション (設定ファイル内)- 説明:
.prettierrc.js
や.prettierrc.json
などの設定ファイル内で、特定のファイルパスにのみ適用される異なるオプションセットを定義できます。 - 利点:
- プロジェクト内の異なる言語やファイルタイプ(例: Vue ファイル、JSON ファイル、Markdown ファイルなど)に対して、それぞれに最適なフォーマットルールを適用できる。
- 単一の設定ファイル内で柔軟なルールを定義できる。
- 例 (
.prettierrc.js
または.prettierrc.json
):
この例では、デフォルトでシングルクォートとセミコロンなしですが、{ "printWidth": 80, "singleQuote": true, "overrides": [ { "files": "*.vue", "options": { "htmlWhitespaceSensitivity": "ignore", "semi": true } }, { "files": ["*.json", "*.md"], "options": { "tabWidth": 4 } } ] }
.vue
ファイルではセミコロンが付き、.json
と.md
ファイルではタブ幅が4になります。
- 説明:
-
.prettierignore
ファイル- 説明: Git の
.gitignore
と同様に、Prettier がフォーマットを無視すべきファイルやディレクトリのパターンを記述するファイルです。 - 利点:
- ビルド出力ディレクトリ(
dist
,build
)、生成されたファイル、外部ライブラリのコードなど、フォーマットする必要のないファイルを簡単に除外できる。 package.json
や設定ファイルとは別に無視リストを管理できる。
- ビルド出力ディレクトリ(
- 例 (
.prettierignore
):# ビルドディレクトリを無視 build/ dist/ # 特定のファイルや拡張子を無視 *.min.js temp/
- 注意点: デフォルトで
.gitignore
も尊重します。
- 説明: Git の
他のツールとの連携によるオプションの適用と制御
-
IDE/エディタの統合 (例: VS Code Prettier 拡張機能)
- 説明: VS Code などの統合開発環境(IDE)やテキストエディタには、Prettier の拡張機能が提供されています。これにより、保存時(
Format On Save
)やファイルを開いた時に自動的にフォーマットを適用できます。 - 利点:
- リアルタイムに近いフォーマット体験を提供し、開発者がフォーマットについて意識する必要がなくなる。
- プロジェクトの設定ファイルを自動的に読み込んで適用するため、個別の開発環境で Prettier のオプションを再設定する手間が省ける。
- 設定例 (VS Code の
settings.json
):
この設定により、VS Code は保存時に Prettier を使用してファイルを自動的にフォーマットします。Prettier 拡張機能は、プロジェクトの{ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }
.prettierrc
などの設定ファイルを自動的に認識して適用します。
- 説明: VS Code などの統合開発環境(IDE)やテキストエディタには、Prettier の拡張機能が提供されています。これにより、保存時(
-
ESLint との統合 (
eslint-config-prettier
,eslint-plugin-prettier
)- 説明: ESLint (JavaScript/TypeScript のリンター) と Prettier を連携させ、スタイルの問題を Prettier に任せ、ESLint はコード品質の問題に集中させる方法です。
- 利点:
- コードスタイルに関する ESLint と Prettier の競合を防ぐことができる。
- ESLint の
fix
コマンドで Prettier のフォーマットも同時に実行できるため、開発体験が向上する。
- 設定例: 「Prettier オプションに関する一般的なエラーとトラブルシューティング」の項目で詳しく説明しましたので、そちらをご参照ください。
-
Git Hooks (例: Husky + lint-staged)
- 説明: Git のコミット前フック(
pre-commit
)を利用して、コミット対象のファイルのみを Prettier で自動フォーマットする方法です。Husky
は Git Hooks を簡単に設定できるツール、lint-staged
はステージングエリアのファイルのみにコマンドを実行するツールです。 - 利点:
- 開発者がコミットするたびにコードが自動的にフォーマットされるため、手動でのフォーマット忘れを防ぎ、常にクリーンなコードベースを保てる。
- チーム全体のコードスタイルの一貫性を強力に強制できる。
- 設定例 (簡略版):
- インストール:
npm install --save-dev husky lint-staged prettier
package.json
に設定追加:{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.{js,jsx,ts,tsx,json,css,scss,md}": "prettier --write" } }
- インストール:
- 説明: Git のコミット前フック(
Prettier のオプションに関連するプログラミング手法や代替方法は多岐にわたりますが、共通して目指すのは「開発チーム全体で一貫したコードスタイルを、可能な限り自動的に適用・維持する」ことです。