React開発に必要なツール|VS Code拡張機能おすすめ5選

React開発を効率化するVS Code拡張機能を厳選紹介。ES7+ React/Redux/React-Native snippets、Prettier、ESLintなど実際の使い方とともに詳しく解説します。

Learning Next 運営
35 分で読めます

みなさん、React開発でコーディングに時間がかかりすぎて疲れていませんか?

「毎回同じコードを手打ちするのが面倒」「コードの書き方がバラバラで統一感がない」「エラーに気づくのが遅くて困る」といった悩みを抱えている方も多いでしょう。

この記事では、そんな悩みを解決してくれるVS Code拡張機能を5つ厳選してご紹介します。 これらの拡張機能を使えば、コーディング効率が劇的にアップして、もっと楽しくReact開発できるようになりますよ。

なぜVS CodeがReact開発におすすめなのか

VS CodeはReact開発において最も人気のエディターです。

無料で使えるうえに、豊富な拡張機能が用意されています。

VS Codeのメリット

React開発でVS Codeを使うメリットを見てみましょう。

// VS CodeでReact開発するメリット
const vscodeAdvantages = {
    intellisense: {
        description: 'コード補完・型推論',
        benefits: ['タイポの防止', '開発速度向上', 'APIの発見']
    },
    
    debugging: {
        description: 'デバッグ機能',
        benefits: ['ブレークポイント設定', '変数監視', 'ステップ実行']
    },
    
    git_integration: {
        description: 'Git統合',
        benefits: ['差分表示', 'コミット操作', 'ブランチ管理']
    },
    
    extensions: {
        description: '豊富な拡張機能',
        benefits: ['カスタマイズ性', '専門ツール', 'ワークフロー最適化']
    }
};

このコードは、VS Codeの主要な機能を整理したものです。

intellisenseでは、コードを書いているときに候補を表示してくれます。 debugging機能により、エラーの原因を特定しやすくなります。 git_integrationで、バージョン管理もスムーズに行えます。

React開発で重要な機能

VS CodeがReact開発で重宝される理由をもう少し詳しく見てみましょう。

  • 構文ハイライト: JSXやTypeScriptのコードが見やすくなる
  • コード補完: コンポーネントやpropsの入力をサポート
  • エラー検出: 構文エラーや型エラーをリアルタイムで発見
  • リファクタリング: 変数名の変更やimport文の整理が簡単
  • スニペット: よく使うコードパターンを自動生成

これらの機能により、開発効率が大幅にアップします。

1. ES7+ React/Redux/React-Native snippets

React開発で最も重要な拡張機能の一つです。

短いキーワードで、頻繁に使うコードを自動生成できます。

インストール方法

インストール方法はとても簡単です。

# VS Code拡張機能のインストール方法
# 1. VS Codeを開く
# 2. Ctrl+Shift+X (macOS: Cmd+Shift+X) で拡張機能パネルを開く
# 3. "ES7+ React/Redux/React-Native snippets" を検索
# 4. インストールボタンをクリック

これだけで、便利なスニペットが使えるようになります。

コマンドパレットからもインストール可能です。

主要なスニペット

実際に使えるスニペットを見てみましょう。

// rfce - React Function Component Export
import React from 'react'

function ComponentName() {
    return (
        <div>ComponentName</div>
    )
}

export default ComponentName

rfceと入力してTabキーを押すと、上記のコードが自動生成されます。

関数コンポーネントの基本形がすぐに作れて便利です。

// rafce - React Arrow Function Component Export
import React from 'react'

const ComponentName = () => {
    return (
        <div>ComponentName</div>
    )
}

export default ComponentName

rafceはアロー関数版のコンポーネントを生成します。

好みに応じて使い分けてください。

// useState スニペット
const [state, setState] = useState(initialState)

// useEffect スニペット
useEffect(() => {
    // effect
    return () => {
        // cleanup
    }
}, [])

Hooksのコードも簡単に生成できます。

useStateuseEffectと入力するだけで、基本的な構文が完成します。

実際の使用例

具体的な使い方を見てみましょう。

// スニペットを使った効率的なコンポーネント作成手順

// 1. 新しいファイル作成: UserProfile.jsx
// 2. "rafce" と入力してTabキー
// 3. コンポーネント名が自動で "UserProfile" に変更される

