Skip to content

JSX

Oxc transformer 支持转换 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 transformer 也支持 JSX pragma 注释,这在 Babelesbuild 中也有支持。Pragma 注释对于在每个文件基础上配置 JSX 选项非常有用。

Pragma 注释扫描

Oxc 只扫描出现在文件中第一条语句之前的注释来查找 JSX pragma。这意味着放置在函数、类内部或任何语句之后的 pragma 注释会被忽略。

jsx
// @jsx h  ← ✅ 此 pragma 被识别(在第一条语句之前)

import { h } from "preact";

// @jsx React.createElement  ← ❌ 此 pragma 被忽略(在第一条语句之后)
function App() {
  return <div />;
}

此行为与 TypeScript 和 SWC 一致,它们都将 pragma 扫描限制在前导注释。注意 Babel 和 esbuild 会扫描文件中的所有注释(以最后一个为准)。

运行时

默认使用自动运行时转换。此转换在 React 17+ 中引入。此转换会自动注入所需的 import 语句。

您也可以通过将 jsx.runtime 选项设置为 "classic" 来使用经典运行时转换。

// @jsxRuntime classic / // @jsxRuntime automatic 是通过 pragma 注释配置此选项的方式。

两种运行时的通用选项

开发转换

默认情况下,开发特定的转换被禁用。您可以通过将 jsx.development 选项设置为 true 来启用它们。

XML 命名空间标签名

默认情况下,如果使用 XML 命名空间标签名(例如 <foo:bar baz:qux="foobar" />),会抛出错误。虽然 JSX 规范允许这样做,但默认禁止,因为 React 的 JSX 目前不支持它们。您可以通过将 jsx.throwIfNamespace 选项设置为 false 来允许它们。

纯注解

默认情况下,JSX 元素会被标注纯注解。纯注解是标记表达式的注释,表示如果其返回值未被使用,可以安全地移除。但如果希望保留 JSX 元素,这可能不是期望的行为。您可以通过将 jsx.pure 选项设置为 false 来禁用此功能。

自动运行时特定选项

导入源

此选项指定 JSX 辅助函数的导入源。默认值是 "react"

例如,如果您想使用 preact 包而不是 react,可以将 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 是通过 pragma 注释配置此选项的方式。

经典运行时特定选项

Pragma

此选项指定转换 JSX 表达式时使用的函数名。它应该是限定名(例如 React.createElement)或标识符(例如 createElement)。此选项在 esbuild 中称为 jsxFactory

// @jsx createElement 是通过 pragma 注释配置此选项的方式。

Pragma Fragment

此选项指定转换 JSX 片段时使用的函数名。它应该是有效的 JSX 标签名。此选项在 esbuild 中称为 jsxFragment

// @jsxFrag Fragment 是通过 pragma 注释配置此选项的方式。

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是否发出完整签名以便更好地调试