Bracket Spacing
Prettierの「Bracket Spacing」とは、オブジェクトリテラルや分割代入などで使われる波括弧 {}
の内側のスペースの有無を制御する設定です。
具体的には、{ foo: bar }
のように波括弧の内側にスペースを入れるか、それとも {foo: bar}
のようにスペースを入れないか、という挙動を決定します。
この設定は、Prettierの設定ファイル(例: .prettierrc
や package.json
)で bracketSpacing
というオプションとして指定します。
設定値と挙動
bracketSpacing
オプションには、以下の2つの値が指定できます。
-
- 波括弧の内側にスペースが挿入されます。
- 例:
// 入力 const obj = {foo:bar}; function func({a,b}) { return a + b; } // Prettier適用後 (bracketSpacing: true) const obj = { foo: bar }; function func({ a, b }) { return a + b; }
- 多くのJavaScriptのコーディングスタイルガイド(例: Airbnbスタイルガイド)で推奨されている形式です。可読性が向上すると考えられています。
-
false
- 波括弧の内側にスペースが挿入されません。
- 例:
// 入力 const obj = { foo: bar }; function func({ a, b }) { return a + b; } // Prettier適用後 (bracketSpacing: false) const obj = {foo: bar}; function func({a, b}) { return a + b; }
- 古いJavaScriptのスタイルや、特定のプロジェクトのコーディング規約によってはこの形式が好まれることもあります。
なぜこの設定があるのか?
Prettierは「意見のある(opinionated)」フォーマッターであり、ほとんどのスタイルはデフォルトで固定されています。しかし、「Bracket Spacing」のような一部のスタイルは、開発コミュニティ内で意見が分かれることがあり、またプロジェクトごとに異なる規約が存在するため、設定で変更できるようになっています。
PrettierのbracketSpacing
設定自体が直接的にエラーメッセージを吐き出すことは稀ですが、意図しないフォーマットや、設定の誤解によって開発者が「エラー」と感じることがあります。ここでは、そうした一般的な問題と解決策を説明します。
意図しないスペースの挿入/削除
問題
- Gitの差分(diff)で、
bracketSpacing
に関する変更が大量に発生している。 bracketSpacing: false
に設定しているのに、波括弧の内側にスペースが挿入されてしまう。bracketSpacing: true
に設定しているのに、波括弧の内側にスペースが挿入されない。
原因
- 構文の誤解
bracketSpacing
は、オブジェクトリテラルや分割代入、インポート/エクスポートの波括弧に適用されます。配列の括弧[]
やテンプレートリテラルの波括弧${}
には適用されません。 - Prettierのバージョン
古いバージョンのPrettierでは、特定の構文に対してbracketSpacing
が期待通りに動作しない場合があります。 - 他のフォーマッターとの競合
ESLintやVS Codeのデフォルトフォーマッターなど、他のツールがPrettierと同時に動作し、Prettierの設定を上書きしている。 - 設定が正しく適用されていない
最も一般的な原因です。.prettierrc
などの設定ファイルが正しく読み込まれていない。- 複数のPrettier設定ファイルが存在し、意図しないものが優先されている。
- Prettierを適用する方法(CLI、IDE拡張など)が、設定ファイルを考慮していない。
トラブルシューティング
-
- プロジェクトルートに
.prettierrc
や.prettierrc.json
、prettier.config.js
などのファイルがあるか確認してください。 package.json
にprettier
キーがある場合も確認してください。- ファイル内で
bracketSpacing
が意図した値(true
またはfalse
)になっているか確認してください。 - 重要
プロジェクト内に複数のPrettier設定ファイルがないか確認し、意図しないファイルが優先されていないかチェックします(例: 親ディレクトリの設定が子ディレクトリに影響している場合など)。
- プロジェクトルートに
-
Prettierの実行方法の確認
- CLIでテスト
ターミナルで直接Prettierを実行し、設定が反映されるか確認します。
もしnpx prettier --write "src/**/*.{js,ts,jsx,tsx}" --config .prettierrc.json
.prettierrc.json
以外の設定ファイルを使っている場合は適宜変更してください。 - IDE拡張(VS Codeなど)
- VS Codeの場合:
settings.json
でeditor.defaultFormatter
がesbenp.prettier-vscode
になっていることを確認。editor.formatOnSave
がtrue
になっていることを確認。- ワークスペース設定がユーザー設定を上書きしていないか確認。
- コマンドパレットから「Format Document With...」を選択し、Prettierが選択されていることを確認。
- 拡張機能が有効になっているか確認し、必要であれば再ロード/再インストールを試す。
- VS Codeの場合:
- CLIでテスト
-
他のフォーマッターとの競合解決
- ESLint
- PrettierとESLintを併用する場合、
eslint-plugin-prettier
とeslint-config-prettier
を導入するのが一般的です。 eslint-config-prettier
は、Prettierと競合するESLintのルールを無効にする役割があります。これが正しく設定されているか確認してください。.eslintrc
ファイルでextends: ["prettier"]
がリストの最後にあることを確認してください。- PrettierがESLintの警告/エラーとして表示される場合は、ESLintの設定を見直してください。
- PrettierとESLintを併用する場合、
- VS Codeのデフォルトフォーマッター
VS CodeのデフォルトのJavaScript/TypeScriptフォーマッターがPrettierより優先されている可能性があります。settings.json
で"[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }
のように明示的に設定してください。
- ESLint
-
Prettierのバージョンアップ
package.json
でprettier
のバージョンを確認し、最新版(または安定版)に更新してみます。npm install prettier@latest
またはyarn add prettier@latest
-
キャッシュのクリア
- Node.jsプロジェクトの場合、
node_modules
ディレクトリを削除し、npm install
またはyarn install
を再実行することで、依存関係のキャッシュがクリアされ、問題が解決することがあります。
- Node.jsプロジェクトの場合、
コミットフックの問題
問題
husky
やlint-staged
などを使ったコミットフックでPrettierを実行しているが、bracketSpacing
の設定が反映されない、または予期せぬ変更が発生する。
原因
- CI/CD環境とローカル環境でPrettierのバージョンや設定の読み込みが異なる。
husky
の設定で、Prettierが正しく呼び出されていない。lint-staged
の設定で、Prettierに渡す引数が不足している、または間違っている。
トラブルシューティング
- package.json の lint-staged 設定確認
- 以下のように、適切なオプションが渡されているか確認します。
// package.json { "lint-staged": { "*.{js,jsx,ts,tsx,json,css,scss,md}": [ "prettier --write" // --config オプションは通常不要(Prettierが自動で設定を探すため) ] } }
--write
オプションがあることを確認してください。
- 以下のように、適切なオプションが渡されているか確認します。
- コミットフックのデバッグ
- 一時的に
lint-staged
やhusky
の設定を簡素化し、問題がどこにあるかを特定します。 - CI/CD環境で実行されるスクリプトをローカルで再現し、比較します。
- 一時的に
チーム内のスタイル不一致
問題
- Gitの差分が大量に発生し、コードレビューが困難になる。
- チームメンバー間で
bracketSpacing
の設定が異なり、フォーマットが衝突する。
原因
- IDEのフォーマットオンセーブ機能が、プロジェクトのPrettier設定ではなく個人の設定を参照している。
- チームメンバーがそれぞれのローカル環境で異なるPrettier設定を上書きしている。
- Prettierの設定ファイルがGit管理されていない、または無視されている(
.gitignore
に入っているなど)。
トラブルシューティング
- 設定ファイルの統一とGit管理
.prettierrc
などの設定ファイルをGitリポジトリにコミットし、全員が同じ設定を使うようにします。.prettierignore
も忘れずにコミットし、フォーマット対象外のファイルを指定します。
- プロジェクト設定の強制
- VS Codeを使用している場合、
.vscode/settings.json
に以下のような設定を追加し、ワークスペースの設定を推奨することで、個人の設定がプロジェクトに影響を与えないようにできます。// .vscode/settings.json { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "prettier.configPath": "./.prettierrc.json" // 必要に応じて }
- VS Codeを使用している場合、
- 開発ワークフローの整備
- コミットフック(
husky
+lint-staged
)を導入し、コミット時に自動的にフォーマットを強制する。これにより、スタイルの不一致がリポジトリに混入するのを防ぎます。
- コミットフック(
「Bracket Spacing」は、オブジェクトリテラルや分割代入などで使用される波括弧 {}
の内側にスペースを入れるかどうかに影響します。Prettierの設定ファイル(例: .prettierrc
または package.json
)でこのオプションを制御します。
設定ファイルの準備
まず、プロジェクトのルートディレクトリに .prettierrc
ファイルを作成します。このファイルにPrettierの設定を記述します。
.prettierrc
(JSON形式)
{
"printWidth": 80,
"tabWidth": 2,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true
}
または
{
"printWidth": 80,
"tabWidth": 2,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": false
}
上記の bracketSpacing
の値を true
または false
に変更することで、挙動が変わります。
bracketSpacing: true の場合 (デフォルト)
bracketSpacing
を true
に設定した場合、Prettierは波括弧の内側にスペースを挿入します。これは、より可読性が高いと一般的に考えられているスタイルです。
.prettierrc
{
"bracketSpacing": true
}
Prettier適用前のコード (入力)
// オブジェクトリテラル
const myObject = {key:"value",another:123};
// 分割代入
const {name,age}=person;
// インポート文
import {Component,useState} from 'react';
// エクスポート文
export {someVar,anotherVar};
Prettier適用後のコード (出力)
// オブジェクトリテラル
const myObject = { key: "value", another: 123 };
// 分割代入
const { name, age } = person;
// インポート文
import { Component, useState } from "react";
// エクスポート文
export { someVar, anotherVar };
解説: 波括弧 {}
の内側 (key: "value"
, name, age
など) にスペースが追加されています。
bracketSpacing: false の場合
bracketSpacing
を false
に設定した場合、Prettierは波括弧の内側のスペースを削除します。
.prettierrc
{
"bracketSpacing": false
}
Prettier適用前のコード (入力)
// オブジェクトリテラル
const myObject = { key: "value", another: 123 };
// 分割代入
const { name, age } = person;
// インポート文
import { Component, useState } from 'react';
// エクスポート文
export { someVar, anotherVar };
Prettier適用後のコード (出力)
// オブジェクトリテラル
const myObject = {key: "value", another: 123};
// 分割代入
const {name, age} = person;
// インポート文
import {Component, useState} from 'react';
// エクスポート文
export {someVar, anotherVar};
解説: 波括弧 {}
の内側からスペースが削除されています。
影響を受けない例
bracketSpacing
は、オブジェクトリテラルや分割代入、import/export
構文の波括弧にのみ影響します。以下のケースには影響しません。
-
関数の括弧 ()
// 入力 function func( arg1, arg2 ) { /* ... */ } const arrowFunc = ( param ) => { /* ... */ }; // 出力 (bracketSpacing の設定に関わらず変化なし) function func(arg1, arg2) { /* ... */ } const arrowFunc = (param) => { /* ... */ };
-
テンプレートリテラルの波括弧 ${}
// 入力 const greeting = `Hello, ${ name }!`; // 出力 (bracketSpacing の設定に関わらず変化なし) const greeting = `Hello, ${name}!`; // 変数名の前後にスペースは入りません
-
// 入力 const myArray = [1, 2, 3]; const [first, second] = arr; // 出力 (bracketSpacing の設定に関わらず変化なし) const myArray = [1, 2, 3]; const [first, second] = arr;
Prettierの実行方法
上記の .prettierrc
ファイルを配置した後、プロジェクトのルートディレクトリで以下のコマンドを実行すると、設定が適用されます。
# プロジェクト内の全てのJS/TS/JSONファイルをフォーマット
npx prettier --write "**/*.{js,jsx,ts,tsx,json}"
または、VS CodeなどのIDEにPrettier拡張機能をインストールし、「保存時にフォーマット(Format On Save)」を有効にすることで、ファイルを保存するたびに自動的にフォーマットされます。
PrettierのbracketSpacing
オプション自体が非常にシンプルであるため、これに直接的な「代替」はあまり多くありません。しかし、以下の方法で同様の効果を得たり、Prettierのフォーマットに影響を与えたりすることができます。
ESLintのルールを使用する
Prettierを使わずにコードスタイルを強制したい場合、またはPrettierとESLintを併用していてより詳細な制御が必要な場合に、ESLintのルールを使用できます。
関連するESLintルール
import/extensions
(eslint-plugin-import): インポート文の波括弧に関する直接的なルールではありませんが、インポート文の構文に関する問題を解決する際に参照されることがあります。object-curly-spacing
: オブジェクトリテラルや分割代入の波括弧内のスペースを制御します。"always"
:bracketSpacing: true
と同じ挙動 ({ foo: bar }
)"never"
:bracketSpacing: false
と同じ挙動 ({foo: bar}
)- 例:
// .eslintrc.js module.exports = { rules: { "object-curly-spacing": ["error", "always"] // PrettierのbracketSpacing: true と同じ // または "object-curly-spacing": ["error", "never"] // PrettierのbracketSpacing: false と同じ } };
注意点
PrettierとESLintを併用する場合、eslint-config-prettier
を使用してPrettierと競合するESLintのフォーマットルールを無効にすることが強く推奨されます。これを怠ると、ESLintがPrettierのフォーマットを元に戻そうとし、無限ループのような状況に陥ることがあります。
// .eslintrc.js
module.exports = {
extends: [
"eslint:recommended",
// 他のESLint設定
"prettier" // これをリストの最後に追加する
],
// ...
};
eslint-config-prettier
を使用している場合、object-curly-spacing
のようなフォーマットに関するESLintルールは無効になるため、PrettierのbracketSpacing
が優先されます。したがって、この方法は「Prettierを使わずにスタイルを強制する」場合に有効であり、Prettierと併用する場合はPrettierの設定が主になります。
エディタ/IDEの自動フォーマット設定 (Prettierを使用しない場合)
Prettierを使用せず、Visual Studio Codeなどのエディタの組み込みフォーマッターや、他のフォーマッター(例: JavaScript Standard Style、AirbnbスタイルガイドのESLint設定など)を使用している場合、エディタの設定で波括弧内のスペースを制御できます。
例えば、VS CodeではJavaScript/TypeScriptの組み込みフォーマッターの設定で、関連するオプションがあるかもしれません。しかし、これらは通常、Prettierほど柔軟ではなく、言語のデフォルトのフォーマットに依存します。
例 (VS Codeの settings.json - Prettierが有効な場合は上書きされる可能性が高い)
// VS Codeの settings.json
{
"javascript.format.insertSpaceBeforeFunctionParenthesis": true, // これは関数呼び出しの括弧に影響し、bracketSpacingとは異なる
// オブジェクトリテラル内のスペースを直接制御する組み込みオプションは通常ありません。
// そのため、多くの開発者はPrettierのような外部フォーマッターを使用します。
}
注意点
これは「Bracket Spacing」に直接対応するものではなく、多くの場合、ESLintなどのリンターがフォーマットルールを補完します。
Prettierのoverridesオプションで特定のファイルに適用する
bracketSpacing
はプロジェクト全体で一貫したスタイルを適用するのが一般的ですが、特定のファイルやディレクトリに対してのみ異なるbracketSpacing
設定を適用したい場合があります。Prettierのoverrides
オプションを使用すると、これが可能です。
例: 特定のファイルだけ bracketSpacing: false
にする
// .prettierrc
{
"bracketSpacing": true, // デフォルトは true
"overrides": [
{
"files": "*.legacy.js", // 例えば、レガシーなファイルだけ
"options": {
"bracketSpacing": false
}
},
{
"files": ["**/components/**/*.jsx", "**/views/**/*.tsx"], // 特定のコンポーネントディレクトリだけ
"options": {
"bracketSpacing": false
}
}
]
}
この方法は、プロジェクトの一部で異なるコーディング規約に従う必要がある場合や、移行期間中に一時的に異なるスタイルを許可したい場合に便利です。
「Bracket Spacing」に関して、Prettierの代替方法を検討する場合、主に以下の点が考えられます。
- PrettierとESLintの競合を避けたい場合
eslint-config-prettier
を正しく設定する。 - Prettierを使いつつ、より柔軟に制御したい場合
Prettierのoverrides
オプションを使う。 - Prettierを使わない場合
ESLintのobject-curly-spacing
ルールなどを活用する。