import React from 'react'

const UserProfile = () => {
    return (
        <div>UserProfile</div>
    )
}

export default UserProfile

まず、新しいファイルを作成します。

rafceと入力してTabキーを押すと、基本的なコンポーネント構造が完成します。 ファイル名に合わせて、コンポーネント名も自動で設定されます。

次に、Hooksを追加してみましょう。

// 4. useState追加: "useState" と入力してTabキー
import React, { useState } from 'react'

const UserProfile = () => {
    const [user, setUser] = useState(null)
    
    return (
        <div>UserProfile</div>
    )
}

export default UserProfile

useStateと入力すると、Hook の基本形が挿入されます。

importも自動で追加されるので、手動で書く必要がありません。

// 5. useEffect追加: "useEffect" と入力してTabキー
import React, { useState, useEffect } from 'react'

const UserProfile = () => {
    const [user, setUser] = useState(null)
    
    useEffect(() => {
        // ユーザーデータを取得
        fetchUserData()
        return () => {
            // クリーンアップ処理
        }
    }, [])
    
    const fetchUserData = async () => {
        try {
            const response = await fetch('/api/user')
            const userData = await response.json()
            setUser(userData)
        } catch (error) {
            console.error('ユーザーデータ取得エラー:', error)
        }
    }
    
    return (
        <div>
            {user ? (
                <div>
                    <h1>{user.name}</h1>
                    <p>{user.email}</p>
                </div>
            ) : (
                <div>読み込み中...</div>
            )}
        </div>
    )
}

export default UserProfile

useEffectも同様に、テンプレートが自動生成されます。

クリーンアップ関数の形も含まれているので、正しい書き方が身につきます。

2. Prettier - Code formatter

コードの整形を自動化する必須の拡張機能です。

チーム開発では、コードスタイルの統一が重要ですよね。

インストールと設定

まず、VS Codeに拡張機能をインストールします。

# VS Code拡張機能としてインストール
# "Prettier - Code formatter" を検索してインストール

# プロジェクトにPrettierをインストール
npm install --save-dev prettier

# グローバルインストール(推奨)
npm install -g prettier

VS Codeの拡張機能とプロジェクトの両方にインストールします。

グローバルインストールしておくと、どのプロジェクトでも使えて便利です。

設定ファイルの作成

プロジェクトのルートに設定ファイルを作成します。

// .prettierrc (プロジェクトルート)
{
    "semi": true,
    "trailingComma": "es5",
    "singleQuote": true,
    "printWidth": 80,
    "tabWidth": 2,
    "useTabs": false,
    "bracketSpacing": true,
    "arrowParens": "avoid",
    "endOfLine": "lf",
    "jsxSingleQuote": true,
    "jsxBracketSameLine": false
}

この設定により、コードが統一されたスタイルで整形されます。

semiはセミコロンの有無を指定します。 singleQuoteでシングルクォートを使用するよう設定しています。 printWidthは1行の最大文字数を決めます。

除外ファイルの設定も忘れずに行いましょう。

// .prettierignore (フォーマット除外ファイル)
node_modules
build
dist
*.min.js
*.min.css
public
.next

これらのファイルは、フォーマットの対象外になります。

VS Code設定

VS Code側の設定も重要です。

// settings.json
{
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.codeActionsOnSave": {
        "source.fixAll": true,
        "source.organizeImports": true
    },
    "[javascript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[javascriptreact]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[typescript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[typescriptreact]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    }
}

formatOnSaveを有効にすると、保存時に自動でフォーマットされます。

各言語に対してPrettierをデフォルトフォーマッターに設定しています。

Before/After 例

実際の整形効果を見てみましょう。

// Before: フォーマット前
import React,{useState,useEffect}from'react';
import{fetchUserData,updateUserProfile}from'../services/userService';

const UserProfile=({userId,onUpdate})=>{
const[user,setUser]=useState(null);const[loading,setLoading]=useState(false);
const[error,setError]=useState(null);

useEffect(()=>{
if(userId){
loadUserData();
}
},[userId]);

const loadUserData=async()=>{
setLoading(true);
try{
const userData=await fetchUserData(userId);setUser(userData);
}catch(err){
setError(err.message);
}finally{
setLoading(false);
}
};

return(<div>{loading?<div>Loading...</div>:error?<div>Error: {error}</div>:user?<div><h1>{user.name}</h1><p>{user.email}</p></div>:<div>No user data</div>}</div>);
};

export default UserProfile;

上記は、フォーマット前の読みにくいコードです。

改行やインデントがバラバラで、とても読みづらいですね。

// After: Prettierフォーマット後
import React, { useState, useEffect } from 'react';
import {
  fetchUserData,
  updateUserProfile,
} from '../services/userService';

const UserProfile = ({ userId, onUpdate }) => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    if (userId) {
      loadUserData();
    }
  }, [userId]);

  const loadUserData = async () => {
    setLoading(true);
    try {
      const userData = await fetchUserData(userId);
      setUser(userData);
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  };

  return (
    <div>
      {loading ? (
        <div>Loading...</div>
      ) : error ? (
        <div>Error: {error}</div>
      ) : user ? (
        <div>
          <h1>{user.name}</h1>
          <p>{user.email}</p>
        </div>
      ) : (
        <div>No user data</div>
      )}
    </div>
  );
};

export default UserProfile;

Prettierによる整形後は、とても読みやすくなりました。

import文が適切に改行され、インデントも統一されています。 JSXの条件分岐も見やすい形に整形されています。

3. ESLint

JavaScript/Reactのコード品質をチェックする必須ツールです。

リアルタイムでエラーや問題を検出してくれます。

インストールと初期設定

まず、必要なパッケージをインストールします。

# ESLint拡張機能をVS Codeにインストール
# "ESLint" を検索してインストール

# プロジェクトにESLintをインストール
npm install --save-dev eslint

# ESLint初期設定
npx eslint --init

# React用の追加パッケージ
npm install --save-dev eslint-plugin-react eslint-plugin-react-hooks

VS Codeの拡張機能とプロジェクトの両方にインストールします。

React用のプラグインも追加で必要です。

ESLint設定ファイル

設定ファイルを作成しましょう。

// .eslintrc.json
{
  "env": {
    "browser": true,
    "es2021": true,
    "node": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:react-hooks/recommended"
  ],
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    },
    "ecmaVersion": 12,
    "sourceType": "module"
  },
  "plugins": [
    "react",
    "react-hooks"
  ],
  "rules": {
    "react/react-in-jsx-scope": "off",
    "react/prop-types": "warn",
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn",
    "no-unused-vars": "warn",
    "no-console": "warn",
    "prefer-const": "error",
    "no-var": "error",
    "indent": ["error", 2],
    "quotes": ["error", "single"],
    "semi": ["error", "always"]
  },
  "settings": {
    "react": {
      "version": "detect"
    }
  }
}

この設定により、React固有のルールが適用されます。

extendsでReactの推奨設定を継承しています。 rulesで独自のルールを定義できます。 react-hooks/rules-of-hooksでHooksのルールを強制しています。

実際のエラー検出例

ESLintが検出するエラーを見てみましょう。

// ESLintが検出するエラーの例

// 1. 未使用変数の警告
import React, { useState, useEffect } from 'react';

const MyComponent = () => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [unusedVariable, setUnusedVariable] = useState(''); // ← 警告: 未使用

  // 2. useEffectの依存配列不足
  useEffect(() => {
    fetchData();
  }, []); // ← 警告: fetchDataが依存配列にない

  const fetchData = async () => {
    setLoading(true);
    // データ取得処理
    setLoading(false);
  };

  // 3. PropTypesの不足
  return <div>{data}</div>;
};

// 4. export defaultの不足
// ← エラー: export defaultがない

このコードには、いくつかの問題があります。

未使用変数や依存配列の不足など、バグの原因となる問題を自動検出してくれます。

修正版を見てみましょう。

// 修正版
import React, { useState, useEffect, useCallback } from 'react';
import PropTypes from 'prop-types';

const MyComponent = ({ apiEndpoint }) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);

  const fetchData = useCallback(async () => {
    setLoading(true);
    try {
      const response = await fetch(apiEndpoint);
      const result = await response.json();
      setData(result);
    } catch (error) {
      console.error('データ取得エラー:', error);
    } finally {
      setLoading(false);
    }
  }, [apiEndpoint]);

  useEffect(() => {
    fetchData();
  }, [fetchData]);

  return <div>{loading ? 'Loading...' : data}</div>;
};

