Quotes​

2025-06-06

具体的には、文字列をシングルクォート(')で囲むか、ダブルクォート(")で囲むかを指定することができます。

Prettierには、この「Quotes」に関して主に以下のオプションがあります。

  1. singleQuote (または singleQuote: true/false):

    • このオプションがtrueに設定されている場合、Prettierは可能な限り文字列をシングルクォートで囲むように整形します。
      • 例: const name = 'Alice';
    • falseに設定されている場合、可能な限りダブルクォートで囲むように整形します。
      • 例: const name = "Bob";
    • これはデフォルトではfalse(ダブルクォート)です。
  2. jsxSingleQuote (または jsxSingleQuote: true/false):

    • これは特にJSX(Reactなどで使われるJavaScriptの拡張構文)内の属性値のクォートをどうするか、という設定です。
    • trueに設定されている場合、JSX属性値をシングルクォートで囲みます。
      • 例: <MyComponent className='container' />
    • falseに設定されている場合、ダブルクォートで囲みます。
      • 例: <MyComponent className="container" />
    • このオプションはsingleQuoteの設定とは独立して設定できます。

なぜこの設定が必要なのか?

  • 個人の好み: プログラマーによってはシングルクォート派とダブルクォート派がいます。Prettierは個人の好みに合わせて設定できる柔軟性を提供します。
  • レビューストレスの軽減: クォートの形式が統一されることで、コードレビューにおいて「シングルクォートにすべきか、ダブルクォートにすべきか」といった瑣末な議論が不要になります。本質的なロジックのレビューに集中できます。
  • 一貫性の維持: チームで開発を行う際、シングルクォートとダブルクォートが混在するとコードの可読性が低下し、見栄えが悪くなります。Prettierを使うことで、プロジェクト全体でどちらかのクォートに統一され、一貫性が保たれます。

これらの設定は、.prettierrcのような設定ファイルに記述することで、プロジェクト全体に適用されます。

例:.prettierrcファイルでの設定

{
  "singleQuote": true,
  "jsxSingleQuote": false
}


Prettierの「Quotes」に関するよくあるエラーとトラブルシューティング

想定と異なるクォート形式でフォーマットされる

エラーの状況
singleQuote: trueに設定しているのに、一部の文字列がダブルクォート(")でフォーマットされたり、その逆の状況が発生する。または、JSX内のクォートが期待と異なる。

原因

  • Prettierのバージョン
    • 非常に古いPrettierのバージョンを使用している場合、現在の設定オプションが正しく解釈されない可能性もゼロではありません。
  • エディタ/IDEのPrettier設定の不一致
    • VS CodeなどのエディタにインストールされているPrettier拡張機能が、プロジェクトの.prettierrcファイルを正しく読み込んでいない、またはエディタ独自のPrettier設定が優先されている可能性があります。
  • 特定ファイルのPrettier無視設定
    • .prettierignoreファイルで特定のファイルやディレクトリがPrettierの対象外になっている場合、フォーマットが適用されません。
  • 他のフォーマッター/リンターとの競合
    • ESLint、TSLintなどのリンターがPrettierとは異なるクォートルールを持っている場合、互いに上書きし合い、意図しない結果になることがあります。
  • 設定ファイルの重複または競合
    • .prettierrcpackage.jsonprettierフィールド、CLIオプションなど、複数の場所でPrettierの設定が定義されており、意図しない設定が優先されている可能性があります。
    • 特に、プロジェクトのサブディレクトリに別の.prettierrcファイルが存在する場合、それが優先されることがあります。

トラブルシューティング

  1. 設定の確認と統一
    • プロジェクト内でPrettierの設定が記述されている可能性のあるすべての場所(.prettierrcpackage.json.prettierrc.json.prettierrc.jsなど)を確認し、singleQuoteおよびjsxSingleQuoteの設定が意図通りになっているか確認します。
    • 可能であれば、設定を一箇所に集約することをお勧めします(例: .prettierrcファイルに統一)。
    • npx prettier --find-config-path . コマンドを実行して、Prettierがどの設定ファイルを使用しているかを確認できます。
  2. 他のリンター/フォーマッターとの連携設定
    • ESLintを使用している場合は、eslint-config-prettiereslint-plugin-prettierなどのプラグインを導入し、PrettierのルールがESLintのフォーマットルールを上書きするように設定します。これにより、両者の競合を防ぐことができます。
    • 例: eslintrc.json"extends": ["prettier"]を追加する。
  3. .prettierignoreの確認
    • フォーマットされないファイルが.prettierignoreに含まれていないか確認します。
  4. エディタ/IDEの設定確認
    • 使用しているエディタ(例: VS Code)のPrettier拡張機能の設定を確認し、"Format On Save"が有効になっているか、またはプロジェクトのワークスペース設定が適切に適用されているかを確認します。場合によっては、エディタの再起動も試してみてください。
    • VS Codeの場合、ワークスペース設定(.vscode/settings.json)で"editor.defaultFormatter": "esbenp.prettier-vscode"を設定することをお勧めします。
  5. Prettierの再インストール/バージョンアップ
    • npm install prettier@latestまたはyarn add prettier@latestで最新版に更新し、問題が解決するか試します。

Prettierを実行しても何も変化しない

エラーの状況
prettier --write .などのコマンドを実行しても、ファイルのクォート形式が変わらない。

原因

  • Prettierが古い
    • 非常に古いバージョンでは、最新のJavaScript構文やJSXを正しく解析できない場合があります。
  • 設定の問題
    • singleQuotejsxSingleQuoteが既に目的の値に設定されており、変更の必要がない状態になっている。
  • .prettierignoreによる除外
    • 対象ファイルが.prettierignoreによって除外されている。
  • --checkオプションの使用
    • --writeではなく--checkオプションを使用している場合、フォーマットは行われず、フォーマットが必要なファイルがあるかどうかのチェックのみが行われます。
  • 対象ファイルがない/認識されていない
    • 指定したパスにファイルが存在しないか、Prettierが処理すべきファイルを認識できていない。

トラブルシューティング

  1. コマンドの確認
    • prettier --write "src/**/*.js"のように、フォーマットしたいファイルを正確に指定しているか確認します。
    • prettier --write .はカレントディレクトリ以下の全てを対象としますが、プロジェクトのルートで実行しているか確認します。
  2. --checkではなく--writeを使用しているか確認
    • prettier --writeであることを再確認します。
  3. .prettierignoreの確認
    • 対象ファイルが.prettierignoreに含まれていないか再確認します。
  4. Prettierのバージョン確認と更新
    • npx prettier --versionでバージョンを確認し、必要であれば最新版に更新します。
  5. テストファイルの作成
    • 簡単な新しいファイル(例: test.js)を作成し、そこに意図しないクォート形式の文字列を記述して、そのファイルのみをPrettierでフォーマットできるか試します。これにより、問題が特定の設定にあるのか、特定のファイルパスの問題なのかを切り分けられます。

Gitコミット時にフォーマットエラーが発生する

エラーの状況
Gitのpre-commitフックなどでPrettierを走らせるように設定している場合、コミット時に「クォート形式がPrettierのルールに反している」というエラーが出てコミットが失敗する。

原因

  • フックの設定ミス
    • lint-stagedhuskyなどの設定が正しくない、またはpre-commitフックが意図しないPrettierのバージョンや設定で実行されている。
  • 未フォーマットのファイル
    • コミットしようとしているファイルが、Prettierのルールに従ってフォーマットされていないため。
  1. コミット前に手動でフォーマット
    • エラーが出たファイルをコミットする前に、prettier --write <file_path>などで手動でフォーマットし、変更をステージングし直してからコミットを試みます。
  2. lint-staged / huskyの設定確認
    • package.jsonや関連する設定ファイルで、lint-stagedがPrettierを正しく実行するように設定されているか確認します。
    • 例えば、以下のような設定は一般的です。
      // package.json
      {
        "husky": {
          "hooks": {
            "pre-commit": "lint-staged"
          }
        },
        "lint-staged": {
          "*.{js,jsx,ts,tsx,json,css,md}": "prettier --write"
        }
      }
      
    • prettier --checkを使っている場合は、フォーマットせずにエラーを出すだけなので、prettier --writeになっているか確認します。
  3. CI/CD環境での問題
    • CI/CDパイプラインでPrettierが実行される場合、CI環境と開発環境でのPrettierのバージョンや設定に差異がないか確認します。

全体的なトラブルシューティングのヒント

  • 設定ファイルをシンプルにする
    • 複雑な設定で問題が発生している場合は、まずsingleQuotejsxSingleQuoteのみを記述した最小限の設定ファイルで試してみて、問題が解決するかどうかを切り分けます。
  • VS Codeの場合のトラブルシューティング
    • コマンドパレットから「Format Document With...」を選び、「Configure Default Formatter...」からPrettierを選択しているか確認します。
    • VS Codeの出力ウィンドウ(Outputタブ)で「Prettier」を選択し、エラーメッセージがないか確認します。
  • 詳細ログの確認
    • Prettierに--loglevel debugオプションを付けて実行すると、詳細なデバッグ情報が出力され、問題の特定に役立つことがあります。

Prettierの「Quotes」に関する一般的なエラーと問題

  1. 設定と実際のフォーマットが一致しない:

    • .prettierrcpackage.json"singleQuote": trueと設定しているのに、ファイルがダブルクォートでフォーマットされてしまう。
    • 逆に、"singleQuote": falseと設定しているのに、シングルクォートになってしまう。
    • 特に、JSX (jsxSingleQuote) の設定を忘れている場合によく起こります。
  2. ESLintとの競合:

    • ESLintにもクォートに関するルール(quotesルール)があり、Prettierの設定とESLintのルールが競合すると、保存時にフォーマットが意図しない挙動になったり、ESLintのエラーが発生したりします。
    • 例えば、Prettierはシングルクォート、ESLintはダブルクォートを要求している場合などです。
  3. エディタの拡張機能や設定との競合:

    • VS Codeなどのエディタには、Prettier以外のフォーマッターや、独自のフォーマット設定がある場合があります。これらがPrettierの設定と競合し、意図しないフォーマットが行われることがあります。
    • 例えば、VS Codeのeditor.formatOnSaveが有効になっているが、使用するフォーマッターがPrettierではない、またはPrettierの設定が正しく読み込まれていないケースです。
  4. 特定の文字列での問題:

    • 文字列内に既にシングルクォートやダブルクォートが含まれている場合(例: const text = "It's a beautiful day";)。Prettierはエスケープ文字の数を最小にするように自動的にクォートを決定するため、設定とは異なるクォートが使われることがあります。これはエラーではありませんが、意図しない挙動と感じることがあります。
  5. .editorconfigファイルとの競合:

    • プロジェクトに.editorconfigファイルがある場合、Prettierはそこから設定を読み込むことがあります。もし.editorconfigにクォートに関する設定(例: quote_type = single)があり、Prettierの設定と食い違っていると、予期せぬ結果になることがあります。
  1. Prettierの設定ファイルを再確認する:

    • プロジェクトのルートにある.prettierrc.prettierrc.jsonprettier.config.js、またはpackage.json内のprettierキーの設定を確認します。
    • 特にsingleQuotejsxSingleQuoteが意図した通りになっているか確認します。
      // .prettierrc
      {
        "singleQuote": true,  // JavaScript, TypeScriptなどの通常の文字列
        "jsxSingleQuote": false // JSXの属性値
      }
      
    • もし、package.jsonにPrettierの設定を記述している場合は、その形式も確認してください。
  2. ESLintとPrettierの連携を適切に行う:

    • ESLintとPrettierを併用する場合、通常はESLintのスタイルルールをPrettierに任せるように設定します。
    • これには、eslint-config-prettiereslint-plugin-prettierを使用するのが一般的です。
      1. これらのパッケージをインストールします: npm install --save-dev eslint-config-prettier eslint-plugin-prettier または yarn add --dev eslint-config-prettier eslint-plugin-prettier
      2. .eslintrcファイル(またはpackage.jsoneslintConfig)に設定を追加します:
        // .eslintrc.json
        {
          "extends": [
            "eslint:recommended",
            "plugin:react/recommended", // Reactを使用している場合
            "prettier" // これが重要!prettierのルールを適用する
          ],
          "plugins": [
            "prettier"
          ],
          "rules": {
            "prettier/prettier": ["error", {
              "singleQuote": true // PrettierのsingleQuote設定をESLintから制御
            }],
            "quotes": ["error", "single", { "avoidEscape": true }] // ESLintのquotesルールもPrettierの設定と一致させる
          }
        }
        
        • "prettier"extendsの最後に配置することで、Prettierのルールが他の競合するESLintのスタイルルールを上書きするようにします。
        • "prettier/prettier"ルールを使って、ESLint経由でPrettierのオプションを渡すこともできます。
        • ESLintのquotesルールは、Prettierの設定(singleQuote)と一致させるようにします。"avoidEscape": trueは、Prettierがエスケープを避けるためにクォートを変更する挙動を尊重するために重要です。
  3. エディタの設定を確認する(VS Codeの場合):

    • デフォルトのフォーマッターがPrettierになっているか確認:
      • Ctrl+,(またはCmd+,)で設定を開き、「Default Formatter」で検索し、「Prettier - Code formatter」が選択されていることを確認します。
    • 保存時のフォーマットが有効になっているか確認:
      • 「Format On Save」で検索し、チェックボックスがオンになっていることを確認します。
    • ワークスペース設定の確認:
      • プロジェクト固有の.vscode/settings.jsonファイルがある場合、そこでPrettierの設定が上書きされていないか確認します。
      • 例:
        // .vscode/settings.json
        {
          "editor.defaultFormatter": "esbenp.prettier-vscode",
          "editor.formatOnSave": true,
          "prettier.singleQuote": true, // ここで設定することも可能だが、.prettierrcと一貫性を持たせるのが理想
          "prettier.jsxSingleQuote": false
        }
        
    • 他のフォーマッター拡張機能を無効にする:
      • もし他にコードフォーマットを行う拡張機能(例: Beautifyなど)をインストールしている場合、Prettierとの競合を避けるために一時的に無効にしてみてください。
  4. .editorconfigファイルを確認する:

    • .editorconfigファイルが存在する場合、その中のquote_typeや類似の設定がPrettierの設定と一致しているか確認します。
    • もしPrettierの設定を優先したい場合は、.editorconfigからクォート関連の設定を削除するか、Prettierの設定を優先するようにビルドプロセスを調整します(通常はPrettierが優先されますが、稀に問題が起こることがあります)。
  5. Prettierを直接実行して確認する:

    • 問題が解決しない場合、CLIからPrettierを直接実行して、期待通りのフォーマットが行われるか確認します。
    • npx prettier --write . (現在のディレクトリ以下の全ファイルをフォーマット)
    • npx prettier --check . (フォーマットが必要なファイルがないかチェック)
    • これにより、エディタやESLintとの連携の問題なのか、Prettier自体の設定の問題なのかを切り分けることができます。
  6. キャッシュのクリアと再起動:

    • 稀に、エディタやNodeモジュールのキャッシュが原因で問題が発生することがあります。
    • VS Codeを再起動したり、node_modulesフォルダを削除してnpm install(またはyarn install)を再度実行したりすることで、問題が解決する場合があります。


singleQuote オプションの例

singleQuote オプションは、JavaScript、TypeScript、CSSなどの通常の文字列の引用符に影響します。

設定ファイル (.prettierrc)

singleQuote: true に設定する場合:

// .prettierrc
{
  "singleQuote": true
}

singleQuote: false に設定する場合(Prettierのデフォルト値):

// .prettierrc
{
  "singleQuote": false
}

コードの変換例

singleQuote: true の場合

変換前(入力)変換後(出力)
javascript\nconst name = "Alice";\nconst message = "Hello, world!";\njavascript\nconst name = 'Alice';\nconst message = 'Hello, world!';\n
javascript\nconst path = './src/index.js';\njavascript\nconst path = './src/index.js';\n
javascript\nconst text = "It's a beautiful day.";\njavascript\nconst text = "It's a beautiful day."; // エスケープを避けるためダブルクォートのまま\n

singleQuote: false の場合(デフォルト)

変換前(入力)変換後(出力)
javascript\nconst name = 'Alice';\nconst message = 'Hello, world!';\njavascript\nconst name = "Alice";\nconst message = "Hello, world!";\n
javascript\nconst path = "./src/index.js";\njavascript\nconst path = "./src/index.js";\n
javascript\nconst text = 'He said, "Hello!"';\njavascript\nconst text = 'He said, "Hello!"'; // エスケープを避けるためシングルクォートのまま\n

ポイント: Prettierは、引用符をエスケープする手間を最小限に抑えるように自動的に判断します。そのため、設定がtrueでも、文字列内にシングルクォートが含まれている場合はダブルクォートを、その逆も同様に使用することがあります。これは「文字列の合理性 (strings rationale)」と呼ばれるものです。

jsxSingleQuote オプションの例

jsxSingleQuote オプションは、JSX(Reactなどで使用)の属性値の引用符にのみ影響します。

jsxSingleQuote: true に設定する場合:

// .prettierrc
{
  "singleQuote": false, // JavaScriptはダブルクォート
  "jsxSingleQuote": true // JSXはシングルクォート
}
// .prettierrc
{
  "singleQuote": true, // JavaScriptはシングルクォート
  "jsxSingleQuote": false // JSXはダブルクォート
}

jsxSingleQuote: true の場合

変換前(入力)変換後(出力)
jsx\nconst MyComponent = () => (\n <div className="container" id="main-div">\n Hello\n </div>\n);\njsx\nconst MyComponent = () => (\n <div className='container' id='main-div'>\n Hello\n </div>\n);\n

jsxSingleQuote: false の場合(デフォルト)

変換前(入力)変換後(出力)
jsx\nconst MyComponent = () => (\n <div className='container' id='main-div'>\n Hello\n </div>\n);\njsx\nconst MyComponent = () => (\n <div className="container" id="main-div">\n Hello\n </div>\n);\n

JavaScriptの文字列はシングルクォート、JSXの属性はダブルクォートにする、という一般的な設定例です。

// .prettierrc
{
  "singleQuote": true,
  "jsxSingleQuote": false
}
変換前(入力)変換後(出力)
jsx\nconst greeting = "Hello, world!";\nconst MyComponent = () => (\n <button className='my-button' data-id="123">\n {greeting}\n </button>\n);\njsx\nconst greeting = 'Hello, world!';\nconst MyComponent = () => (\n <button className="my-button" data-id="123">\n {greeting}\n </button>\n);\n


Prettierの設定を柔軟に利用する

これは代替方法というより、Prettierの機能を最大限に活用する方法です。

  • singleQuotejsxSingleQuote の使い分け:
    • Prettierの基本機能として、通常のJavaScript文字列とJSXの属性値で異なる引用符を設定できます。これは代替手段を探す前にまず検討すべき最も柔軟な方法です。
    • 例:
      // .prettierrc
      {
        "singleQuote": true,  // JavaScriptの文字列はシングルクォート
        "jsxSingleQuote": false // JSXの属性はダブルクォート
      }
      
    • これにより、チームや個人の好みに合わせて、適切な組み合わせを選択できます。

ESLintとの連携による統制(推奨されるベストプラクティス)

Prettierはコードの整形に特化しており、ESLintはコードの品質やスタイルをチェックする役割を担います。両者を連携させることで、Prettierの「Quotes」設定をより厳密に統制したり、特定の例外を設けたりすることができます。

  • eslint-plugin-prettier の使用:
    • これはPrettierのフォーマットルールをESLintのルールとして実行するためのプラグインです。これにより、Prettierのフォーマットに反するコードがESLintのエラーとして報告され、CI/CDパイプラインなどでフォーマット漏れを防ぐことができます。
    • 方法: ESLint設定のplugins"prettier"を追加し、rules"prettier/prettier"ルールを追加します。
      // .eslintrc.json
      {
        "extends": [
          // ... 他のextends ...
          "prettier"
        ],
        "plugins": [
          "prettier"
        ],
        "rules": {
          "prettier/prettier": ["error", {
            "singleQuote": true, // PrettierのsingleQuote設定をESLint経由で適用
            "jsxSingleQuote": false
          }],
          "quotes": ["off"] // ESLintのquotesルールはPrettierに任せるため無効化
        }
      }
      
    • "quotes": ["off"] とすることで、ESLint自身のクォートに関するルールを無効にし、完全にPrettierに任せるのが一般的です。
  • eslint-config-prettier の使用:
    • これはESLintのルールでPrettierと競合するスタイル関連のルールを無効にするための設定です。これにより、ESLintとPrettierが互いに邪魔し合うことなく、Prettierがコードフォーマットの主導権を握るようにします。
    • 方法: ESLint設定のextendsの最後に"prettier"を追加します。
      // .eslintrc.json
      {
        "extends": [
          "eslint:recommended",
          "plugin:react/recommended",
          "prettier" // これが重要。prettierと競合するESLintのルールを無効化
        ]
      }
      

特定の行やファイルでPrettierを無効化する

Prettierの「Quotes」設定がどうしても特定の場所で不都合な場合、Prettierのフォーマット自体を無効にする方法です。これは最終手段と考えるべきで、可能な限り避け、設定で解決するのが望ましいです。

  • 特定のファイルを無視する:
    • プロジェクトルートに.prettierignoreファイルを作成し、Gitの.gitignoreと同じ構文で無視したいファイルやディレクトリを指定します。
      # .prettierignore
      src/legacy-code/
      my-custom-script.js
      
    • これにより、指定されたファイルのクォートに関するPrettierの整形も行われません。
  • 特定のブロックを無効化:
    • `` (HTML/Vue/JSX) や /* prettier-ignore */ (CSS/JS) を使って、特定のブロックのフォーマットを無効にできます。
      /* prettier-ignore */
      function unformattedFunction() {
        // このブロック内のコードはPrettierの整形対象外
        const data = "hello"; // このダブルクォートはsingleQuote: trueでもシングルクォートに変換されない
      }
      
  • 特定の行を無効化:
    • // prettier-ignore コメントを対象の行の直前に記述します。
      // prettier-ignore
      const myString = "これはPrettierでフォーマットされたくない文字列です"; // ここは整形されない
      const anotherString = 'これはPrettierでフォーマットされる文字列です'; // ここは整形される
      

Huskyとlint-stagedによるGitフックの活用

これはフォーマット方法そのものではありませんが、Prettierの「Quotes」設定を含むフォーマットルールが確実に適用されるようにする代替手段です。

  • huskylint-staged の組み合わせ:
    • husky はGitフックを簡単に設定するためのツールです。
    • lint-staged はステージングされているファイル(コミットされるファイル)に対してのみLinterやフォーマッターを実行するためのツールです。
    • 方法:
      1. npm install --save-dev husky lint-staged でインストール。
      2. package.jsonに設定を追加。
        // package.json
        {
          "name": "my-project",
          "version": "1.0.0",
          "scripts": {
            "format": "prettier --write .",
            "lint": "eslint ."
          },
          "devDependencies": {
            "prettier": "^3.0.0",
            "eslint": "^8.0.0",
            "husky": "^9.0.0",
            "lint-staged": "^15.0.0"
          },
          "husky": {
            "hooks": {
              "pre-commit": "lint-staged"
            }
          },
          "lint-staged": {
            "*.{js,jsx,ts,tsx,json,css,md}": [
              "prettier --write", // ステージングされているファイルのみPrettierで整形
              "eslint --fix"      // ESLintも実行して、Prettierのルールが適用されたか確認・修正
            ]
          }
        }
        
    • これにより、開発者がコミットする際に自動的にPrettierのフォーマットが適用され、クォートスタイルの一貫性が強制されます。これは、個々の開発者のエディタ設定に依存せず、チーム全体でルールを共有するための強力な代替手段(あるいは補完手段)となります。

これらの代替方法を適切に利用することで、Prettierの「Quotes」に関する問題を解決したり、より柔軟な開発ワークフローを構築したりすることが可能です。最も推奨されるのは「Prettierの設定を柔軟に利用する」と「ESLintとの連携による統制」です。 Prettierは、コードのフォーマットを自動的に行う「Prettier」です。その中でも「Quotes」(引用符)の扱いについては、Prettierが非常に「意見のある (opinionated)」ツールであるため、設定できるオプションは比較的限られています。つまり、**「PrettierのQuotes機能に対する代替手段」というよりは、「Prettierと連携して、Quotesに関するより細かい制御を行う方法」**や、「Prettierを使用しない場合にQuotesを制御する別のツール」について説明するのが適切です。

以下に、PrettierのQuotes機能に関する代替的・補完的な方法をいくつか紹介します。

ESLintとの連携によるより詳細な制御

Prettierは主にコードの「整形」に特化していますが、ESLintはコードの「品質」と「スタイル」の両方をチェックできる強力なリンターです。PrettierとESLintを組み合わせることで、Prettierだけでは難しいより詳細なクォートに関するルールを設定できます。

なぜESLintと連携するのか?

  • 一貫性の強制: 開発者がPrettierを実行し忘れた場合でも、ESLintがビルドプロセスやコミットフックでクォートスタイルをチェックし、違反を報告できます。
  • 追加のルール: PrettierのsingleQuotejsxSingleQuoteだけではカバーできない、より複雑なクォートに関する要件がある場合。
  • 競合の解決: PrettierとESLintが同じコードスタイルについて異なる意見を持っている場合(例: Prettierはシングルクォート、ESLintはダブルクォートを要求)、ESLintのルールがPrettierのフォーマットを上書きしようとして無限ループやエラーになることがあります。

設定方法の例

  1. 必要なパッケージのインストール:

    npm install --save-dev eslint prettier eslint-config-prettier eslint-plugin-prettier
    # または yarn add --dev eslint prettier eslint-config-prettier eslint-plugin-prettier
    
    • eslint-config-prettier: Prettierと競合するESLintの整形ルールを無効にします。これにより、Prettierが整形を行い、ESLintはそれ以外の(バグの可能性や構文的な)問題を報告する役割に徹します。
    • eslint-plugin-prettier: PrettierをESLintのルールとして実行し、Prettierの整形ルールに違反している箇所をESLintのエラーとして報告します。
  2. .eslintrc.json の設定:

    // .eslintrc.json
    {
      "extends": [
        "eslint:recommended",
        "plugin:react/recommended", // Reactを使用している場合
        "prettier" // **これによってPrettierと競合するESLintのルールが無効化される**
      ],
      "plugins": [
        "prettier"
      ],
      "rules": {
        // PrettierのルールをESLint経由で設定する
        "prettier/prettier": ["error", {
          "singleQuote": true,
          "jsxSingleQuote": false
        }],
        // ESLintの組み込みのquotesルールもPrettierの設定と一致させる
        // "avoidEscape": true を設定することで、Prettierの「文字列の合理性」を尊重する
        "quotes": ["error", "single", { "avoidEscape": true }]
      },
      // ESLintがJSXを認識するように設定
      "settings": {
        "react": {
          "version": "detect"
        }
      },
      "parserOptions": {
        "ecmaVersion": 2020,
        "sourceType": "module",
        "ecmaFeatures": {
          "jsx": true
        }
      }
    }
    
    • extends配列の最後に"prettier"を追加することが重要です。これにより、PrettierとESLintの整形に関するルールが競合した場合に、Prettierが優先されるようになります。
    • "prettier/prettier"ルールで、ESLintからPrettierのオプション(singleQuoteなど)を設定できます。
    • "quotes"ルールは、ESLintの組み込みルールであり、prettier/prettierルールとは独立して機能します。しかし、Prettierが整形した後のコードに対してESLintが別のクォートスタイルを要求すると、ESLintのエラーが発生するため、このESLintのquotesルールもPrettierの設定と一致させる必要があります。"avoidEscape": trueを設定することで、文字列内に既にエスケープが必要なクォートが含まれている場合に、Prettierがそのクォートスタイルを維持する挙動をESLintが許容するようになります。

この組み合わせにより、Prettierは自動整形を行い、ESLintはコード品質のチェックと、Prettierによって整形されたコードが期待通りのクォートスタイルになっているかの最終確認を行う、という理想的なワークフローが実現します。

EditorConfigの利用

EditorConfigは、異なるエディタやIDE間で一貫したコーディングスタイルを定義するためのファイルフォーマットです。Prettierの設定と重複する部分もありますが、エディタレベルでの初期設定や、Prettierが対応していない一部の言語の基本的な整形ルール(インデントスタイル、改行コードなど)を設定できます。

クォートに関する直接的な設定はPrettierほど強力ではありませんが、一部のエディタは.editorconfigの情報を利用して、ファイル保存時の初期入力や基本的な整形を行うことがあります。

.editorconfigの例

# .editorconfig
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
# quote_type = single または double のような設定は、EditorConfigの標準にはない
# しかし、一部のエディタプラグインが独自に解釈する可能性はゼロではない

Prettierは.editorconfigの特定のオプション(例: indent_size)を尊重することがありますが、クォートに関してはPrettier自身のsingleQuoteオプションが優先されます。

もしPrettierの「意見のある」アプローチや特定の「Quotes」の挙動がどうしてもプロジェクトに合わない場合、Prettier以外のフォーマッターを検討することもできます。ただし、Prettierほど広く使われ、多言語に対応し、エディタとの連携がスムーズなものは多くありません。

一般的な代替手段としては:

  • JS Beautify: より多くのカスタマイズオプションを持つフォーマッターですが、Prettierほど「意見のある」ものではなく、設定が複雑になる傾向があります。
  • StandardJS: 設定不要で、厳格なJavaScriptのスタイルガイドとフォーマッターを組み合わせたものです。シングルクォートがデフォルトで強制されます。独自の意見が非常に強いため、StandardJSのルールセット全体を受け入れる必要があります。
  • ESLintの--fixオプション: ESLint自体に多くの整形ルールがあり、--fixオプションで自動修正が可能です。Prettierのような「総合的なフォーマッター」ではありませんが、クォートに関するルール(quotesルール)を設定し、自動修正させることができます。Prettierを使用しない場合は、これが主要なコードスタイル強制ツールとなります。

Prettierの「Quotes」に関する代替方法は、**「Prettierの機能を補完し、より厳密な制御を行うためにESLintと連携する」**のが最も一般的で効果的なアプローチです。ESLintはPrettierでカバーしきれないコード品質の側面を補完しつつ、Prettierの整形ルールとの競合を防ぐための強力な仕組みを提供します。