Skip to content

JSX

Трансформер Oxc поддерживает преобразование JSX.

Общее использование

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

const result = await transform("App.jsx", sourceCode, {
  jsx: {
    runtime: "automatic", // or "classic"
    development: false, // or true
    throwIfNamespace: true, // or false
    pure: true, // or false
    importSource: "react",
    pragma: "React.createElement",
    pragmaFrag: "React.Fragment",
    refresh: false, // see below
  },
  // When transforming TSX files:
  typescript: {
    jsxPragma: "React.createElement", // same value with `jsx.pragma`
    jsxPragmaFrag: "React.Fragment", // same value with `jsx.pragmaFrag`
  },
});

Также можно задать jsx: 'preserve', чтобы отключить преобразование JSX.

Поддерживаются pragma-комментарии JSX, как в Babel и esbuild. Они позволяют настраивать JSX по файлам.

Где ищутся pragma-комментарии

Oxc обрабатывает комментарии только до первого оператора в файле. Комментарии внутри функций, классов или после любого оператора игнорируются.

jsx
// @jsx h  ← ✅ This pragma is recognized (before first statement)

import { h } from "preact";

// @jsx React.createElement  ← ❌ This pragma is ignored (after first statement)
function App() {
  return <div />;
}

Так же ведут себя TypeScript и SWC. У Babel и esbuild pragma ищутся во всех комментариях файла (побеждает последняя).

Runtime

По умолчанию используется automatic runtime, появившийся в React 17+. Нужные import подставляются автоматически.

Classic runtime включается опцией jsx.runtime: "classic".

Через pragma: // @jsxRuntime classic или // @jsxRuntime automatic.

Общие опции для обоих runtime

Режим разработки

По умолчанию специфичные для dev преобразования выключены. Включить их можно jsx.development: true.

XML-имена с пространством имён

По умолчанию при тегах вида <foo:bar baz:qux="foobar" /> выдаётся ошибка: формально JSX это допускает, но React такие теги не поддерживает. Разрешить можно jsx.throwIfNamespace: false.

Аннотации pure

По умолчанию элементы JSX помечаются pure-аннотациями (выражения можно удалять, если результат не используется). Если элементы нужно сохранять, отключите jsx.pure: false.

Опции только для automatic runtime

Источник импорта

Задаёт модуль для хелперов JSX; по умолчанию "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";

Pragma: // @jsxImportSource preact.

Опции только для classic runtime

Pragma (фабрика JSX)

Имя функции для преобразования JSX — квалифицированное имя (React.createElement) или идентификатор (createElement). В esbuild это jsxFactory.

Pragma: // @jsx createElement.

Pragma для фрагментов

Имя для фрагментов JSX — допустимое имя тега. В esbuild — jsxFragment.

Pragma: // @jsxFrag Fragment.

React Refresh

React Refresh (Fast Refresh) даёт горячую перезагрузку компонентов в разработке.

Использование

Включите преобразование опцией jsx.refresh:

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

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

Параметры

ПараметрТипПо умолчаниюОписание
refreshRegstring"$RefreshReg$"Имя функции регистрации компонентов для refresh
refreshSigstring"$RefreshSig$"Имя функции создания сигнатур для refresh
emitFullSignaturesbooleanfalseПолные сигнатуры для удобной отладки