javascript - 如何创建自己的 babel 处理器替代 `React`

标签 javascript reactjs jsx babeljs

当你在 JS 文件中使用 JSX 时,你必须导入 React 否则生成的代码将无法编译。这是因为:

import React from 'react'
import ReactDOM from 'react-dom'

function Foo() { return 'hello world' }

ReactDOM.render(<Foo/>, document.body)

变成:

import React from 'react'
import ReactDOM from 'react-dom'

function Foo() { return 'hello world' }

ReactDOM.render(React.createElement(Foo), document.body)

所以 React.createElement 中的 React 是由某个 babel 或 webpack 工具在某处生成的,它是在我不记得的某个地方指定的。我的问题首先是在哪里指定它将 JSX 转换为 React.createElement

第二个也是主要问题,我如何自定义它以将 JSX 转换为 MyThing.create?我记得很久以前在 virtual-dom 库中看到过这个,但我已经忘记了。想知道如何做到这一点。

我想做的是创建一个类似这样的 API

<Foo/>
<Bar/>
<Baz/>

MyThing.create('Foo')
MyThing.create('Bar')
MyThing.create('Baz')

最佳答案

负责JSX处理的Babel插件是 @babel/plugin-transform-react-jsx .尽管它的名称是特定于 React 的,但您可以通过在 React.createElement 中设置一个选项来使用您喜欢的任何 pragma(.babelrc 是默认的 pragma)文件:

{
    "presets": ["@babel/preset-env"],
    "plugins": [
        ["@babel/plugin-transform-react-jsx", {
            "pragma": "MyThing.create"
        }]
    ]
}

除了pragma , 有 pragmaFrag设置 <>...</> 的输出应该是什么JSX 结构。 (默认为 React.Fragment 。)

例如,Mithril.js使用 "pragma": "m""pragmaFrag": "'['" . Preact使用 "pragma": "Preact.h""pragmaFrag": "Preact.Fragment" .

~5 年前我玩过一个不同的 JSX-to-JavaScript 编译器,它工作得很好,但我现在找不到它了。这是有道理的:JavaScript 在过去五年中发生了很大的变化,让编译器与这些变化保持同步的时间 promise 是非常重要的。鉴于 Babel 的成功,很容易看到开发人员决定不追求它。

我知道有一种选择:Sucrase .它编译 JSX、TypeScript 和 Flow,没有 Babel 的插件结构。 (因此,它非常很快。)

关于javascript - 如何创建自己的 babel 处理器替代 `React`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57125908/

相关文章:

javascript - Recharts 自定义点

javascript - JS 控制台错误显示 Extjs 尝试对类发出 GET 请求,就好像它是一个文件一样

javascript - Android - 隐藏文本光标输入 React Native

javascript - 如何在 map 功能中先跳过

javascript - 在jsx中的渲染函数中编写条件语句

javascript - 如何将字符串渲染为自定义 React 组件?

javascript - 内容安全策略 (CSP) 如何工作?

javascript - 使用 Angular ui Bootstrap 显示选项卡 - 选项卡集

javascript - jQuery 导出的文件在 Excel 中打开时显示错误

javascript - 在 jsx 中使用 call 调用函数