JSX: JavaScript拡張と使い方例

著者: IT Sectr 公開日: 2026-07-03 読了時間: 10 分

JSX は、Reactチームによって開発された、JavaScriptのためのXML粛似の構文拡張で、ユーザーインターフェースを宣言的に記述するために使用されます。テンプレートエンジンとは異なり、JSXは通常のJavaScript関数呼出しにコンパイルされ、マークアップ内で言語の全ての権限を发揮できます。React, 2024によると、JSXはすべての現代的なReactフレームワークとライブラリでサポートされています。

まとめ

  • JSX はReact.createElementの構文糖で、JavaScriptでHTML粛似のマークアップを書くことができます。
  • はカーリーブラケットを使ってJSXに埋め込めます—あらゆるJS式を使用できます。
  • 属性 はJSXではcamelCaseで書きます(className, onClick, tabIndex)、kebab-caseではありません。
  • トランパイル JSXからJSへの変換は、ブラウザでの実行前にBabel、TypeScriptまたはesbuildによって行われます。
  • XSS保護 が組み込まれています—Reactはレンダリング前にすべての値をエスケープし、インジェクションを防ぎます。

JSXとは何か?

JSX (JavaScript XML) はJavaScriptの構文拡張で、2013年にReactで初めて導入されました。ディベロッパーが宣言的なスタイルでユーザーインターフェースの構造を記述し、マークアップとロジックをひとつのファイルに組み合わせることができます。

JSX以前、ディベロッパーは文字列テンプレート(Mustache, Handlebars)を使用したり、document.createElementを使って手動でDOM要素を作成したりしていました。どちらのアプローチにも缺点がありました: 文字列テンプレートはタイプチェックされず、手動DOM作成は面倒でエラーが発生しやすかったからです。

Reactは別の道を選びました—コードに直接マークアップを埋め込むことです。この決定はコミュニティで議論を呼びましたが、時代が進むにつれて標準になりました。今日、JSXはReactだけでなく、SolidJS, Preact, Qwik、さらにVueでもプラグインを通じて使用されています。

JSXの基本構文

JSX要素はHTMLタグのように見えますが、JavaScriptに直接埋め込まれます。各要素は三つの引数を持つReact.createElement呼出しにトランパイルされます: 要素タイプ、プロップスオブジェクト、コディリ・要素。1つのルート要素は必須ルールです: JSX式は1つの親要素またはフラグメントを返す必要があります。

js
import React from 'react';

// 基本JSX: 単一ルート要素
const element = (
  <div className="app">
    <h1>Hello, World!</h1>
    <p>Welcome to React</p>
  </div>
);

グルーピングのためのフラグメント

余分なDOMノードが不要な場合は、React.Fragmentまたはショートハンド構文<></>を使用します。フラグメントは実際のDOM要素を作成せず、コディリ・ノードをグループだけします。これは特にテーブルやリストで有用で、余分なラッパーがHTML構造を壊すことがあります。

js
function Columns() {
  return (
    <>
      <td>First</td>
      <td>Second</td>
    </>
  );
}

JSXでの式と変数

あらゆるJavaScript式はカーリーブラケット{ }を使ってJSXに埋め込めます。内部では、変数、関数呼出し、三項演算子、配列メソッドを使用できます。条件付きレンダリングは三項演算子または論理的ANDを使って行います。

js
function Greeting({ name, isLoggedIn }) {
  const items = ['Red', 'Green', 'Blue'];

  return (
    <div>
      {/* Expression with variable */}
      <h1>Hello, {name}</h1>

      {/* Conditional rendering */}
      {isLoggedIn ?
        <p>Welcome back!</p :
        <button>Login</button>
      }

      {/* Render array */}
      <ul>
        {items.map(item =>
          <li key={item}>{item}</li>
        )}
      </ul>
    </div>
  );
}

重要な制限として、カーリーブラケット内ではのみ使用でき、文は使用できません。if/else, for, switchは使用できず、三項演算子、論理演算子、配列メソッドのみが使用できます。関数呼出しは許され、アロー関数も含みます。

JSXとHTMLの違い

JSXは見た目がHTMLに似ていますが、根本的な違いがあります。属性はcamelCaseで書きます—classの代わりにclassName、onclickの代わりにonClick、tabindexの代わりにtabIndex。これはJSXがJavaScriptにトランパイルされ、プロパティ名にハイフンが使用できないからです。

HTMLJSX理由
class="wrapper"className="wrapper"classはJSの予約語
onclick="handle()"onClick={handle}JSプロパティのcamelCase
style="color: red"style={{ color: ‘red’ }}文字列の代わりにスタイルオブジェクト
<input disabled><input disabled={true}>明示的なボール属性

もう一つの重要な違いはセルフクロージングタグです。HTMLでは、いくつかのタグ(br, hr, input)は閉じなくてもいい場合がありますが、JSXではすべてのセルフクロージングタグに閉じるスラッシュが必要です: <br />, <input />。SVG属性名もcamelCaseに変換されます: strokeWidth, fillOpacity。

