React入門第6回~JSXの正体を探ろう!~

JSXの正体とは?

プロ太
プロ太

おはようございます!今日の授業では、JSXの正体を見ておきましょう!
まずは、下記のコードをconsole.logで出力してみると、どうなるか確かめてみましょう!

const sample1 = <h1 className="greet">こんにちは!</h1>;
console.log(sample1);
OZ
OZ

了解です!!入力してみると以下のような結果になりました!!

const sample1 = <h1 className="greet">こんにちは!</h1>;
console.log(sample1);

// 出力結果
{
  type: 'h1',
  props: {
    className: 'greet',
    children: 'こんにちは!'
  }
}

あれ?なんかオブジェクトが出てきましたね!

そうです!実は、JSXは見た目はHTMLっぽく書けますが、内部的にはJavaScriptのオブジェクトに変換されているんです。この変換を行っているのが『Babel』というツールなんです。

へー!じゃあ、Babelは裏で何をしているんですか?

Babelが行っていること

実はBabelは、JSXをReact.createElement()という関数の呼び出しに変換しているんだ。こんな感じです!

// 元のJSX
const sample1 = <h1 className="greet">こんにちは!</h1>;

// Babelが変換した後のコード
const sample1 = React.createElement(
  'h1',
  { className: 'greet' },
  'こんにちは!'
);

// 実際に生成されるオブジェクト
{
  type: 'h1',
  props: {
    className: 'greet',
    children: 'こんにちは!'
  }
}

なるほど!でも、これが何の役に立つんですか?

これには大きく2つのメリットがあります。

  1. 書きやすさ: HTMLのような文法で書けるので、見た目の構造が分かりやすい
  2. 扱いやすさ: JavaScriptのオブジェクトに変換されることで、Reactが効率的に画面を更新できる

実際にもう少し複雑な例を見てみましょう!

// JSXの例
const sample2 = (
  <div className="container">
    <h1 className="title">こんにちは!</h1>
    <p className="text">JSXの勉強中です</p>
  </div>
);

// Babelによる変換後
const sample2 = React.createElement(
  'div',
  { className: 'container' },
  React.createElement('h1', { className: 'title' }, 'こんにちは!'),
  React.createElement('p', { className: 'text' }, 'JSXの勉強中です')
);

// 生成される実際のオブジェクト
{
  type: 'div',
  props: {
    className: 'container',
    children: [
      {
        type: 'h1',
        props: {
          className: 'title',
          children: 'こんにちは!'
        }
      },
      {
        type: 'p',
        props: {
          className: 'text',
          children: 'JSXの勉強中です'
        }
      }
    ]
  }
}

なるほど!ちゃんとオブジェクトに変換されるんですね!

そうです!そして、このとき生成されたオブジェクトの構造を『仮想DOM(Virtual DOM)』と呼びます。

仮想DOM?なんですかそれ?

仮想DOMとは?

簡単に説明すると、実際のHTML DOMの構造をJavaScriptのオブジェクトとして表現したものなんです。少し見比べてみましょう!

// 実際のHTML DOM
<div class="container">
  <h1 class="title">こんにちは!</h1>
  <p class="text">JSXの勉強中です</p>
</div>

// 仮想DOM(JavaScriptオブジェクト)
{
  type: 'div',
  props: {
    className: 'container',
    children: [
      {
        type: 'h1',
        props: {
          className: 'title',
          children: 'こんにちは!'
        }
      },
      {
        type: 'p',
        props: {
          className: 'text',
          children: 'JSXの勉強中です'
        }
      }
    ]
  }
}

この仮想DOMには大きく2つの利点があります。

  1. 効率的な更新:
    • 画面の更新が必要なとき、まず仮想DOM上で変更を確認
    • 実際のDOMとの差分だけを更新することで、パフォーマンスが向上
  2. 扱いやすさ:
    • JavaScriptのオブジェクトなので、プログラムで扱いやすい
    • 状態管理やテストが容易になる

よって、処理の流れとしては、、、

  1. JSXを書く
  2. BabelがReact.createElement()に変換
  3. React.createElement()が仮想DOMオブジェクトを生成
  4. Reactが仮想DOMと実際のDOMを比較
  5. 必要な部分だけ実際のDOMを更新

この仕組みのおかげで、JSXで書いたコードが効率的に画面に反映されるんだ!

へー!単なるオブジェクトに見えたけど、すごく重要な役割があったんですね!

そうなんです!だからこそJSXの正体を理解することは、Reactの理解を深める上でとても重要なんです。

まとめ

  1. JSXは見た目はHTMLっぽいけど、実際はJavaScriptオブジェクトに変換される
  2. BabelがJSXをReact.createElement()の呼び出しに変換する
  3. React.createElement()は仮想DOMのオブジェクトを生成する
  4. 仮想DOMにより、Reactは効率的に画面を更新できる
  5. この仕組み全体により、開発者が書きやすく、かつ効率的な実装が実現できている

上記の内容をしっかりと理解して、次の学習につなげていきましょう!