JSX - звездное изобретение, даже если React не используется.
Если вы работали с React - а даже если нет - вы, вероятно, слышали о JSX. Это та странная конструкция html-in-javascript, которая заставляет всех съеживаться, когда они впервые ее обнаруживают, но большинству людей нравится, когда они приходят к пониманию этой идеи.
Почему это круто? Потому что он поддерживает идею о том, что шаблоны - это просто функции. Они принимают данные на входе и выводят структурированное визуальное представление этих данных.
Такие языки программирования, как javascript, хорошо справляются с функциями. Поэтому естественно, что шаблоны лучше всего подходят для жизни непосредственно в самом коде, а не как отдельные объекты с разными правилами и разными соглашениями. Фактически, это дает множество преимуществ:
- Применяются обычные правила области видимости javascript; если он входит в область действия, вы можете включить его в шаблон.
- Применяется обычная логика JavaScript; нет необходимости заново изобретать «if» и «else» в еще одном языке шаблонов.
- Ошибки отрисовки шаблонов - это обычные исключения javascript с трассировкой полного стека.
- Если вы используете статическую типизацию, ваши шаблоны теперь безопасны для типов!
В React выходные данные этих шаблонных функций представляют собой виртуальный объект DOM, который в конечном итоге отображается на реальный DOM для отображения контента и пользовательских интерфейсов.
Но команда React сделала невероятно умный ход, когда придумала JSX:
Они не связали JSX с React плотно. Ни капли.
Сделаем шаг назад. Как выглядит JSX после компиляции?
По-моему, это довольно тесно связано, не так ли? А как насчет всех этих React.createElement
звонков?
Но ждать! Что, если мы быстро добавим @jsx
комментарий к прагме?
Babel достаточно умен, чтобы начать переносить JSX, который мы написали, в совершенно другую прагму! В этом случае вместо React.createElement
он переходит в zomboComponent
.
Теперь мы полностью убрали React из картинки и можем определить наш собственный путь рендеринга JSX и рендерить все, что нам нравится!
Например, возможно, мы хотим вместо этого выполнить рендеринг непосредственно в элемент DOM. Мы можем это сделать! Все, что нам нужно сделать, это объявить функцию, которая принимает name
, props
и children
, и создать для нас эти элементы:
Теперь все, что мне нужно сделать, это добавить /* @jsx renderDom */
комментарий, и все готово!
Неужели это так просто?
Да и нет. Вы абсолютно можете делать то, что я только что продемонстрировал выше. Но, как всегда, следует учесть несколько неприятных нюансов:
- При таком подходе вы должны решить во время сборки, какую прагму JSX-код следует перенести для использования. Итак - если вам нужна функция, которая отображает html на сервере и которая отображает узел DOM на клиенте, потребуется немного больше работы.
- JSX также транспилирует
<MyComponent>
и<mycomponent>
по-разному, в зависимости от использования заглавных букв в имени компонента. Таким образом, готовая к производству версия должна учитывать оба этих типа. - Есть также много возможностей для
...children
содержать вложенные массивы, которые может быть сложно перебрать. - Нам также нужно подумать о поддержке
Fragment
, которая теперь даже имеет свой собственный<>
</>
синтаксис в jsx.
Я собрал небольшой (3kb gzip) модуль, чтобы упростить работу со всем вышеперечисленным:
Используя jsx-pragmatic, вы можете решить во время выполнения в зависимости от контекста, как именно вы хотите визуализировать компонент:
Модуль поставляется со встроенными модулями визуализации HTML, DOM и React.
Но вы также можете легко создать свой собственный рендерер и подключить его! Рендереры в jsx-pragmatic - это просто функции; и вам даже не придется думать о работе с вложенными массивами, фрагментами и об обработке различий между такими элементами, как <foo />
, и такими компонентами, как <Bar />
. Об этом все позаботились.
Почему бы просто не использовать React?
В PayPal мы создаем SDK, которые отображают пользовательский интерфейс непосредственно на сторонних сайтах. У нас нет возможности загружать всю библиотеку представлений, такую как React, на сайты, которые нам не принадлежат. Но мы любим JSX. С его помощью мы можем создавать шаблоны без необходимости поставлять огромную библиотеку шаблонов - потому что все они переносятся во время сборки - и мы можем отображать их в Интернете, как захотим, с помощью таких библиотек, как jsx-pragmatic
.
Мы используем React для приложений, которыми владеем; но когда дело доходит до создания модулей для встраивания непосредственно на страницы нашего продавца, мы чувствуем, что только JSX дает нам большую часть необходимой мощности, контроля и скорости.
Привет Сыру!
Если вас интересует другое приложение JSX в PayPal, также попробуйте Syr! Мы используем Syr, чтобы преодолеть разрыв между iOS, Android и Интернетом, используя всю мощь кроссплатформенного JSX.
Правила JSX!
Создавайте интересные вещи с помощью JSX! Что еще можно было использовать для рендеринга JSX?