Компоненты Fabric как унаследованные нативные компоненты¶
Внимание
Эта документация все еще является экспериментальной, и детали могут быть изменены по мере итераций. Не стесняйтесь делиться своими отзывами в обсуждении внутри рабочей группы для этой страницы.
Более того, она содержит несколько ручных шагов. Пожалуйста, обратите внимание, что это не будет представлять окончательный опыт разработчиков, когда Новая архитектура станет стабильной. Мы работаем над инструментами, шаблонами и библиотеками, которые помогут вам быстро начать работу с новой архитектурой без необходимости проходить всю процедуру настройки.
Создание обратно совместимого Fabric Native Component требует знаний о том, как создать Legacy Native Component. Чтобы вспомнить эти понятия, ознакомьтесь с этим руководством.
Fabric Native Components работают только при правильной настройке новой архитектуры. Если у вас уже есть библиотека, которую вы хотите перевести на новую архитектуру, ознакомьтесь также с руководством по миграции.
Создание обратно совместимого Fabric Native Component позволяет вашим пользователям продолжать использовать вашу библиотеку независимо от архитектуры, которую они используют. Создание такого компонента требует нескольких шагов:
- Настройте библиотеку так, чтобы зависимости были подготовлены для правильной установки как для старой, так и для новой архитектуры.
- Обновить кодовую базу таким образом, чтобы типы Новой архитектуры не компилировались, если они недоступны.
- Унифицируйте API JavaScript так, чтобы пользовательский код не нуждался в изменениях.
В данном руководстве мы будем использовать следующую терминологию:
- Legacy Native Components — для обозначения компонентов, работающих на старой архитектуре React Native.
- Fabric Native Components — Компоненты, которые были адаптированы для работы с новым нативным рендерером Fabric. Для краткости их можно назвать Fabric Components.
Внимание
Fabric Native Components работает только при включенной Новой архитектуре. Чтобы перейти на новую архитектуру, следуйте руководству по миграции
В то время как последний шаг одинаков для всех платформ, первые два шага отличаются для iOS и Android.
Настройте зависимости нативных компонентов Fabric.¶
iOS¶
Платформа Apple устанавливает Fabric Native Components, используя Cocoapods в качестве менеджера зависимостей.
Если вы уже используете функцию install_module_dependencies
, то делать ничего не нужно. Эта функция уже позаботилась об установке нужных зависимостей, когда включена Новая архитектура, и об их отсутствии, когда она не включена.
В противном случае, podspec
вашего Fabric Native Component должен выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
Вам следует устанавливать дополнительные зависимости, когда Новая архитектура включена, и избегать их установки, когда она не включена. Для этого можно воспользоваться командой install_modules_dependencies
. Обновите файл .podspec
следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
Android¶
Чтобы создать нативный компонент, который может работать с обеими архитектурами, необходимо настроить Gradle на выбор того, какие файлы должны быть скомпилированы в зависимости от выбранной архитектуры. Этого можно достичь, используя различные наборы исходных текстов в конфигурации Gradle.
Обратите внимание, что в настоящее время это рекомендуемый подход. Хотя он может привести к некоторому дублированию кода, он обеспечит максимальную совместимость с обеими архитектурами. Как уменьшить дублирование, вы увидите в следующем разделе.
Чтобы настроить Fabric Native Component так, чтобы он выбирал нужный набор источников, необходимо обновить файл build.gradle
следующим образом:
build.gradle | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Эти изменения делают три основные вещи:
- Первые строки определяют функцию, которая возвращает, включена ли Новая архитектура или нет.
- Строка
buildConfigField
определяет булево поле конфигурации сборки под названиемIS_NEW_ARCHITECTURE_ENABLED
, и инициализирует его с помощью функции, объявленной в первом шаге. Это позволит вам проверить во время выполнения, указал ли пользователь свойствоnewArchEnabled
или нет. - Последние строки используют функцию, объявленную в первом шаге, чтобы решить, какие наборы исходников нам нужно собрать, в зависимости от выбранной архитектуры.
Обновление кодовой базы¶
iOS¶
Второй шаг — это указание Xcode не компилировать все строки, использующие типы и файлы новой архитектуры, когда мы собираем приложение со старой архитектурой.
Fabric Native Component требует заголовочный файл и файл реализации для добавления фактического View
в модуль.
Например, заголовочный файл RNMyComponentView.h
может выглядеть следующим образом:
RNMyComponentView.h | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Вместо этого файл реализации RNMyComponentView.mm
может выглядеть следующим образом:
RNMyComponentView.mm | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
Чтобы убедиться, что Xcode пропускает эти файлы, мы можем обернуть обои из них в какую-нибудь прагму компиляции #ifdef RCT_NEW_ARCH_ENABLED
. Например, заголовочный файл может измениться следующим образом:
1 2 3 4 5 6 7 8 |
|
Эти же две строки должны быть добавлены в файл реализации, как первая и последняя строки.
В приведенном выше фрагменте используется тот же флаг RCT_NEW_ARCH_ENABLED
, что и в предыдущем разделе. Когда этот флаг не установлен, Xcode пропускает строки внутри #ifdef
во время компиляции и не включает их в скомпилированный двоичный файл. Скомпилированный двоичный файл будет содержать объект RNMyComponentView.o
, но это будет пустой объект.
Android¶
Поскольку мы не можем использовать блоки условной компиляции в Android, мы определим два разных набора исходных текстов. Это позволит создать обратно совместимый TurboModule с соответствующим исходным кодом, который загружается и компилируется в зависимости от используемой архитектуры.
Таким образом, вам необходимо:
- Создать Legacy Native Component по пути
src/oldarch
. Смотрите это руководство, чтобы узнать, как создать Legacy Native Component. - Создайте нативный компонент Fabric по пути
src/newarch
. См. это руководство, чтобы узнать, как создать Fabric Native Component.
а затем поручите Gradle решить, какую реализацию выбрать.
Некоторые файлы могут быть общими для Legacy и Fabric Component: их следует создать или переместить в папку, которая загружается обеими архитектурами. К таким файлам относятся:
<MyComponentView>.java
, который инстанцирует и конфигурирует Android View для обоих компонентов.- файл
<MyComponentView>ManagerImpl.java
, содержащий логику ViewManager, которая может использоваться совместно Legacy и Fabric Component. - файл
<MyComponentView>Package.java
, используемый для загрузки компонента.
Окончательная структура папок выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Код, который должен находиться в файле MyComponentViewManagerImpl.java
и который может быть разделен между нативным компонентом и нативным компонентом Fabric, например:
example of MyComponentViewManager.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
example of MyComponentViewManager.kt | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Затем нативный компонент и нативный компонент Fabric могут быть обновлены с помощью функции, объявленной в общем менеджере.
Например, для нативного компонента:
Native Component using the ViewManagerImpl | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Native Component using the ViewManagerImpl | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
И для компонента Fabric Native Component:
Fabric Component using the ViewManagerImpl | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
=== Kotlin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Пошаговый пример того, как этого добиться, можно найти в этом репозитории.
Унификация спецификаций JavaScript¶
Внимание
Fabric Native Components работает только при включенной Новой архитектуре. Чтобы перейти на новую архитектуру, следуйте руководству по миграции
Последний шаг позволяет убедиться, что JavaScript ведет себя прозрачно для выбранной архитектуры.
Для нативного компонента Fabric источником истины является файл спецификации <Ваш модуль>NativeComponent.js
(или .ts
). Приложение обращается к файлу спецификации следующим образом:
1 |
|
Поскольку codegenNativeComponent
вызывает requireNativeComponent
под капотом, нам нужно реэкспортировать наш компонент, чтобы избежать его многократной регистрации.
1 2 3 |
|
1 2 |
|