前提・実現したいこと
VSCodeエディタで、TypeScript + Reactのコードを書いています。
コードフォーマッター(自動整形)がうまくいかず困っています。
JSXタグの属性値を改行したいのですが、自動整形機能のせいで改行無しの状態に戻されてしまいます。
なんとか改行できるように設定を変更すると、今度は自動インデントの機能が効かなくなってしまいます。
・属性値が複数ある場合は改行をする
・自動インデントを有効にする
これを両立させたいです。
発生している問題・該当のソースコード
<img src={logo} className='App-logo' alt='logo' /> の部分に注目して以下をご覧ください。Javascript
1// App.tsxの中身1 2function App() { 3 return ( 4 <div className='App'> 5 <header className='App-header'> 6// 最初の状態 7 <img src={logo} className='App-logo' alt='logo' /> 8 <p> 9 Edit <code>src/App.tsx</code> and save to reload. 10 </p> 11 <a 12 className='App-link' 13 href='https://reactjs.org' 14 target='_blank' 15 rel='noopener noreferrer' 16 > 17 Learn React 18 </a> 19 </header> 20 </div> 21 ); 22}
Javascript
1// App.tsxの中身2 2import React from 'react'; 3import logo from './logo.svg'; 4import './App.css'; 5 6function App() { 7 return ( 8 <div className='App'> 9 <header className='App-header'> 10 11// この状態にしたい(属性値を改行したい) 12 <img 13 src={logo} 14 className='App-logo' 15 alt='logo' 16 /> 17 <p> 18 Edit <code>src/App.tsx</code> and save to reload. 19 </p> 20 <a 21 className='App-link' 22 href='https://reactjs.org' 23 target='_blank' 24 rel='noopener noreferrer' 25 > 26 Learn React 27 </a> 28 </header> 29 </div> 30 ); 31} 32 33export default App; 34
Javascript
1// App.tsxの中身3 2import React from 'react'; 3import logo from './logo.svg'; 4import './App.css'; 5 6function App() { 7 return ( 8 <div className='App'> 9 <header className='App-header'> 10 11// こうなってしまう(改行するとインデント機能が効かない) 12 <img 13src={logo} 14className='App-logo' 15alt='logo' /> 16 <p> 17 Edit <code>src/App.tsx</code> and save to reload. 18 </p> 19 <a 20 className='App-link' 21 href='https://reactjs.org' 22 target='_blank' 23 rel='noopener noreferrer' 24 > 25 Learn React 26 </a> 27 </header> 28 </div> 29 ); 30} 31 32export default App; 33
試したこと
Windows 8.1 の環境で
コマンドプロンプトからtypescriptのreactプロジェクトを作成。
Windowsコマンドプロンプト
1create-react-app my-app --template typescript
App.tsxはこのタイミングで自動的に生成される。
my-appフォルダに.eslintrcというファイルを作成。
.eslintrcの中に以下の内容を記述。
// .eslintrcの中身 { "extends": "react-app", "rules": { "react/jsx-first-prop-new-line": [1, "multiline"], "react/jsx-max-props-per-line": [1, { "maximum": 1 } ] } }
"react/jsx-max-props-per-line"の設定により、JSXの属性が2個以上あるときは、自動改行されるようになります。
VSCodeでファイルを保存した瞬間に改行され、「App.tsxの中身3」の状態になります。
これに加えて、自動インデント機能を有効にしようと、settings.jsonの中に
"editor.formatOnSave": true
という記述を追加しました。
これにより自動インデントなどの機能は有効になるのですが、
ファイルを保存したタイミングで、「App.tsxの中身1」の状態になってしまいます。
おそらく、editorconfigもしくはprettierの
「1行は80文字を越えるときは自動的に改行する」という機能のせいで
80文字以内に収まるときは改行を強制的に無効化されている気がします。
JSXタグの属性値を改行しつつ、インデントもさせたいのですが、editorconfigとprettierとeslintのどの機能がどう干渉しあっているのか特定できていません。
いまは、App.tsxファイルを保存した瞬間に画面が一瞬ちらついて、
imgタグの部分が一瞬だけ下記の状態になり、
Javascript
1 <img 2src={logo} 3className='App-logo' 4alt='logo' />
最終的には下記の状態になっているっぽいです。
Javascript
1 <img src={logo} className='App-logo' alt='logo' />
このことから、.eslintrcの
"react/jsx-max-props-per-line"
の設定がまず最初に適用されて、
その後に、editorconfigかpretteirがコードを再フォーマットしているっぽいです。
Javascript
1 <img 2 src={logo} 3 className='App-logo' 4 alt='logo' 5 />
こういう感じのコード整形がされるようにするには、何をどう設定すればいいのでしょうか?
補足情報(FW/ツールのバージョンなど)
VSCodeに以下のエクステンションを入れています。
・EditorConfig for VS Code
・ESLint
・Prettier - Code formatter
あなたの回答
tips
プレビュー