JSXがJavaScriptにトランパイルされる仕組み

ブラウザはJSXを直接理解できません。実行前に、JSXコードはトランパイラ—Babel, TypeScript, esbuildを通過します。各JSX要素はcreateElementまたはjsx/runtime呼出しに変換されます。

Babelによる変換

js
// 元のJSX
const element = <h1 className="title">Hello</h1>;

// トランパイル後
const element = React.createElement(
  'h1',
  { className: 'title' },
  'Hello'
);

React 17から、Reactのインポートが不要な新しいJSX変換が登場しました。jsx-runtimeの自動インポートにより、import React from ‘react’なしでコンポーネントを書くことができます。BabelとTypeScriptは{"runtime": "automatic"}構成を通じてこの変換をサポートしています。

React以外のJSX: Solid, Preact, Vue

JSXはReactと関連付けられていますが、他のフレームワークも使用しています。SolidJSは仮想DOMなしで実際のDOMノードにコンパイルするJSXを使用します。Preactは完全なJSXサポートを持つReactの軽量アルタナティブです。Vueは@vue/babel-plugin-jsxを通じてJSXをサポートしていますが、主なテンプレートはtemplateです。

主な違いは式のセマンティクスです。Reactでは、JSX式はレンダリングごとに実行されます。SolidJSでは、JSXは一度コンパイルされ、更新はシグナルを通じてトラックされます。これはパフォーマンスに影響します: SolidJSは仮想DOMやレコンシリエーションが不要なため、JSXレンダリングが高速です。

TypeScriptでは、JSXは言語レベルでサポートされています。.tsx拡張子のファイルは自動的にJSX構文を処理します。プロップスの型付けはTypeScript + JSXの主な利点のひとつです: IDEが予港属性、コールバックの型、プロップスの必須性を暗示してくれます。

JSXの最良実践

読みやすく、維持しやすいJSXコードを書きましょう。複雑な式を別の変数または関数に抽出します—これにより可読性が向上し、マークアップから離してロジックをテストできます。不要なdivラッパーの代わりにフラグメントを使用します。

インデントルール—ネスト要素に対してインデントを維持します。各ネストレベルは1つのインデントレベルです。閉じるタグは開くタグと同じレベルにする必要があります。長い属性には改行を使用します。

毎回のレンダリングで作成される場合、プロップス内のインラインアロー関数を避けます。そんな場合は、コールバックをuseCallbackでラップするか、関数をコンポーネントの外に移動します。複雑なコンポーネントはより小さなものに分けます—各コンポーネントはインターフェースの1つの論理ユニットを処理する必要があります。

よくある質問

JSXはReactなしで使用できますか?

はい、Babelプラグイン @babel/plugin-transform-react-jsxを通じて、JSXをあらゆるライブラリに構成できます。SolidJS, Preact, Nervなどのフレームワークは独自のランタイムでJSXを使用しています。完全な独立をめざす場合は、pragmaを独自の関数に設定できます。

JSXでclassの代わりにclassNameを使うのはなぜですか?

classはJavaScriptの予約語です。JSXはcreateElementにトランパイルされ、第2引数でプロップスオブジェクトを渡します。classプロパティはES6のクラス構文と競合するため、ReactはclassNameを選びました。

JSXで複数のクラスを追加するには?

テンプレート文字列またはclassnamesライブラリを使用します: className={`btn ${isActive ? ‘active’ : ‘’}`}。複雑なロジックには、オブジェクトと配列を受け付ける、npmパッケージclsxまたはclassnamesをインストールします。

JSXは条件構文をサポートしていますか?

JSXはのみサポートし、文はサポートしません。条件には、三項演算子、論理AND (&&)または論理OR (||)を使用します。複雑なロジックには、条件を別の変数または関数に抽出します。

JSXのリストにkeyが必要なのはなぜですか?

key属性は、再レンダリング時にReactがリスト要素を特定するのを役立ちます。keyがないと、Reactは変更時にリスト全体を再レンダリングします。固有のkeyを使うと、ReactはDOMノードを再利用し、要素を再作成せずに再整列します。

まとめ

  • JSXは宣言的なUI記述のためのXML粛似JavaScript拡張で、文字列テンプレートの代替です。
  • カーリーブラケットであらゆるJS式(変数、関数、三項演算子)を埋め込めます。
  • 属性はJSXでcamelCaseで書き、スタイルはオブジェクトで渡し、ボール属性は明示的に書きます。
  • トランパイル JSXからcreateElementへの変換はBabelまたはTypeScriptによって自動的に行われます。
  • 各JSX式には1つのルート要素またはフラグメントが必要です。
  • React以外のJSX—SolidJS, Preact, Vue, Qwikは独自のランタイムでJSXをサポートしています。
  • TypeScriptは.tsx拡張子でJSXのプロップスと属性の完全な型付けを提供します。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください