#bucklescript #reason-react #rescript
#bucklescript #причина-реагировать #повторный скрипт
Вопрос:
Есть ли способ отключить преобразование react-jsx в некоторых файлах проекта ReasonReact?
Я думаю, что возможен другой способ, если не добавлять "reason": { "react-jsx": 3 }
в bsconfig.json
, а добавлять @@bs.config({jsx: 3})
в начало файлов, где требуется преобразование react-jsx, но это вынудило бы меня добавлять эту аннотацию в слишком много файлов.
Я хотел бы создать небольшой DSL на основе JSX в нескольких файлах, используя React в остальной части моего проекта.
Ответ №1:
Примечание: предлагаемое решение не очень простое, и я думаю, что гораздо проще добавить @@bs.config
аннотации явно во все требуемые файлы, но если вы действительно не хотите этого делать, может сработать следующее.
Если я правильно читаю код компилятора, пользовательские ppx применяются до ReasonReact ppx. В связанном модуле компилятора Cmd_ppx_apply.apply_rewriters
будет применяться ко всем аргументам, переданным с -ppx
флагом, и Ppx_entry.rewrite_implementation
является ReasonReact ppx.
Предполагая, что это правда, можно было бы иметь ppx, который проверяет оператор верхнего уровня, например @@custom.jsx
, в верхней части файла, который будет проверять ppx. У ReasonReact ppx раньше была аналогичная проверка на случай, если она служит ссылкой.
Затем, если это утверждение найдено, пользовательский ppx обработает узлы, у которых есть @JSX
атрибуты, и удостоверится, что удаляет из них атрибуты, поэтому, когда компилятор передает AST в ReasonReact ppx, он их не увидит.
Обратите внимание, что это приведет к сбою, если конвейер ReScript ppx однажды будет обновлен до конвейера на основе драйвера (я бы сказал, маловероятно, потому что это означало бы, что ReScript должен каким-то образом поддерживать собственные библиотеки как граждане 1-го класса), или если порядок, упомянутый выше, изменится (ReasonReact ppx применяется до пользовательских). определенные пользователем).
Комментарии:
1. хм интересно, это слишком много накладных расходов для моего варианта использования, но определенно полезно знать, что есть обходной путь, когда это действительно необходимо!
2. Разработчики Rescript подтвердили, что отключение преобразования для каждого файла в любом случае невозможно, поэтому ваше решение или добавление
@@bs.config
поверх любых других файлов — единственные обходные пути, которые у нас есть на данный момент: forum.rescript-lang.org/t/disable-react-jsx-per-file/200 /…