Разработка на JavaScript без «нового приложения»

У Спайка Брема есть привычка популяризировать термины в разработке программного обеспечения. Возможно, вы слышали об Изоморфном JavaScript раньше; это термин, который он популяризировал в своей работе над библиотекой Rendr (хотя он скромно отдал должное Чарли Роббинсу за создание этого термина). В недавнем разговоре со Спайком он рассказал мне о концепции нового приложения.

В случае с Airbnb у них есть приложение Rails шестилетней давности, которое вряд ли можно использовать для создания нового кода. Находясь вместо этого в заброшенной ситуации, Спайк объяснил, что Airbnb прилагает различные усилия для использования новейших инструментов JavaScript при интеграции с устаревшим приложением Rails.

CommonJS + Rails

Недавняя цель команды Airbnb заключалась в том, чтобы внедрить CommonJS (модульную систему Node.js) в конвейер ресурсов Rails. Sprockets, гем Rails по умолчанию для объединения / обслуживания ресурсов, обрабатывает только плоский список зависимостей в манифесте актива и предоставляет код JavaScript глобальному пространству имен. Это не идеально для больших приложений JavaScript, которым требуется более структурированное дерево зависимостей и инкапсуляция того, как код работает в браузере.

Чтобы решить эту проблему, Airbnb создал драгоценный камень Ruby для объединения Sprockets и Gulp. Это позволило им использовать обслуживание и развертывание ресурсов для конкретной среды из Sprockets при использовании Gulp и Browersify для объединения и управления зависимостями. В настоящее время это частный драгоценный камень, но вскоре он должен стать общедоступным.

Магистраль - ›React

Спайк также описал новое направление Airbnb в создании интерфейсной инфраструктуры. С тех пор, как Airbnb начал использовать Backbone в 2011 году, появились новые библиотеки, которые, по его мнению, достаточно убедительны, чтобы пересмотреть свой стек.

В частности, Спайка интересовала библиотека React.js от Facebook. React кажется хорошим решением для замены существующего кода представления Backbone, поскольку, по словам Спайка, он имеет «очень хорошую область видимости». Он решает уровень «V» в MVC, который обычно является самой сложной частью интерфейсных веб-приложений.

Спайк начал с описания некоторых проблем, с которыми он столкнулся при поддержке кода Backbone. Подпредставления Backbone и плагины jQuery часто изменяют состояние приложения после рендеринга представления и тем самым предотвращают полную повторную визуализацию без потери части этого вновь добавленного состояния и снижения производительности. Ручная синхронизация состояния между шаблонами и представлениями также побуждает разработчиков писать код, который задает такие вопросы, как «Виден ли этот элемент DOM?» или «Применяется ли этот класс?» которым становится сложно управлять во вложенной структуре представления.

В то время как Backbone требует двусторонней синхронизации состояний между шаблонами и представлениями, React обеспечивает однонаправленный поток данных и единственный способ рендеринга HTML в DOM. Вместо того, чтобы писать код перехода между состояниями, вы описываете, как выглядит DOM в определенном состоянии, и если состояние изменяется, React обрабатывает все соответствующие переходы за вас.

В настоящее время Airbnb использует React в производственной среде на сайте airbnb.com/resolutions и во внутренних приложениях с библиотекой router.js. Они планируют и дальше использовать его для будущих интерфейсных разработок.

Изоморфный JavaScript

Спайк сообщил мне, что Airbnb планирует прекратить использовать Rendr для своего мобильного веб-сайта, вместо этого в будущем выбрав адаптивный подход к веб-дизайну. Команда пришла к выводу, что выгода от совместного использования кода JavaScript между клиентом и сервером перевешивается объемом переписывания, который им приходилось делать с Ruby на Node.js, в дополнение к накладным расходам на поддержку приложения Node в производственной среде. Некоторыми конкретными примерами дублированного серверного кода были логика CSRF, настройка и анализ файлов cookie, а также специальные заголовки HTTP, которые необходимо было установить во всех приложениях Airbnb.

По словам Спайка, план Airbnb состоит в том, чтобы в конечном итоге создать гем Ruby, который позволил бы их серверу Rails обмениваться данными по HTTP с процессом Node, отображающим компоненты React. Кроме того, в ситуации с нуля при создании нового приложения для Спайка предпочтительным стеком будет изоморфный подход JavaScript, такой как Rendr. Чтобы узнать больше об изоморфном JavaScript, ознакомьтесь с докладом Спайка на JSConf 2014:

Вывод

Спасибо Спайку за то, что он нашел время поделиться тем, над чем он работает на Airbnb. Я с нетерпением жду возможности увидеть больше инструментов с открытым исходным кодом от Airbnb в будущем!