Модули Turbo Native¶
Внимание
Эта документация все еще является экспериментальной, и детали могут быть изменены по мере итераций. Не стесняйтесь делиться своими отзывами в обсуждении внутри рабочей группы для этой страницы.
Более того, она содержит несколько ручных шагов. Пожалуйста, обратите внимание, что это не будет представлять окончательный опыт разработчиков, когда Новая архитектура станет стабильной. Мы работаем над инструментами, шаблонами и библиотеками, которые помогут вам быстро начать работу с новой архитектурой без необходимости проходить всю процедуру настройки.
Если вы работали с React Native, вы можете быть знакомы с концепцией Native Modules, которая позволяет JavaScript и платформенно-нативному коду общаться через "мост" React Native, который обрабатывает межплатформенную сериализацию через JSON.
Turbo Native Modules — это следующая итерация Native Modules, которая обеспечивает несколько дополнительных преимуществ:
- Сильно типизированные интерфейсы, согласованные между платформами.
- Возможность писать код исключительно на C++ или интегрировать его с другим родным языком платформы, уменьшая необходимость дублирования реализаций на разных платформах
- Ленивая загрузка модулей, позволяющая ускорить запуск приложения
- Использование JSI, интерфейса JavaScript для нативного кода, позволяет более эффективно взаимодействовать между нативным и JavaScript-кодом, чем мост.
Это руководство покажет вам, как создать базовый Turbo Native модуль, совместимый с последней версией React Native.
Модули Turbo Native работают только с включенной Новой архитектурой.
Чтобы перейти на Новую архитектуру, следуйте Руководству по миграции
Как создать модуль Turbo Native¶
Чтобы создать модуль Turbo Native, нам необходимо:
- Определить спецификацию JavaScript.
- Настроить модуль так, чтобы Codegen мог генерировать строительные леса.
- Напишите нативный код для завершения реализации модуля.
1. Настройка папки¶
Для того чтобы модуль не был связан с приложением, хорошей идеей будет определить модуль отдельно от приложения, а затем добавить его в качестве зависимости в ваше приложение. Так же вы поступите при написании Turbo Native Modules, которые позже можно будет выпустить в виде библиотек с открытым исходным кодом.
Рядом с вашим приложением создайте папку RTNCalculator
. RTN означает "React Native" и является рекомендуемым префиксом для модулей React Native.
Внутри RTNCalculator
создайте три подпапки: js
, ios
и android
.
Конечный результат должен выглядеть следующим образом:
1 2 3 4 5 6 |
|
2. Спецификация JavaScript¶
Для Новой архитектуры требуются интерфейсы, специфицированные в типизированном диалекте JavaScript (либо Flow, либо TypeScript). Codegen будет использовать эти спецификации для генерации кода на сильно типизированных языках, включая C++, Objective-C++ и Java.
Файл, содержащий эту спецификацию, должен удовлетворять двум требованиям:
- Файл должен быть назван
Native<MODULE_NAME>
, с расширением.js
или.jsx
при использовании Flow, или.ts
, или.tsx
при использовании TypeScript. Codegen будет искать только файлы, соответствующие этому шаблону. - Файл должен экспортировать объект
TurboModuleRegistrySpec
.
NativeCalculator.js | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
NativeCalculator.ts | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
В начале файлов спецификаций находятся импорты:
- Тип
TurboModule
, который определяет базовый интерфейс для всех Turbo Native Modules - JavaScript-модуль
TurboModuleRegistry
, который содержит функции для загрузки Turbo Native Modules.
Вторая секция файла содержит спецификацию интерфейса для модуля Turbo Native Module. В данном случае интерфейс определяет функцию add
, которая принимает два числа и возвращает обещание, которое разрешается в число. Этот тип интерфейса должен иметь имя Spec
для Turbo Native Module.
Наконец, мы вызываем TurboModuleRegistry.get
, передавая имя модуля, который загрузит Turbo Native Module, если он доступен.
Мы пишем файлы JavaScript, импортирующие типы из библиотек, без установки соответствующего модуля node и установки его зависимостей. Ваша IDE не сможет разрешить утверждения импорта, и вы можете увидеть ошибки и предупреждения. Это ожидаемо и не вызовет проблем, когда вы добавите модуль в свое приложение.
3. Конфигурация модуля¶
Далее необходимо добавить некоторые конфигурации для Codegen и автоссылки.
Некоторые файлы конфигурации являются общими для iOS и Android, в то время как другие зависят от конкретной платформы.
Shared¶
Общая конфигурация — это файл package.json
, используемый yarn при установке вашего модуля. Создайте файл package.json
в корне каталога RTNCalculator
.
package.json | |
---|---|
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 |
|
Верхняя часть файла содержит некоторую описательную информацию, такую как название компонента, его версия и исходные файлы. Обязательно обновите различные заполнители, которые обернуты в <>
: замените все вхождения маркеров <ваш_github_handle>
, <ваше имя>
и <your_email@your_provider.com>
.
Затем есть зависимости для этого пакета. Для этого руководства вам понадобятся react
и react-native
.
Наконец, конфигурация Codegen задается полем codegenConfig
. Оно содержит массив библиотек, каждая из которых определяется тремя другими полями:
name
: Имя библиотеки. По соглашению, вы должны добавить суффиксSpec
.type
: Тип модуля, содержащегося в этом пакете. В данном случае это Turbo Native Module; поэтому следует использовать значениеmodules
.jsSrcsDir
: относительный путь для доступа к спецификацииjs
, которая анализируется Codegen.android.javaPackageName
: пакет, который будет использоваться в Java-файлах, генерируемых Codegen.
iOS: Создание файла podspec
.¶
Для iOS вам нужно будет создать файл rtn-calculator.podspec
, который определит модуль как зависимость для вашего приложения. Он будет находиться в корне RTNCalculator
, рядом с папкой ios
.
Файл будет выглядеть следующим образом:
rtn-calculator.podspec | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Файл .podspec
должен быть дочерним по отношению к файлу package.json
, а его имя — то, которое мы задали в свойстве name
файла package.json
: rtn-calculator
.
В первой части файла подготавливаются некоторые переменные, которые мы используем во всем файле. Затем идет раздел, содержащий некоторую информацию, используемую для конфигурации пакета, такую как его имя, версия и описание.
Все требования для новой архитектуры были заключены в install_modules_dependencies
. Она заботится об установке соответствующих зависимостей в зависимости от того, какая архитектура включена в данный момент. Она также автоматически устанавливает зависимость React-Core
в старой архитектуре.
Android: build.gradle
и класс ReactPackage
.¶
Чтобы подготовить Android к запуску Codegen, необходимо:
- Обновить файл
build.gradle
. - Класс Java/Kotlin, реализующий интерфейс
ReactPackage
.
По завершении этих шагов папка android
должна выглядеть следующим образом:
Android Folder Structure | |
---|---|
1 2 3 4 5 6 7 8 |
|
Файл build.gradle
.¶
Сначала создайте файл build.gradle
в папке android
со следующим содержимым:
build.gradle | |
---|---|
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 |
|
build.gradle | |
---|---|
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 |
|
Класс ReactPackage
.¶
Затем вам нужен класс, который расширяет интерфейс TurboReactPackage
. Для запуска процесса Codegen не обязательно полностью реализовывать класс пакета: достаточно пустой реализации, чтобы приложение приняло модуль как правильную зависимость React Native и попыталось сгенерировать код подмостков.
Создайте папку android/src/main/java/com/rtncalculator
и внутри нее создайте файл CalculatorPackage.java
.
CalculatorPackage.java | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
CalculatorPackage.kt | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
React Native использует интерфейс ReactPackage
, чтобы понять, какие нативные классы приложение должно использовать для ViewManager
и Native Modules
, экспортируемых библиотекой.
4. Нативный код¶
Для последнего шага в подготовке вашего Turbo Native Module к работе, вам нужно будет написать нативный код, чтобы соединить JavaScript сторону с нативными платформами. Этот процесс требует двух основных шагов:
- Запустите Codegen и посмотрите, что он сгенерирует.
- Напишите свой нативный код, реализующий сгенерированные интерфейсы.
При разработке приложения React Native, использующего Turbo Native Module, ответственность за фактическую генерацию кода с помощью Codegen лежит на приложении. Однако при разработке TurboModule как библиотеки нам необходимо ссылаться на сгенерированный код, и поэтому полезно видеть, что будет сгенерировано приложением.
В качестве первого шага для iOS и Android в этом руководстве показано, как вручную выполнить скрипты, используемые Codegen для генерации необходимого кода. Дополнительную информацию о Codegen можно найти здесь.
Код, сгенерированный Codegen на этом шаге, не должен быть зафиксирован в системе версий. Приложения React Native могут генерировать код во время сборки приложения. Это позволяет приложению убедиться, что для всех библиотек сгенерирован код для правильной версии React Native.
iOS¶
Генерация кода — iOS¶
Чтобы запустить Codegen для платформы iOS, нам нужно открыть терминал и выполнить следующую команду:
Running Codegen for iOS | |
---|---|
1 2 3 4 5 6 |
|
Этот сценарий сначала добавляет модуль RTNCalculator
в приложение с помощью yarn add
. Затем он вызывает Codegen с помощью сценария generate-codegen-artifacts.js
.
Опция --path
указывает путь к приложению, а опция --outputPath
указывает Codegen, куда выводить сгенерированный код.
Результатом этого процесса будет следующая структура папок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Соответствующий путь для интерфейса Turbo Native Module — generated/build/generated/ios/RTNCalculatorSpec
.
Более подробную информацию о сгенерированных файлах смотрите в разделе Codegen.
При генерации строительного кода с помощью Codegen, iOS не очищает папку build
автоматически. Если вы, например, измените имя Spec, а затем снова запустите Codegen, старые файлы будут сохранены.
Если это произойдет, не забудьте удалить папку build
перед повторным запуском Codegen.
1 2 |
|
Напишите нативный код для iOS¶
Теперь добавьте нативный код для вашего модуля Turbo Native. Создайте два файла в папке RTNCalculator/ios
:
RTNCalculator.h
, заголовочный файл для модуля.RTNCalculator.mm
, реализация модуля.
RTNCalculator.h¶
RTNCalculator.h | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
Этот файл определяет интерфейс для модуля RTNCalculator
. Здесь мы можем добавить любой собственный метод, который мы хотим вызвать на представлении. В данном руководстве нам ничего не нужно, поэтому интерфейс пуст.
RTNCalculator.mm¶
RTNCalculator.mm | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Наиболее важным является вызов RCT_EXPORT_MODULE
, который необходим для экспорта модуля, чтобы React Native мог загрузить Turbo Native Module.
Затем метод add
, сигнатура которого должна совпадать с сигнатурой, указанной Codegen в файле RTNCalculatorSpec.h
.
Наконец, метод getTurboModule
получает экземпляр Turbo Native Module, чтобы сторона JavaScript могла вызывать его методы. Эта функция определена в файле RTNCalculatorSpec.h
(и запрашивается им), который был сгенерирован ранее Codegen.
Существуют и другие макросы, которые могут быть использованы для экспорта модулей и методов. Код, определяющий их, можно посмотреть здесь.
Android¶
Android следует тем же шагам, что и iOS. Мы должны сгенерировать код для Android, а затем написать нативный код, чтобы заставить его работать.
Генерация кода — Android¶
Чтобы сгенерировать код для Android, нам нужно вручную вызвать Codegen. Это делается аналогично тому, как мы делали для iOS: сначала нужно добавить пакет в приложение, а затем вызвать скрипт.
Running Codegen for Android | |
---|---|
1 2 3 4 |
|
Этот сценарий сначала добавляет пакет в приложение, так же, как это делает iOS. Затем, после перемещения в папку android
, он вызывает задачу Gradle для создания сгенерированного кода.
Чтобы запустить Codegen, необходимо включить Новую архитектуру в приложении Android. Это можно сделать, открыв файлы gradle.properties
и переключив свойство newArchEnabled
с false
на true
.
Сгенерированный код хранится в папке MyApp/node_modules/rtn-calculator/android/build/generated/source/codegen
и имеет такую структуру:
Android generated code | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Напишите нативный код Android¶
Нативный код для Android-стороны модуля Turbo Native Module требует:
- создать
CalculatorModule.java
, который реализует модуль. - обновить
CalculatorPackage.java
, созданный на предыдущем шаге.
Окончательная структура библиотеки Android должна выглядеть следующим образом:
Android Folder Structure | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
Создание CalculatorModule.java
.¶
CalculatorModule.java | |
---|---|
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 |
|
CalculatorModule.kt | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Этот класс реализует сам модуль, который расширяет NativeCalculatorSpec
, сгенерированный из файла спецификации JavaScript NativeCalculator
.
Обновление CalculatorPackage.java
¶
CalculatorPackage.java | |
---|---|
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 40 41 42 43 44 45 46 47 |
|
CalculatorPackage.kt | |
---|---|
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 |
|
Это последняя часть нативного кода для Android. Он определяет объект TurboReactPackage
, который будет использоваться приложением для загрузки модуля.
Окончательная структура¶
Окончательная структура должна выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
5. Добавление модуля Turbo Native в ваше приложение¶
Теперь вы можете установить и использовать модуль Turbo Native в своем приложении.
Shared¶
Прежде всего, нам нужно добавить пакет NPM, содержащий Компонент, в приложение. Это можно сделать с помощью следующей команды:
1 2 |
|
Эта команда добавит модуль RTNCalculator
в node_modules
вашего приложения.
iOS¶
Затем необходимо установить новые зависимости в ваш проект iOS. Для этого выполните следующие команды:
1 2 |
|
Эта команда будет искать все зависимости проекта и установит те, которые нужны для iOS. Параметр RCT_NEW_ARCH_ENABLED=1
указывает Cocoapods, что ему необходимо выполнить некоторые дополнительные операции для запуска Codegen.
Возможно, вам придется один раз запустить bundle install
, прежде чем вы сможете использовать RCT_NEW_ARCH_ENABLED=1 bundle exec pod install
. Вам больше не понадобится запускать bundle install
, если только вам не нужно изменить зависимости Ruby.
Android¶
Для включения Новой архитектуры требуется конфигурация Android:
- Откройте файл
android/gradle.properties
. - Прокрутите вниз до конца файла и переключите свойство
newArchEnabled
сfalse
наtrue
.
JavaScript¶
Теперь вы можете использовать калькулятор Turbo Native Module в своем приложении!
Вот пример файла App.js, использующего метод add
:
App.js | |
---|---|
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 40 41 42 |
|
App.tsx | |
---|---|
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 40 |
|
Попробуйте это, чтобы увидеть ваш модуль Turbo Native в действии!