---
id: babel-plugin-transform-react-jsx
title: @babel/plugin-transform-react-jsx
sidebar_label: transform-react-jsx
---
The automatic runtime is the default in v8.0.0. When enabled, the functions that Babel compiles JSX to are automatically imported.
In
const profile = (
<div>
<img src="avatar.png" className="profile" />
<h3>{[user.firstName, user.lastName].join(" ")}</h3>
</div>
);Out
import { jsx as _jsx } from "react";
import { jsxs as _jsxs } from "react";
const profile = _jsxs("div", {
children: [
_jsx("img", {
src: "avatar.png",
className: "profile",
}),
_jsx("h3", {
children: [user.firstName, user.lastName].join(" "),
}),
],
});In
/** @jsxImportSource custom-jsx-library */
const profile = (
<div>
<img src="avatar.png" className="profile" />
<h3>{[user.firstName, user.lastName].join(" ")}</h3>
</div>
);Out
import { jsx as _jsx } from "custom-jsx-library";
import { jsxs as _jsxs } from "custom-jsx-library";
const profile = _jsxs("div", {
children: [
_jsx("img", {
src: "avatar.png",
className: "profile",
}),
_jsx("h3", {
children: [user.firstName, user.lastName].join(" "),
}),
],
});In
/** @jsxRuntime classic */
const profile = (
<div>
<img src="avatar.png" className="profile" />
<h3>{[user.firstName, user.lastName].join(" ")}</h3>
</div>
);Out
const profile = React.createElement(
"div",
null,
React.createElement("img", { src: "avatar.png", className: "profile" }),
React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);If you do not want (or cannot use) auto importing, you can use the classic runtime, which is the default behavior for v7 and prior.
In
const profile = (
<div>
<img src="avatar.png" className="profile" />
<h3>{[user.firstName, user.lastName].join(" ")}</h3>
</div>
);Out
const profile = React.createElement(
"div",
null,
React.createElement("img", { src: "avatar.png", className: "profile" }),
React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);In
/** @jsx Preact.h */
import Preact from "preact";
const profile = (
<div>
<img src="avatar.png" className="profile" />
<h3>{[user.firstName, user.lastName].join(" ")}</h3>
</div>
);Out
/** @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(" "))
);Fragments are a feature available in React 16.2.0+.
In
const descriptions = items.map(item => (
<>
<dt>{item.name}</dt>
<dd>{item.value}</dd>
</>
));Out
const descriptions = items.map(item =>
React.createElement(
React.Fragment,
null,
React.createElement("dt", null, item.name),
React.createElement("dd", null, item.value)
)
);In
/** @jsx Preact.h */
/** @jsxFrag Preact.Fragment */
import Preact from "preact";
var descriptions = items.map(item => (
<>
<dt>{item.name}</dt>
<dd>{item.value}</dd>
</>
));Out
/** @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)
)
);Note that if a custom pragma is specified, then a custom fragment pragma must also be specified if the fragment sytnax <></> is used. Otherwise, an error will be thrown.
npm install --save-dev @babel/plugin-transform-react-jsxWithout options:
{
"plugins": ["@babel/plugin-transform-react-jsx"]
}With options:
{
"plugins": [
[
"@babel/plugin-transform-react-jsx",
{
"throwIfNamespace": false, // defaults to true
"runtime": "classic", // defaults to automatic
"importSource": "custom-jsx-library" // defaults to react
}
]
]
}babel --plugins @babel/plugin-transform-react-jsx script.jsrequire("@babel/core").transform("code", {
plugins: ["@babel/plugin-transform-react-jsx"],
});boolean, defaults to true.
Toggles whether or not to throw an error if an XML namespaced tag name is used. For example:
<f:image />
Though the JSX spec allows this, it is disabled by default since React's JSX does not currently have support for it.
You can read more about configuring plugin options here
classic | automatic, defaults to classic
Decides which runtime to use.
automatic auto imports the functions that JSX transpiles to. classic does not automatically import anything.
string, defaults to react.
Replaces the import source when importing functions.
string, defaults to React.createElement.
Replace the function used when compiling JSX expressions.
Note that the @jsx React.DOM pragma has been deprecated as of React v0.12
string, defaults to React.Fragment.
Replace the component used when compiling JSX fragments.