前回からの続きですが、このページだけ読んでも分かる内容になっています。
JSXがコンパイルされると、等価の JavaScriptコードになる
React製のウェブアプリでは、BabelでJSXがコンパイルされるとどうなるのか具体例で確認してみましょう。以下は、JSXで書かれた「Hello, world!」の例です。
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
上記のJSXの使用例は、Babelによって以下のように等価の JavaScriptコードにコンパイルされます。
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
ちなみに、BabelとはモダンなJavaScriptやJSXで書かれたコードを後方互換のJavaScirptに変換してくれるツールのことです。
JSXは、React.createElement() を呼ぶためのシンタックスシュガーに過ぎない
JSXで書かれたコードがBabelでコンパイルされた後には、React.createElement( ~ )というメソッドに変換されています。
実は、JSXはReact.createElement() を呼ぶためのシンタックスシュガーに過ぎません。シンタックスシュガーとは、コードを読み書きしやすくするために導入される書き方のことです。
JSXを使うと、そのコードからどんな要素が画面表示されるのか想像しやすくなったり、安全性が高まるなどのメリットがありますが、実際の仕事はコンパイルされた後にあらわれるReact.createElement() が実行します。
React.createElement() は、バグ混入を防ぐためのいくつかのチェックをおこなってから、画面に表示する要素を指定するオブジェクトを返します。上記例の場合、React.createElement() が実行されることで、単純化すると以下のようなオブジェクトが生成されます。
// 注:この構造は単純化されています
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};
画面に表示したいもの
上記例のような React.createElement() によって生成されるオブジェクトは、『React要素』と呼ばれます。React要素を分かりやすく言うなら「何を画面表示したいのか説明したもの」です。
上記例で生成されたオブジェクト(React要素)にあらためて注目してみましょう。
// 注:この構造は単純化されています
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};
このオブジェクト(React要素)は、「’greeting’というクラス名をつけた、 ‘Hello, world!’という内容のh1要素を画面に表示したいと説明したもの」と言えるでしょう。
Reactは、こうしたオブジェクトを読み取って、それをDOMに変換してから画面にレンダリングします。
次回へ続きます。