Skip to content

JSX

Oxc のトランスフォーマーは、JSX の変換をサポートしています。

一般的な使い方

js
import { transform } from "oxc-transform";

const result = await transform("App.jsx", sourceCode, {
  jsx: {
    runtime: "automatic", // または "classic"
    development: false, // または true
    throwIfNamespace: true, // または false
    pure: true, // または false
    importSource: "react",
    pragma: "React.createElement",
    pragmaFrag: "React.Fragment",
    refresh: false, // 以下を参照
  },
  // TSX ファイルを変換する場合:
  typescript: {
    jsxPragma: "React.createElement", // `jsx.pragma` と同じ値
    jsxPragmaFrag: "React.Fragment", // `jsx.pragmaFrag` と同じ値
  },
});

また、jsx: 'preserve' を設定することで、JSX の変換を無効にすることもできます。

Oxc トランスフォーマーは、Babelesbuild と同様に、JSX プラグマコメントもサポートしています。プラグマコメントは、ファイルごとに JSX オプションを設定する際に便利です。

ランタイム

デフォルトでは、自動ランタイム変換が使用されます。この変換は React 17+ で導入されました。この変換は、必要な import 文を自動的に挿入します。

jsx.runtime オプションを "classic" に設定することで、クラシックランタイム変換を使用することもできます。

// @jsxRuntime classic / // @jsxRuntime automatic が、プラグマコメント経由での設定方法です。

両方のランタイム共通のオプション

開発用変換

デフォルトでは、開発向けの特別な変換は無効になっています。jsx.development オプションを true に設定することで有効化できます。

XML 名前空間タグ名

デフォルトでは、XML 名前空間タグ名(例:<foo:bar baz:qux="foobar" />)が使用された場合、エラーがスローされます。ただし、JSX 標準ではこれを受け入れていますが、現時点では React がこれに対応していないため、デフォルトでは禁止されています。これを許可したい場合は、jsx.throwIfNamespace オプションを false に設定します。

パワー注釈

デフォルトでは、JSX 要素にパワーアノテーションが付加されます。パワーアノテーションとは、戻り値が使われない場合に安全に削除できる式をマークするアノテーションコメントです。ただし、もし JSX 要素を保持したいためであれば、これは望ましくない場合があります。この機能を無効にするには、jsx.pure オプションを false に設定します。

自動ランタイム固有のオプション

インポート元

このオプションは、JSX ヘルパー関数のインポート元を指定します。デフォルト値は "react" です。

たとえば、react ではなく preact パッケージを使用したい場合、jsx.importSource"preact" に設定すると、以下のインポート文が挿入される可能性があります:

js
import { createElement } from "preact";
import { Fragment, jsxDEV } from "preact/jsx-dev-runtime";
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";

// @jsxImportSource preact が、プラグマコメント経由での設定方法です。

クラシックランタイム固有のオプション

プラグマ

このオプションは、JSX 式を変換する際に使用する関数名を指定します。修飾名(例:React.createElement)または識別子(例:createElement)である必要があります。esbuild ではこのオプションは jsxFactory と呼ばれます。

// @jsx createElement が、プラグマコメント経由での設定方法です。

プラグマ フラグメント

このオプションは、JSX フラグメントを変換する際に使用する関数名を指定します。有効な JSX タグ名でなければなりません。esbuild ではこのオプションは jsxFragment と呼ばれます。

// @jsxFrag Fragment が、プラグマコメント経由での設定方法です。

React Refresh

React Refresh(別名:React Fast Refresh)は、開発中の React コンポーネントに対してホットリロード機能を提供します。

使用方法

React Refresh 変換を有効にするには、jsx.refresh オプションを設定します:

javascript
import { transform } from "oxc-transform";

const result = await transform("App.jsx", sourceCode, {
  jsx: {
    development: true,
    refresh: true,
    // あるいは...
    // refresh: {
    //   refreshReg: "$RefreshReg$",
    //   refreshSig: "$RefreshSig$",
    //   emitFullSignatures: true,
    // },
  },
});

設定オプション

オプションデフォルト説明
refreshRegstring"$RefreshReg$"リフレッシュ用にコンポーネントを登録する関数の名前
refreshSigstring"$RefreshSig$"リフレッシュ用の署名を作成する関数の名前
emitFullSignaturesbooleanfalseデバッグをより良くするために完全な署名を出力するかどうか