ReactでSyntaxErrorが出る|構文エラーの見つけ方

ReactでSyntaxErrorが発生する原因と解決方法を詳しく解説。よくある構文エラーの見つけ方とデバッグ方法を初心者向けに説明します。

Learning Next 運営
23 分で読めます

みなさん、ReactでSyntaxErrorが出て困ったことはありませんか?

「Unexpected token」「Unexpected identifier」といったエラーメッセージが表示されると、どこに問題があるのか分からなくなりますよね。 エラーの解決に時間がかかって、開発が進まないこともあるでしょう。

でも大丈夫です!

この記事では、ReactでよくあるSyntaxErrorの原因と効率的な見つけ方を、実際のコード例とともに詳しく解説します。 エラーメッセージの読み方から実践的なデバッグ手順まで、初心者の方でも迷わず解決できるようになります。

SyntaxErrorって何?理解しておきたい基本知識

まずは、SyntaxErrorがなぜ発生するのかを理解しましょう。

構文エラーの正体

SyntaxErrorは、JavaScript(JSX)の構文規則に違反した場合に発生するエラーです。

簡単に言うと、「コードの書き方が間違っている」ということなんです。 人間が話すときの文法エラーと同じようなものですね。

// SyntaxErrorの例
function App() {
  return (
    <div>
      <h1>Hello World</h1>
    </div>
  // 括弧の閉じ忘れ
}

このコードは「)」が不足しているため、SyntaxErrorが発生します。

JavaScriptエンジンが「あれ?この書き方はおかしいぞ」と判断して、エラーを出すわけです。

エラーが起こるタイミング

構文エラーは、コンパイル時点で検出されます。 つまり、アプリケーションが起動する前にエラーが見つかるということです。

これは実はメリットでもあります。 なぜなら、実際にユーザーがアプリを使っている時ではなく、開発中に問題を発見できるからです。

よくある初心者の悩み

React初心者の方によくある悩みをいくつか挙げてみます。

  • エラーメッセージが英語で分からない
  • エラーの場所が特定できない
  • 同じようなエラーが何度も起こる
  • 修正してもまた別のエラーが出る

これらの悩みを、これから一つずつ解決していきましょう。

よくあるSyntaxErrorパターンを覚えよう

Reactでよく遭遇するSyntaxErrorのパターンを見ていきます。 これらを覚えておくと、エラーが起きた時にすぐに原因を特定できますよ。

パターン1: 括弧の不一致

一番よくあるエラーがこれです。

// 問題のあるコード
function Component() {
  return (
    <div>
      <h1>Title</h1>
      <p>Content</p>
    </div>
  // 括弧が足りない
}

このコードでは、returnの後の括弧が閉じられていません。

// 修正後
function Component() {
  return (
    <div>
      <h1>Title</h1>
      <p>Content</p>
    </div>
  );
}

修正のポイント: return (の後には必ず);で閉じることを忘れずに。

エディタで括弧の対応をハイライトしてくれる設定にしておくと、こうしたミスを防げます。

パターン2: JSXの複数要素問題

JSXでは、複数の要素を直接returnすることができません

// 問題のあるコード
function App() {
  return (
    <div>
      <h1>Hello World</h1>
      <p>This is a paragraph</p>
    </div>
    <div>
      <p>Another paragraph</p>
    </div>
  );
}

このコードでは、2つの<div>要素を並列で返そうとしています。 JSXでは、returnできるのは単一の要素のみです。

// 修正後(React Fragmentで囲む)
function App() {
  return (
    <>
      <div>
        <h1>Hello World</h1>
        <p>This is a paragraph</p>
      </div>
      <div>
        <p>Another paragraph</p>
      </div>
    </>
  );
}

修正のポイント: <>...</>(React Fragment)で囲むか、一つの親要素で包むこと。

React Fragmentを使うと、余分なDOM要素を作らずに済むので便利です。

パターン3: 属性名の間違い

HTMLとJSXでは、属性名が異なる場合があります。

// 問題のあるコード
function Button() {
  return (
    <button class="btn" onclick="handleClick()">
      Click me
    </button>
  );
}

HTMLではclassonclickですが、JSXでは違う名前を使います。

// 修正後(React用の属性名)
function Button() {
  const handleClick = () => {
    alert('クリックされました!');
  };

  return (
    <button className="btn" onClick={handleClick}>
      Click me
    </button>
  );
}

修正のポイント:

  • classclassName
  • onclickonClick
  • 文字列ではなく関数を渡す

JSXでは、イベントハンドラーは文字列ではなく関数として渡すことも重要です。

パターン4: 変数展開の波括弧忘れ

JSX内で変数を使用する時は、波括弧{}で囲む必要があります。

// 問題のあるコード
function UserCard({ user }) {
  return (
    <div>
      <h3>{user.name}</h3>
      <p>Age: {user.age}</p>
      <p>Email: user.email</p> {/* 波括弧が不足 */}
    </div>
  );
}

3行目のuser.emailには波括弧がありません。 これだと、文字列として「user.email」と表示されてしまいます。

// 修正後
function UserCard({ user }) {
  return (
    <div>
      <h3>{user.name}</h3>
      <p>Age: {user.age}</p>
      <p>Email: {user.email}</p>
    </div>
  );
}

修正のポイント: JSX内で変数や式を使う時は、必ず{}で囲むこと。

この区別ができるようになると、JSXの理解が深まります。

エラーメッセージを読み解こう

エラーメッセージは最初は怖く感じるかもしれませんが、実は解決のヒントがたくさん詰まっています

よくあるエラーメッセージとその意味

エラーメッセージの典型例を見てみましょう。

Syntax error: Unexpected token, expected "}"
構文エラー: 予期しないトークン、"}"が期待されます

このメッセージは、「}が不足している」ということを教えてくれています。

