Contents
JSXの正体とは?
プロ太
おはようございます!今日の授業では、JSXの正体を見ておきましょう!
まずは、下記のコードをconsole.logで出力してみると、どうなるか確かめてみましょう!
const sample1 = <h1 className="greet">こんにちは!</h1>;
console.log(sample1);
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つのメリットがあります。
- 書きやすさ: HTMLのような文法で書けるので、見た目の構造が分かりやすい
- 扱いやすさ: 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つの利点があります。
- 効率的な更新:
- 画面の更新が必要なとき、まず仮想DOM上で変更を確認
- 実際のDOMとの差分だけを更新することで、パフォーマンスが向上
- 扱いやすさ:
- JavaScriptのオブジェクトなので、プログラムで扱いやすい
- 状態管理やテストが容易になる
よって、処理の流れとしては、、、
- JSXを書く
- Babelが
React.createElement()
に変換 React.createElement()
が仮想DOMオブジェクトを生成- Reactが仮想DOMと実際のDOMを比較
- 必要な部分だけ実際のDOMを更新
この仕組みのおかげで、JSXで書いたコードが効率的に画面に反映されるんだ!
へー!単なるオブジェクトに見えたけど、すごく重要な役割があったんですね!
そうなんです!だからこそJSXの正体を理解することは、Reactの理解を深める上でとても重要なんです。
まとめ
- JSXは見た目はHTMLっぽいけど、実際はJavaScriptオブジェクトに変換される
- BabelがJSXを
React.createElement()
の呼び出しに変換する React.createElement()
は仮想DOMのオブジェクトを生成する- 仮想DOMにより、Reactは効率的に画面を更新できる
- この仕組み全体により、開発者が書きやすく、かつ効率的な実装が実現できている
上記の内容をしっかりと理解して、次の学習につなげていきましょう!