MyComponent.propTypes = {
  apiEndpoint: PropTypes.string.isRequired,
};

export default MyComponent;

修正版では、ESLintの警告がすべて解決されています。

useCallbackを使って依存関係を適切に管理しています。 PropTypesでpropsの型チェックも追加しました。

4. Auto Rename Tag

JSX/HTMLタグのペアを自動で同期する便利な拡張機能です。

開始タグを変更すると、終了タグも自動で変更されます。

基本機能

実際の動作を見てみましょう。

// Before: 開始タグを変更
<div className="container">
  <h1>タイトル</h1>
  <p>段落テキスト</p>
</div>

// 開始タグの "div" を "section" に変更すると...
<section className="container">
  <h1>タイトル</h1>
  <p>段落テキスト</p>
</section>
// ← 終了タグも自動で "section" に変更される

開始タグの名前を変更するだけで、終了タグも自動で変更されます。

タイポやタグの閉じ忘れによるエラーを防げます。

実際の使用場面

どんな場面で役立つか見てみましょう。

// 1. セマンティックなHTML要素への変更
// div → section
<div className="hero-section">
  <h1>ヒーローセクション</h1>
</div>
↓
<section className="hero-section">
  <h1>ヒーローセクション</h1>
</section>

// 2. コンポーネント名の変更
// Button → CustomButton
<Button onClick={handleClick}>
  クリック
</Button>
↓
<CustomButton onClick={handleClick}>
  クリック
</CustomButton>

セマンティックなHTMLに変更する際に特に便利です。

コンポーネント名を変更する場合も、手動で両方を変更する必要がありません。

複雑なネストした要素でも正しく動作します。

// 3. 複雑なネストした要素
<article className="blog-post">
  <header>
    <h2>記事タイトル</h2>
  </header>
  <main>
    <p>記事内容</p>
  </main>
  <footer>
    <p>投稿日時</p>
  </footer>
</article>

// headerをdivに変更すると、終了タグも自動変更
<article className="blog-post">
  <div>
    <h2>記事タイトル</h2>
  </div>
  <main>
    <p>記事内容</p>
  </main>
  <footer>
    <p>投稿日時</p>
  </footer>
</article>

ネストした構造でも、正確に対応するタグを認識してくれます。

5. Bracket Pair Colorizer 2

対応する括弧を色分けして、コードの構造を視覚的に分かりやすくします。

複雑なJavaScriptコードでは、括弧の対応関係を把握するのが困難ですよね。

基本機能

実際の色分け効果を見てみましょう。

// 色分けによる視覚的な理解向上
const MyComponent = () => {  // 括弧レベル1: 青
  const handleClick = () => {  // 括弧レベル2: 緑
    if (condition) {  // 括弧レベル3: 赤
      setState(prevState => ({  // 括弧レベル4: 黄
        ...prevState,
        count: prevState.count + 1
      }));
    }
  };

  return (
    <div>  {/* JSX括弧: 紫 */}
      {items.map(item => (  {/* 括弧レベル: オレンジ */}
        <div key={item.id}>
          {item.name}
        </div>
      ))}
    </div>
  );
};

括弧の深さに応じて、異なる色が適用されます。

これにより、コードの構造が視覚的に理解しやすくなります。 特に、関数の入れ子やJSXの構造を把握するのに役立ちます。

実践的な活用例

複雑なコードでの活用例を見てみましょう。

// 複雑なネストした構造での活用
const ComplexComponent = ({ data, config, handlers }) => {  // レベル1
  const processedData = useMemo(() => {  // レベル2
    return data.filter(item => {  // レベル3
      return config.filters.some(filter => {  // レベル4
        return filter.conditions.every(condition => {  // レベル5
          return condition.evaluate(item);
        });
      });
    });
  }, [data, config]);

  return (
    <div className="complex-component">  {/* JSX */}
      {processedData.map(item => (  {/* マップ */}
        <div key={item.id} className="item">
          {config.showDetails && (  {/* 条件分岐 */}
            <div className="details">
              {Object.entries(item.details).map(([key, value]) => (  {/* ネストしたマップ */}
                <span key={key}>
                  {key}: {typeof value === 'object' ? (  {/* さらなる条件分岐 */}
                    JSON.stringify(value)
                  ) : (
                    value
                  )}
                </span>
              ))}
            </div>
          )}
        </div>
      ))}
    </div>
  );
};