Syntax error: Unexpected identifier
構文エラー: 予期しない識別子

これは、変数名や関数名が正しく記述されていない場合に発生します。 例えば、予約語を変数名に使った場合などですね。

エラーの場所を特定する方法

エラーメッセージには、問題の場所を示す情報も含まれています。

// エラーメッセージの例
Module build failed: SyntaxError: Unexpected token (15:6)
    at Component.js:15:6

この場合、以下のことが分かります。

  • ファイル名: Component.js
  • 行番号: 15行目
  • 文字位置: 6文字目

ただし、エラーの場所が実際の問題箇所と少しずれることもあります。 エラー行の前後も確認してみることが大切です。

エラーメッセージを活用するコツ

エラーメッセージを見る時のポイントをまとめてみます。

  1. まずは落ち着く: エラーは解決できるものです
  2. 英語を恐れない: 同じパターンが繰り返されます
  3. 行番号を確認: 問題箇所の目安になります
  4. 前後の行もチェック: 実際の問題は別の場所にあるかも

慣れてくると、エラーメッセージを見ただけで「あ、これは括弧の問題だな」と分かるようになります。

効率的なデバッグ方法を身につけよう

エラーを素早く見つけて解決するためのコツを紹介します。

1. エディタの力を借りる

VS Codeを使っている場合は、以下の拡張機能がおすすめです。

おすすめ拡張機能:
- ES7+ React/Redux/React-Native snippets
- Bracket Pair Colorizer
- Auto Close Tag
- Prettier - Code formatter

これらの拡張機能により、以下のことができるようになります。

  • 括弧の対応がカラーで分かる
  • タグの自動補完
  • コードの自動整形

特にBracket Pair Colorizerは、括弧の対応が色分けされるので、括弧の不一致を防げます。

2. ESLintでリアルタイムチェック

ESLintを設定すると、エラーをリアルタイムで検出できます。

// .eslintrc.js
module.exports = {
  extends: [
    'react-app',
    'react-app/jest'
  ],
  rules: {
    'react/jsx-uses-react': 'error',
    'react/jsx-uses-vars': 'error'
  }
};

ESLintを設定することで、コードを書いている時点でエラーが表示されるようになります。

タイプミスや構文エラーを、ファイルを保存する前に発見できるので、開発効率が大幅に向上します。

3. 段階的な確認方法

エラーが複雑な場合は、段階的にコードを確認していきましょう。

// 最小限のコンポーネントから確認
function App() {
  return <div>Hello</div>;
}

まず、最もシンプルな形でコンポーネントが動作するかを確認します。

// 問題がなければ、段階的に機能を追加
function App() {
  return (
    <div>
      <h1>Hello</h1>
      <p>World</p>
    </div>
  );
}

このように少しずつ機能を追加していくことで、どの部分でエラーが発生するかを特定できます。

4. コメントアウトを活用する

問題のある箇所が分からない場合は、一部をコメントアウトしてみましょう。

function App() {
  return (
    <div>
      <h1>Title</h1>
      {/* <p>This might be problematic</p> */}
      <button>Click me</button>
    </div>
  );
}

コメントアウトした状態でエラーが消えれば、その部分に問題があることが分かります。

実際のデバッグ手順を体験してみよう

具体的なデバッグ手順を、実例とともに見ていきましょう。

手順1: エラーメッセージの確認

まず、開発サーバーを起動してエラーログを確認します。

# 開発サーバーの起動
npm start

# ブラウザのコンソールも確認

ターミナルとブラウザの両方でエラーメッセージを確認することが大切です。 ブラウザの開発者ツールには、より詳細な情報が表示されることもあります。

手順2: 該当箇所の特定

エラーメッセージで示された行番号周辺を確認します。

// エラーが発生している行の前後を確認
console.log('Before problematic code');
// 問題のあるコード
console.log('After problematic code');

console.logを使って、どの部分でエラーが発生しているかを特定する方法もあります。

手順3: 構文の詳細確認

括弧の対応や文法を詳しくチェックします。

// 括弧の対応を確認する例
{
  // 開始括弧
  return (
    <div>
      <h1>Title</h1>
    </div>
  );
  // 終了括弧
}

エディタで括弧をクリックすると、対応する括弧がハイライトされるはずです。 この機能を使って、括弧の対応を確認してみましょう。

手順4: 最小限のコードで検証

問題のある部分を最小限のコードで再現してみます。

// 最小限の検証コード
function Test() {
  return <div>Test</div>;
}

このような最小限のコードが動作することを確認してから、段階的に機能を追加していきます。

具体的なエラー例と解決法

実際によくあるエラーケースを見てみましょう。

エラー例1: JSXの閉じタグ不足

// エラーコード
function App() {
  return (
    <div>
      <img src="image.jpg" alt="Image">
      <p>Text</p>
    </div>
  );
}

このコードの問題点は、<img>タグが自己閉じタグになっていないことです。

// 解決法
function App() {
  return (
    <div>
      <img src="image.jpg" alt="Image" />
      <p>Text</p>
    </div>
  );
}

解決のポイント: JSXでは、自己閉じタグには必ず/>を付ける必要があります。

HTMLでは<img>のように書けますが、JSXでは<img />と書く必要があるんです。

エラー例2: 条件分岐の構文エラー

// エラーコード
function UserStatus({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? 
        <p>Welcome!</p>
        <p>Please log in</p>
      }
    </div>
  );
}

三項演算子の構文が正しくありません。 :(コロン)が抜けています。

// 解決法
function UserStatus({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? (
        <p>Welcome!</p>
      ) : (
        <p>Please log in</p>
      )}
    </div>
  );
}

解決のポイント: 三項演算子は条件 ? 真の場合 : 偽の場合の形で書きます。

複数のJSX要素を返す場合は、括弧で囲むと読みやすくなります。

エラー例3: 配列のマップ処理での括弧ミス

// エラーコード(括弧の対応が正しくない例)
function ItemList({ items }) {
  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>
          {item.name}
        </li>
      )}
    </ul>
  );
}

このコードは一見正しく見えますが、実は括弧の対応に問題があります。

// 解決法(括弧の対応を正しく)
function ItemList({ items }) {
  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>
          {item.name}
        </li>
      ))}
    </ul>
  );
}

解決のポイント: map関数の括弧と、JSXの括弧を正しく対応させることが重要です。

複雑な場合は、エディタのインデント機能を使って構造を確認しましょう。

エラーを防ぐ予防策とベストプラクティス

エラーが起きにくい書き方のコツを覚えておきましょう。

1. 一貫したコードフォーマット

Prettierを使って、コードフォーマットを統一しましょう。

// .prettierrc
{
  "semi": true,
  "singleQuote": true,
  "trailingComma": "es5",
  "tabWidth": 2
}

Prettierを設定すると、ファイルを保存する度に自動的にコードが整形されます。

これにより、以下のような利点があります。

  • インデントが揃って読みやすくなる
  • 括弧の対応が明確になる
  • チーム開発での統一性が保たれる

2. 適切なインデントを心がける

見やすいインデントは、エラー防止に効果的です。

