JSX
JavaScript 内に HTML ライクな構文を記述し、UI コンポーネントを宣言的に定義する React の拡張構文
Reactフロントエンド
JSX とは
JSX (JavaScript XML) は、React で UI を宣言的に記述するための JavaScript の構文拡張である。HTML に似た記法でコンポーネントを記述し、トランスパイラが React.createElement() の呼び出しに変換する。2013 年に React とともに Facebook が発表した。
JSX のトランスパイル
// JSX (開発者が書くコード)
const element = <Button onClick={handleClick} variant="primary">Click me</Button>;
// トランスパイル後 (React 17+ の新しい JSX Transform)
import { jsx as _jsx } from "react/jsx-runtime";
const element = _jsx(Button, { onClick: handleClick, variant: "primary", children: "Click me" });
JSX はシンタックスシュガーであり、最終的には関数呼び出しに変換される。
JSX の基本ルール
// 1. 式の埋め込み: {} 内に JavaScript 式を記述
<h1>{user.name}</h1>
<p>{isLoggedIn ? 'Welcome' : 'Please login'}</p>
// 2. className (class ではない)
<div className="container">...</div>
// 3. 単一のルート要素 (Fragment で囲む)
<>
<h1>Title</h1>
<p>Content</p>
</>
// 4. 自己閉じタグ
<img src="photo.jpg" alt="Photo" />
<Input type="text" />
// 5. 配列のレンダリング (key が必須)
{items.map(item => <li key={item.id}>{item.name}</li>)}
TSX (TypeScript + JSX)
TypeScript で JSX を使う場合、ファイル拡張子は .tsx にする。props の型チェックが効く。
interface ButtonProps {
variant: 'primary' | 'secondary';
onClick: () => void;
children: React.ReactNode;
}
function Button({ variant, onClick, children }: ButtonProps) {
return (
<button className={`btn btn-${variant}`} onClick={onClick}>
{children}
</button>
);
}
// ✅ 型チェックが効く
<Button variant="primary" onClick={handleClick}>Click</Button>
// ❌ コンパイルエラー: variant に "danger" は許可されていない
<Button variant="danger" onClick={handleClick}>Click</Button>
JSX と XSS
React は JSX 内の値を自動的にエスケープするため、XSS に対して安全だ。
const userInput = '<script>alert("XSS")</script>';
<p>{userInput}</p>
// 出力: <p><script>alert("XSS")</script></p>
// スクリプトは実行されない
dangerouslySetInnerHTML を使うと自動エスケープが無効になるため、使用時はサニタイズが必須だ。
JSX なしの React
JSX は必須ではない。React.createElement を直接呼び出すこともできるが、可読性が大幅に低下する。
// JSX なし (冗長)
React.createElement('div', { className: 'card' },
React.createElement('h2', null, title),
React.createElement('p', null, description)
);
// JSX あり (簡潔)
<div className="card">
<h2>{title}</h2>
<p>{description}</p>
</div>
JSX vs テンプレートエンジン
| 観点 | JSX | テンプレート (EJS, Handlebars) |
|---|---|---|
| 言語 | JavaScript の拡張 | 独自構文 |
| 型安全性 | ✅ TypeScript で検証 | ❌ |
| ロジック | JS の全機能が使える | 制限された構文 |
| ツール | IDE の補完が効く | 限定的 |
| 用途 | React, SPA | サーバーサイドレンダリング |
体系的に学ぶなら関連書籍を参照してほしい。