在现有库中集成

编辑

学习如何将 Expo 模块 API 集成到现有的 React Native 库中。


有些情况下,您可能希望将 Expo 模块 API 集成到现有的 React Native 库中。例如,逐步重写您的库,或者利用 Android 生命周期监听器iOS AppDelegate 订阅者 来自动设置库,可能会很有用。

本指南将帮助您设置现有的 React Native 库以访问 Expo 模块 API。

先决条件

在您项目的根目录下创建 expo-module.config.json 文件,并在其中添加一个空对象 {}。您稍后将填写它以启用特定功能。

创建此文件对于 Expo 自动链接 识别您的库为 Expo 模块并自动链接您的本机代码是必要的。

1

添加 expo-modules-core 本机依赖

在您的 build.gradlepodspec 文件中将 expo-modules-core 添加为依赖项:

build.gradle
// ... dependencies { // ... implementation project(':expo-modules-core') }
*.podspec
# ... Pod::Spec.new do |s| # ... s.dependency 'ExpoModulesCore' end

2

将 Expo 包添加为依赖项

在您的 package.json 中将 expo 包添加为对等依赖 — 我们推荐使用 * 作为版本范围,以避免在用户的 node_modules 目录中造成任何重复的包。

您的库还需要依赖于 expo-modules-core,但仅作为开发依赖 — 它已经由依赖于您库的项目中的 expo 包提供,版本与项目中使用的特定 SDK 兼容。

package.json
{ %%placeholder-start%%... %%placeholder-end%% "devDependencies": { "expo-modules-core": "^X.Y.Z" }, "peerDependencies": { "expo": "*" }, "peerDependenciesMeta": { "expo": { "optional": true } } }

3

创建本机模块

根据下面的模板创建 Kotlin 和 Swift 文件:

MyModule.kt
package my.module.package import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition class MyModule : Module() { override fun definition() = ModuleDefinition { // 定义组件在此处 } }
MyModule.swift
import ExpoModulesCore public class MyModule: Module { public func definition() -> ModuleDefinition { // 定义组件在此处 } }

然后,将您的类添加到 expo-module.config.json 文件的 Android 和/或 iOS modules 中。Expo 自动链接将自动将这些类链接为用户项目中的本机模块。

expo-module.config.json
{ "ios": { "modules": ["MyModule"] }, "android": { "modules": ["my.module.package.MyModule"] } }

如果您在工作区中已经有一个示例应用,请确保模块正确链接。

  • 在 Android 中,本机模块类将在构建之前作为 Gradle 构建任务的一部分自动链接。
  • 在 iOS 中,您需要运行 pod install 来链接新类。

这些模块类现在可以通过 expo-modules-core 包中的 requireNativeModule 函数从 JavaScript 代码访问。我们建议创建一个单独的文件,导出本机模块以简化操作。

MyModule.ts
import { requireNativeModule } from 'expo-modules-core'; export default requireNativeModule('MyModule');

现在类已经设置并链接,您可以开始实现其功能。请参阅 本机模块 API 参考页和链接到 示例 的简单到中等复杂的实际模块,以了解如何使用 API。