Spec-Zone.ru › Babel 7

@babel/plugin-transform-react-jsx

ПРИМЕЧАНИЕ: Этот плагин включён в @babel/preset-react

Пример​

Автоматический запуск React​

Автоматический запуск — это функция, добавленная в v7.9.0. При включённом автоматическом запуске функции, к которым транспилируется JSX, будут импортированы автоматически.

Вход

const profile = (
  <div>
    <img src="avatar.png" className="profile" />
    <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  </div>
);

Выход

import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";

const profile = _jsxs("div", {
  children: [
    _jsx("img", {
      src: "avatar.png",
      className: "profile",
    }),
    _jsx("h3", {
      children: [user.firstName, user.lastName].join(" "),
    }),
  ],
});

Настройка автоматического импорта запуска​

Вход

/** @jsxImportSource custom-jsx-library */

const profile = (
  <div>
    <img src="avatar.png" className="profile" />
    <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  </div>
);

Выход

import { jsx as _jsx } from "custom-jsx-library/jsx-runtime";
import { jsxs as _jsxs } from "custom-jsx-library/jsx-runtime";

const profile = _jsxs("div", {
  children: [
    _jsx("img", {
      src: "avatar.png",
      className: "profile",
    }),
    _jsx("h3", {
      children: [user.firstName, user.lastName].join(" "),
    }),
  ],
});

Вход

/** @jsxRuntime classic */

const profile = (
  <div>
    <img src="avatar.png" className="profile" />
    <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  </div>
);

Выход

const profile = React.createElement(
  "div",
  null,
  React.createElement("img", { src: "avatar.png", className: "profile" }),
  React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);

Классический запуск React​

Если вы не хотите (или не можете использовать) автоматический импорт, вы можете использовать классический запуск, который является стандартным поведением для версий v7 и ранее.

Вход

const profile = (
  <div>
    <img src="avatar.png" className="profile" />
    <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  </div>
);

Выход

const profile = React.createElement(
  "div",
  null,
  React.createElement("img", { src: "avatar.png", className: "profile" }),
  React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);

Настройка импорта классического запуска​

Вход

/** @jsx Preact.h */

import Preact from "preact";

const profile = (
  <div>
    <img src="avatar.png" className="profile" />
    <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  </div>
);

Выход

/** @jsx Preact.h */

import Preact from "preact";

const profile = Preact.h(
  "div",
  null,
  Preact.h("img", { src: "avatar.png", className: "profile" }),
  Preact.h("h3", null, [user.firstName, user.lastName].join(" "))
);

Фрагменты​

Фрагменты доступны в React 16.2.0+.

Автоматический запуск React​

Вход

const descriptions = items.map((item) => (
  <>
    <dt>{item.name}</dt>
    <dd>{item.value}</dd>
  </>
));

Выход

import { jsxs as _jsxs } from "react/jsx-runtime";
import { Fragment as _Fragment } from "react/jsx-runtime";
import { jsx as _jsx } from "react/jsx-runtime";

const descriptions = items.map((item) =>
  _jsxs(_Fragment, {
    children: [
      _jsx("dt", {
        children: item.name,
      }),
      _jsx("dd", {
        children: item.value,
      }),
    ],
  })
);

Классический запуск React​

Вход

const descriptions = items.map((item) => (
  <>
    <dt>{item.name}</dt>
    <dd>{item.value}</dd>
  </>
));

Выход

const descriptions = items.map((item) =>
  React.createElement(
    React.Fragment,
    null,
    React.createElement("dt", null, item.name),
    React.createElement("dd", null, item.value)
  )
);

Настройка с классическим запуском​

Вход

/** @jsx Preact.h */
/** @jsxFrag Preact.Fragment */

import Preact from "preact";

var descriptions = items.map((item) => (
  <>
    <dt>{item.name}</dt>
    <dd>{item.value}</dd>
  </>
));

Выход

/** @jsx Preact.h */
/** @jsxFrag Preact.Fragment */

import Preact from "preact";

var descriptions = items.map((item) =>
  Preact.h(
    Preact.Fragment,
    null,
    Preact.h("dt", null, item.name),
    Preact.h("dd", null, item.value)
  )
);

Обратите внимание, что если указан пользовательский префикс, то пользовательский префикс фрагмента также должен быть указан, если используется синтаксис фрагмента <></>. В противном случае будет выброшено сообщение об ошибке.

Установка​

  • npm
  • Yarn
  • pnpm
npm install --save-dev @babel/plugin-transform-react-jsx
yarn add --dev @babel/plugin-transform-react-jsx
pnpm add --save-dev @babel/plugin-transform-react-jsx

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

С файлом конфигурации (рекомендуется)​

Без параметров:

{
  "plugins": ["@babel/plugin-transform-react-jsx"]
}

С параметрами:

{
  "plugins": [
    [
      "@babel/plugin-transform-react-jsx",
      {
        "throwIfNamespace": false, // defaults to true
        "runtime": "automatic", // defaults to classic
        "importSource": "custom-jsx-library" // defaults to react
      }
    ]
  ]
}

Через командную строку​

babel --plugins @babel/plugin-transform-react-jsx script.js

Через API Node.js​

require("@babel/core").transformSync("code", {
  plugins: ["@babel/plugin-transform-react-jsx"],
});

Параметры​

Оба запуска​

throwIfNamespace​

boolean, по умолчанию true.

Включает/выключает выброс ошибки, если используется имя тега с пространством имён XML. Например:

<f:image />

Хотя спецификация JSX это допускает, по умолчанию эта функция отключена, так как в текущей реализации React нет поддержки пространств имён JSX.

Дополнительную информацию о настройке параметров плагина можно найти здесь

runtime​

classic | automatic, по умолчанию classic

Добавлен в: v7.9.0

Определяет, какой запуск использовать.

automatic автоматически импортирует функции, к которым транспилируется JSX. classic не импортирует ничего автоматически.

Автоматический запуск React​

importSource​

string, по умолчанию react.

Добавлен в: v7.9.0

Заменяет исходник импорта при импорте функций.

Классический запуск React​

pragma​

string, по умолчанию React.createElement.

Заменяет функцию, используемую при транспиляции выражений JSX. Она должна быть полным именем (например, React.createElement) или идентификатором (например, createElement).

Обратите внимание, что префикс @jsx React.DOM устарел начиная с React v0.12

pragmaFrag​

string, по умолчанию React.Fragment.

Заменяет компонент, используемый при транспиляции фрагментов JSX. Она должна быть допустимым именем тега JSX.

useBuiltIns​

boolean, по умолчанию false.

При распространении свойств используйте Object.assign напрямую вместо вспомогательной функции Babel «extend».

useSpread​

boolean, по умолчанию false.

При распространении свойств используйте вложенный объект со ссылками непосредственно вместо вспомогательной функции Babel «extend» или Object.assign.

© 2014-present Sebastian McKenzie
Licensed under the MIT License.
https://babeljs.io/docs/babel-plugin-transform-react-jsx/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API