Мое последнее учебное приключение привело меня к желанию создать мобильное приложение. Естественно, React Native кажется мне хорошим выбором, учитывая опыт работы с React, однако как один из крупнейших в мире стартапов выбрал React Native для своего фреймворка?

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

Первоначально выбрав путь создания мобильных приложений iOS и Android с выделенной инфраструктурой, задача идти в ногу с постоянно растущими темпами мобильной разработки оказалась слишком сложной для команды разработчиков. Принимая во внимание, что Airbnb изначально был просто веб-сайтом и создал целую базу талантов для веб-разработки, превращение в гибкую мобильную команду за короткий промежуток времени было бы сложной задачей для любой компании. Не имея необходимого таланта для мобильных разработчиков и подавляющего большинства разработчиков, обученных работе в Интернете, несколько команд начали искать кросс-платформенные решения.

В 2016 году Facebook выпустил React Native. Фреймворк JavaScript с открытым исходным кодом для написания реальных мобильных приложений для iOS и Android с нативным рендерингом, основанный на тех же фундаментальных концепциях, которые использует React.

Это была захватывающая новая технология, которая, казалось, идеально подходила для нужд Airbnb. Наличие веб-сайта, который был создан в основном с помощью React, и команде разработчиков, которым всем нравится опыт разработки с React. Казалось естественным использовать React Native, чтобы открыть мобильную разработку для большего числа инженеров, а также ускорить выпуск кода за счет использования его кроссплатформенной природы.

Когда Airbnb начала инвестировать в React Native, они понимали риски внедрения такой новой технологии. Добавление новой, быстро развивающейся и непроверенной платформы в нашу кодовую базу, которая потенциально могла фрагментировать ее вместо унификации, было первым в списке рисков. Но они знали, что если они собираются так активно переходить на React Native, они хотели сделать это правильно с самого начала.

Добро

Быстрое развитие

Самым большим преимуществом React Native для Airbnb было быстрое развитие. Airbnb может задействовать всю свою команду инженеров-разработчиков для создания и поддержки своих мобильных приложений. Это также означало, что будущих сотрудников можно было обучать независимо от их опыта работы с мобильными устройствами или веб-сайтами. Также это приводит к более компактной кодовой базе, поскольку один репозиторий можно развернуть на трех платформах.

Кроссплатформенность

Наличие фреймворка, компилируемого в нативный код как для Android, так и для iOS, было огромным преимуществом React Native. Большинство функций, использующих React Native, смогли достичь 95–100 % общего кода и0,2 % файлов были привязаны к конкретной платформе.

Инвестиции в инфраструктуру

Airbnb разработала обширную интеграцию в существующую инфраструктуру. Все основные элементы, такие как сеть, i18n, эксперименты, переходы между общими элементами, информация об устройстве, информация об учетной записи и многие другие, были заключены в единый React Native API.

Без этих значительных инвестиций в инфраструктуру интеграция React Native привела бы к неудовлетворительному опыту разработчиков и пользователей.

Представление

Часто считается, что JavaScript медленнее, чем языки более низкого уровня, такие как Java. Это было первоначальной проблемой для Airbnb, однако было обнаружено, что перенос бизнес-логики и макета из основного потока во многих случаях фактически повышает производительность рендеринга. Это привело к тому, что большинство экранов React Native стали такими же плавными, как и нативные.

Плохо

Незрелость

Когда React Native был представлен миру, он был явно менее зрелым, чем Android и iOS. Хотя React Native хорошо работает в большинстве ситуаций, были случаи, когда его незрелость проглядывала и делала то, что было бы тривиальным в нативном, очень сложным. Это вызывало задержки в цикле разработки, иногда на создание обходных путей уходило несколько дней.

Несоответствия JavaScriptCore

React Native выполняется в среде JavaScriptCore. Это прекрасно работает на iOS, которая поставляется с собственным ядром JavaScriptCore из коробки. Но Android не поставляется со своим. Это приводит к тому, что React Native упаковывает свою собственную упаковку, однако связанное ядро ​​​​по умолчанию является гораздо более старой версией. В то время как React Native использует инструменты разработчика Chrome для отладки, он использует новейший механизм JavaScript Chrome V8, который отлично запускает код. При компиляции кода для запуска на Android некоторые библиотеки не будут включены в связанный JavaScriptCore, что приведет к тихому сбою кода, если только вы не отлаживаете его.

Рефакторинг

Побочным эффектом нетипизации JavaScript является то, что рефакторинг был чрезвычайно сложным и подверженным ошибкам. Переименование свойств, особенно свойств с общим именем, например onClick, или свойств, которые передаются через несколько компонентов, было кошмаром для точного рефакторинга. Что еще хуже для Airbnb, рефакторинг сломался в процессе производства, а не во время компиляции, и для него было сложно добавить надлежащий статический анализ.

Взвешивание хорошего и плохого

В 2019 году недостатки Airbnb перевесили преимущества. Побуждение их пересмотреть свое решение и в конечном итоге отказаться от разработки React Native. Потому что они не смогли достичь конкретных целей, заключающихся в простом опыте разработчика, минимизации объема написанного кода, обеспечении высокого качества взаимодействия с пользователем и, в конечном итоге, в быстром цикле организационного развития. Airbnb выбирает нативные решения для Android и iOS независимо друг от друга.

Хотя эти цели больше не могли быть достигнуты с помощью React Native, инженеры, которые использовали React Native, в целом получили положительный опыт. 63% инженеров выбрали бы React Native снова, если бы у них была такая возможность, а 74% выбрали бы React Native для нового проекта. Эти инженеры написали 80 000 строк кода продукта на 220 экранах, а также 40 000 строк инфраструктуры JavaScript.

В конечном счете, в то время как кроссплатформенные фреймворки решают большинство простых проблем, что-то более сложное в конечном итоге потребует от вас вернуться к родным платформам данного мобильного устройства.