Отключить response-jsx для каждого файла в проекте ReasonReact

Есть ли способ отключить преобразование res ponse-jsx в некоторых файлах проекта ReasonReact?

Думаю, можно и наоборот, не добавляя "reason": { "react-jsx": 3 } к bsconfig.json и добавив @@bs.config({jsx: 3}) в начало файлов, в которых вы хотите преобразовать res ponse-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 применяется перед пользовательскими).

Другие вопросы по тегам