This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

如何使用隔离方法将 Expo 添加到原生应用

编辑页面

一份关于将 Expo 和 React Native 作为原生库添加,并使用隔离方法将其集成到现有(brownfield)原生应用中的指南。


在隔离式方案中,你的 React Native 代码独立于原生项目开发和维护。你可以将其打包为原生库:Android 使用 AAR,iOS 使用 XCFramework,然后像其他依赖一样将其集成到原生应用中。

当你希望尽量减少 React Native 对现有原生构建流程的影响,或者原生开发和 React Native 开发由不同团队负责时,这种方案最为理想。采用这种方案后,原生开发者不需要 Node.js、Yarn 或任何 React Native 构建工具链,只需使用已经构建好的产物即可。

Prerequisites

2 requirements

1.

Node.js(LTS)

安装 Node.js 以运行 JavaScript 代码和 Expo CLI。

2.

Yarn

安装 Yarn 作为 JavaScript 依赖项的包管理器。

更多信息请参阅 环境搭建指南。

设置 Expo 项目

1

创建新的 Expo 项目

运行以下命令,在名为 my-project 的新目录中创建 Expo 项目。虽然你可以为项目指定任意名称,但本指南为保持一致性,使用 my-project。

Terminal
- npx create-expo-app@latest my-project
- yarn create expo-app my-project
- pnpm create expo-app my-project
- bun create expo my-project

my-project 不需要位于现有原生应用内部,也可以创建在单独的仓库或 monorepo 中。新项目包含一个示例 TypeScript 应用,帮助你快速开始。

2

安装 expo-brownfield

进入新建的 Expo 项目并安装 expo-brownfield 库。该库提供将 React Native 代码构建为原生库并集成到现有原生应用中的工具。

Terminal
- npx expo install expo-brownfield
- yarn expo install expo-brownfield
- pnpm expo install expo-brownfield
- bun expo install expo-brownfield

3

调整配置插件(可选)

expo-brownfield 应会自动使用默认配置,在 app.json 的 plugins 数组中添加一项。对于大多数项目来说,这已经足够。

app.json
{ "expo": { "plugins": ["expo-brownfield"] } }

默认值会根据应用配置推导而来(例如,目标名称会基于应用的 scheme 或 slug)。你也可以传入选项,自定义目标名称、包标识符和发布配置。

自定义 expo-brownfield 配置
app.json
{ "expo": { "plugins": [ [ "expo-brownfield", { "ios": { "targetName": "MyBrownfield", "bundleIdentifier": "com.example.mybrownfield" }, "android": { "libraryName": "mybrownfield", "group": "com.example", "package": "com.example.mybrownfield", "version": "1.0.0" } } ] ] } }

有关所有可用选项的详细信息,请参阅 expo-brownfield API 参考。

将 Expo 项目导出为原生库

完成 Expo 项目设置后,使用 expo-brownfield CLI 将 React Native 代码构建为 Android 的 AAR 和 iOS 的 XCFramework。

在 Expo 项目目录中运行:

Terminal
- npx expo-brownfield build:android
- yarn dlx expo-brownfield build:android
- pnpm dlx expo-brownfield build:android
- bunx expo-brownfield build:android

此命令会构建 AAR 并将其发布到 Maven 仓库。默认情况下,它会发布到本地 Maven 仓库(~/.m2),但也可以配置为发布到远程仓库。 生成的产物名称取决于配置插件设置。在此示例中,名称为 com.username.myproject:brownfield:1.0.0。

有关构建选项的更多详情,请参阅 API 参考,例如仅构建 debug 或 release、指定自定义输出目录等。

调试原生目标

如果需要调试 Expo 项目目标中的原生代码,可以运行 npx expo prebuild,在 android 和 ios 目录中生成包含 brownfield 库目标的原生项目。

Terminal
- npx expo prebuild
- yarn expo prebuild
- pnpm expo prebuild
- bun expo prebuild

上述命令会生成以下内容:

  • Android:一个独立的库模块,包含 ReactNativeHostManager、BrownfieldActivity、ReactNativeFragment、ReactNativeViewFactory 和 BrownfieldMessaging。
  • iOS:一个独立的 Xcode framework 目标,包含 ReactNativeHostManager、ReactNativeViewController、ReactNativeView(SwiftUI)、BrownfieldMessaging 和 ReactNativeDelegate。

集成到原生应用中

构建好产物后,即可将其集成到现有原生应用中。具体步骤取决于项目结构和构建系统,但整体流程包括将预构建产物作为依赖添加,并初始化 React Native host。

1

添加 Maven 依赖

首先,将依赖添加到应用的 build.gradle.kts 中。group、artifact 名称和版本应与你的配置插件设置一致:

app/build.gradle.kts
dependencies { implementation("com.username.myproject:brownfield:1.0.0") }

如果该库发布到本地 Maven,请确保在仓库配置中添加 mavenLocal():

settings.gradle.kts
dependencyResolutionManagement { repositories { google() mavenCentral() mavenLocal() } }

2

显示 React Native 页面

创建一个继承自 BrownfieldActivity 的 activity,并使用 showReactNativeFragment() 扩展方法:

ExpoActivity.kt
import android.os.Bundle import com.example.brownfield.BrownfieldActivity import com.example.brownfield.showReactNativeFragment class ExpoActivity : BrownfieldActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) showReactNativeFragment() } }

在 AndroidManifest.xml 中添加该 activity,并使用非 ActionBar 主题:

AndroidManifest.xml
<activity android:name=".ExpoActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" />

然后,在应用中的任意位置启动该 activity:

startActivity(Intent(this, ExpoActivity::class.java))

BrownfieldActivity 继承自 AppCompatActivity,负责将配置变化转发给 Expo 模块。showReactNativeFragment() 扩展方法也会自动配置原生返回按钮处理。

测试集成

你已经完成了将 React Native 集成到应用中的所有基础步骤。现在可以进行测试了。具体流程取决于运行的是 debug 还是 release 构建。

开发(debug 构建)

现在,在 React Native 目录中运行以下命令,以启动 Metro bundler

Terminal
- npx expo start
- yarn expo start
- pnpm expo start
- bun expo start

然后,从 Android Studio 或 Xcode 构建并运行原生应用。当进入 React Native 屏幕时,应用会从 Metro 开发服务器加载,并支持热重载。

生产(release 构建)

在 release 构建中,JavaScript bundle 会嵌入产物(AAR 或 XCFramework)中,因此不需要 Metro 服务器。使用 Release 配置构建原生应用,并确认 React Native 屏幕能够正确加载。

下一步

生命周期监听器

为 Expo 模块配置应用生命周期监听器,以实现更深入的集成。

expo-brownfield API 参考

探索用于通信、导航等功能的完整 JavaScript API。