在 ReasonReact 项目中禁用每个文件的 react-jsx

Disable react-jsx per file in a ReasonReact project

有没有办法在 ReasonReact 项目的某些文件中禁用 react-jsx 转换?

我认为另一种方法是可以通过不将 "reason": { "react-jsx": 3 } 添加到 bsconfig.json 并将 @@bs.config({jsx: 3}) 添加到要进行 react-jsx 转换的文件的顶部,但是这将迫使我在太多文件中添加此注释。

我想在几个文件中构建一个基于 JSX 的小型 DSL,同时在项目的其余部分中受益于 React。

注意:建议的解决方案不是很直接,我认为在所有需要的文件中显式添加 @@bs.config 注释要简单得多,但如果你真的不想这样做,以下可能会起作用。

如果我 the compiler code 的阅读正确,user-defined ppx 会在 ReasonReact ppx 之前应用。在链接编译器模块中,Cmd_ppx_apply.apply_rewriters 将应用所有通过 -ppx 标志传递的参数,并且 Ppx_entry.rewrite_implementation 是 ReasonReact ppx。

假设这是真的,可以有一个 ppx 检查文件顶部的 top-level 语句,如 @@custom.jsx,ppx 会检查。 ReasonReact ppx used to have a similar check,以备参考。

然后,如果找到此语句,自定义 ppx 将处理具有 @JSX 属性的节点并确保它从中删除属性,因此当编译器将 AST 传递给 ReasonReact ppx 时,它不会看到他们。

请注意,如果 ReScript ppx 管道有一天更新为 driver-based 管道(我不太可能这么说,因为这意味着 ReScript 应该以某种方式支持本地库作为第一个 class 公民,这将会中断),或者如果上述顺序发生变化(ReasonReact ppx 适用于 user-defined 个之前)。