// 見やすいインデント
function App() {
  return (
    <div>
      <header>
        <h1>Title</h1>
      </header>
      <main>
        <p>Content</p>
      </main>
    </div>
  );
}

インデントが正しく設定されていると、括弧の対応や構造が一目で分かります。

3. コメントで構造を明確にする

複雑なコンポーネントでは、コメントを活用しましょう。

// コメントで構造を明確にする
function App() {
  return (
    <div>
      {/* ヘッダー部分 */}
      <header>
        <h1>Title</h1>
      </header>
      
      {/* メイン部分 */}
      <main>
        <p>Content</p>
      </main>
    </div>
  );
}

コメントがあることで、コードの構造が理解しやすくなり、ミスも減ります。

4. 小さな単位でコンポーネントを作る

大きなコンポーネントより、小さなコンポーネントを組み合わせる方がエラーが起きにくくなります。

// 小さなコンポーネントに分割
function Header() {
  return (
    <header>
      <h1>Title</h1>
    </header>
  );
}

function MainContent() {
  return (
    <main>
      <p>Content</p>
    </main>
  );
}

function App() {
  return (
    <div>
      <Header />
      <MainContent />
    </div>
  );
}

このように分割することで、問題が起きた時の原因特定も簡単になります。

よくある質問と回答

初心者の方からよく寄せられる質問にお答えします。

Q1: エラーの行番号が実際の問題箇所と違う場合は?

A1: エラーの検出が遅れる場合があります。

Reactのコンパイラーは、問題を検出した時点でエラーを報告します。 しかし、実際の問題はもっと前の行にあることが多いんです。

エラー行の前後数行を確認してみてください。 特に括弧の対応や、前の行のセミコロン忘れなどをチェックしましょう。

Q2: JSXとHTMLの違いで混乱する場合は?

A2: 主な違いを覚えておきましょう。

よくある違いをまとめてみます。

  • classclassName
  • onclickonClick
  • forhtmlFor
  • 自己閉じタグは必須 <img /> <br />

最初は混乱するかもしれませんが、慣れれば自然に書けるようになります。

Q3: コンポーネントのインポートでエラーが出る場合は?

A3: インポート文の構文を確認してください。

正しいインポートの例を見てみましょう。

// 正しいインポート
import React from 'react';
import { useState } from 'react';
import MyComponent from './MyComponent';
import { Button, Input } from './components';

ポイントは以下の通りです。

  • デフォルトエクスポートは{}なしで
  • 名前付きエクスポートは{}で囲む
  • ファイルパスは相対パスか絶対パスで正確に

Q4: エラーが多すぎて何から手をつけていいか分からない場合は?

A4: 一つずつ順番に解決していきましょう。

複数のエラーが出ている場合は、以下の順番で対処します。

  1. 最初のエラーから解決する
  2. そのエラーを修正してから次のエラーを確認
  3. 連鎖的にエラーが解消される場合も多い

一つのエラーが原因で、複数のエラーが発生していることがよくあります。 焦らず、一つずつ丁寧に解決していくことが大切です。

まとめ

ReactでSyntaxErrorが発生した際の解決方法について詳しく解説してきました。

重要なポイントをまとめると以下の通りです。

エラー解決の基本手順

  1. エラーメッセージを確認して問題箇所を特定する
  2. 括弧の対応JSXの構文を確認する
  3. エディタの支援機能を活用する
  4. 段階的にコードを確認して原因を絞り込む

よくあるエラーパターン

  • 括弧の不一致(最も頻繁)
  • JSXの複数要素問題
  • 属性名の間違い(classclassNameなど)
  • 変数展開の波括弧忘れ

エラー予防のコツ

  • Prettierでコードフォーマットを統一
  • ESLintでリアルタイムチェック
  • 適切なインデント
  • 小さな単位でのコンポーネント設計

大切な心構え

構文エラーは、慣れれば簡単に見つけることができるようになります。 最初は時間がかかるかもしれませんが、パターンを覚えることで解決速度は格段に上がります。

エラーメッセージを恐れず、一つずつ丁寧に確認する習慣を身につけることが重要です。

適切なツールの設定と基本的なデバッグ手順を身につけることで、効率的に問題を解決できるようになります。

ぜひ今回の内容を参考に、構文エラーの解決スキルを向上させてください。 きっと、React開発がもっと楽しくなるはずです!

関連記事