跳至主要内容

@babel/plugin-transform-react-jsx

信息

此插件包含在 @babel/preset-react

此插件生成可用于生产环境的 JS 代码。如果您在开发环境中开发 React 应用程序,请使用 @babel/plugin-transform-react-jsx-development 以获得更好的调试体验。

示例

React 自动运行时

自动运行时是 v7.9.0 中添加的功能。启用此运行时后,JSX 编译到的函数将自动导入。

输入

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

输出

JavaScript
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(" "),
}),
],
});

自定义自动运行时导入

输入

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

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

输出

JavaScript
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(" "),
}),
],
});

输入

JavaScript
/** @jsxRuntime classic */

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

输出

JavaScript
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 及更早版本的默认行为。

输入

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

输出

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

自定义经典运行时导入

输入

JavaScript
/** @jsx Preact.h */

import Preact from "preact";

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

输出

JavaScript
/** @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 自动运行时

输入

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

输出

JavaScript
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 经典运行时

输入

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

输出

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

使用经典运行时自定义

输入

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

import Preact from "preact";

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

输出

JavaScript
/** @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)
)
);

请注意,如果指定了自定义 pragma,则如果使用片段语法 <></>,则还必须指定自定义片段 pragma。否则,将引发错误。

安装

npm install --save-dev @babel/plugin-transform-react-jsx

用法

无选项

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

带选项

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

通过 CLI

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

通过 Node API

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

选项

两种运行时

throwIfNamespace

boolean,默认为 true

切换是否在使用 XML 命名空间标记名时抛出错误。例如

尽管 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)。

请注意,自 React v0.12 起,@jsx React.DOM pragma 已被弃用

pragmaFrag

string,默认为 React.Fragment

替换编译 JSX 片段时使用的组件。它应该是一个有效的 JSX 标记名。

useBuiltIns

boolean,默认为 false

展开 props 时,直接使用 Object.assign 而不是 Babel 的 extend 辅助函数。

useSpread

boolean,默认为 false

展开 props 时,直接使用带有展开元素的内联对象,而不是 Babel 的 extend 辅助函数或 Object.assign