このような複雑なコードでも、色分けのおかげで構造を把握しやすくなります。

どの括弧がどの関数に対応しているかが一目で分かりますね。

VS Code設定の最適化

React開発に特化したVS Code設定を紹介します。

これらの設定により、さらに効率的な開発が可能になります。

統合設定ファイル

プロジェクトの.vscode/settings.jsonに以下を設定します。

// settings.json (プロジェクト内 .vscode/settings.json)
{
  "editor.fontSize": 14,
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  "editor.wordWrap": "on",
  "editor.minimap.enabled": true,
  "editor.suggestSelection": "first",
  
  // フォーマット設定
  "editor.formatOnSave": true,
  "editor.formatOnType": true,
  "editor.formatOnPaste": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  
  // ESLint設定
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact"
  ],
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
    "source.organizeImports": true
  },
  
  // ファイル自動保存
  "files.autoSave": "onFocusChange",
  "files.exclude": {
    "**/node_modules": true,
    "**/build": true,
    "**/dist": true,
    "**/.git": true,
    "**/.DS_Store": true
  },
  
  // Emmet設定
  "emmet.includeLanguages": {
    "javascript": "javascriptreact",
    "typescript": "typescriptreact"
  },
  "emmet.triggerExpansionOnTab": true,
  
  // TypeScript設定
  "typescript.updateImportsOnFileMove.enabled": "always",
  "typescript.suggest.autoImports": true,
  "typescript.preferences.importModuleSpecifier": "relative"
}

この設定により、React開発に最適化されたエディター環境が構築されます。

formatOnSaveで保存時に自動フォーマットされます。 eslintの設定により、コード品質も自動でチェックされます。 emmetでJSXの入力も効率化されます。

ワークスペース設定

チーム開発では、推奨拡張機能を共有しましょう。

// .vscode/extensions.json (推奨拡張機能)
{
  "recommendations": [
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint",
    "formulahendry.auto-rename-tag",
    "coenraads.bracket-pair-colorizer-2",
    "dsznajder.es7-react-js-snippets",
    "eamodio.gitlens",
    "ms-vscode.vscode-typescript-next",
    "christian-kohler.path-intellisense",
    "rangav.vscode-thunder-client"
  ]
}

この設定により、チームメンバーが同じ拡張機能を使用できます。

プロジェクトを開いたときに、推奨拡張機能のインストールが促されます。

チーム開発での設定共有

プロジェクト全体で一貫した開発環境を構築する方法です。

package.jsonでの設定管理

{
  "name": "my-react-project",
  "scripts": {
    "dev": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "lint": "eslint src/ --ext .js,.jsx,.ts,.tsx",
    "lint:fix": "eslint src/ --ext .js,.jsx,.ts,.tsx --fix",
    "format": "prettier --write src/",
    "format:check": "prettier --check src/",
    "type-check": "tsc --noEmit"
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "src/**/*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ]
  }
}

この設定により、コミット前に自動でLintとフォーマットが実行されます。

huskyでGitフックを設定し、lint-stagedでステージングされたファイルのみを処理します。

まとめ

React開発を効率化するVS Code拡張機能について解説しました。

必須の5つの拡張機能

  1. ES7+ React/Redux/React-Native snippets - コード生成の自動化
  2. Prettier - コードフォーマットの統一
  3. ESLint - コード品質の向上
  4. Auto Rename Tag - タグ編集の効率化
  5. Bracket Pair Colorizer 2 - コード構造の視覚化

これらの拡張機能を適切に設定することで、開発効率が大幅に向上します。

特に設定ファイルをプロジェクトで共有することで、チーム全体が同じ開発環境で作業できます。

実践のポイント

  • 設定ファイルは必ずプロジェクトに含める
  • チーム全体で同じ拡張機能を使用する
  • 定期的に設定を見直して最適化する

ぜひこれらの拡張機能を導入して、より快適で効率的なReact開発環境を構築してみてください。

きっと開発の生産性が向上するはずです!

関連記事