添加自定义原生代码
编辑
学习如何向您的 Expo 项目添加自定义原生代码。
您可以通过以下一种或两种方法添加自定义原生代码:
使用包含原生代码的库
Expo 和 React Native 开发人员通常将大部分时间花费在编写 JavaScript 代码以及使用通过像 expo-camera、react-native-safe-area-context 和 react-native 本身等库提供的原生 API 和组件上。这些库允许开发人员在他们的 JavaScript 代码中访问和使用设备功能。它们还可以提供对以原生代码实现的第三方服务 SDK 的访问(例如 @sentry/react-native,它为 Android 和 iOS 提供了 Sentry 原生 SDK 的绑定)。
使用 Expo Go?
如果您正在使用沙箱应用 Expo Go,您只能访问 Expo SDK 中包含的原生库,或不包含任何自定义原生代码的库(了解更多)。创建开发构建允许您像在其他原生应用中一样更改原生代码或配置。
在开发构建中安装具有自定义原生代码的库
使用 开发构建 时,使用带有自定义原生代码的库非常简单:
- 使用 npm 安装库,例如:
npx expo install react-native-localize - 如果库包含 配置插件,您可以在应用配置中指定您首选的配置。
- 创建一个新的开发构建(可以本地或使用 EAS)。
现在您可以在应用代码中使用该库。
关键概念和开发工作流程
开发概述提供了有关使用 Expo 开发应用程序的关键概念和核心开发循环的流程的详细信息。
编写原生代码
使用 Expo Modules API 编写 Swift 和 Kotlin 代码,并通过原生模块和视图向您的应用添加新功能。虽然您可以使用其他工具构建原生模块,但我们认为使用 Expo Modules API 使构建和维护几乎所有类型的 React Native 模块变得尽可能简单。我们认为,Expo Modules API 是大多数开发者为其应用构建原生模块的最佳选择。
您是否考虑主要使用 C++ 编写模块?
如果您打算主要使用 C++ 编写一个原生模块,您可能想探索 React Native 提供的 Turbo Modules API。
使用 Expo Modules API
Expo 提供的用于开发原生模块的 API 和工具的概述。
一个关于使用 Expo Modules API 创建持久设置的原生模块的教程。
一个关于使用 Expo Modules API 创建渲染原生 WebView 组件的原生视图的教程。
创建本地模块
如果您打算在单个应用中使用您的原生模块(您可以稍后更改主意),我们建议 使用 "本地" Expo 模块 来编写自定义原生代码。本地 Expo 模块的功能类似于库开发人员和 Expo SDK 中使用的 Expo Modules,如 expo-camera,但它们不会发布到 npm。相反,您可以在项目中直接创建它们。
创建本地模块将在项目的 modules 目录中搭建一个 Swift 和 Kotlin 模块,这些模块会自动链接到您的应用。
- npx create-expo-module@latest --local- npx expo run在多个应用中共享模块
如果您打算在多个应用中使用您的原生模块,则使用 npx create-expo-module@latest,不需要添加 --local 标志,并创建一个独立模块。您可以将您的包发布到 npm,或者您可以将其放在您的 monorepo 的 packages 目录中(如果有的话),以 类似于本地模块的方式使用它。
使用连续原生生成(CNG)时的考虑事项
在使用 CNG 时,以下建议最为重要,但即使您不使用它也非常好。
在本地构建以获得最佳调试体验和快速反馈
默认情况下,使用 create-expo-app 创建的 Expo 项目使用 CNG,并且在您运行 npx expo prebuild 命令前不包含 android 或 ios 原生目录。使用 CNG 时,开发人员通常不会将 android 和 ios 目录提交到源代码控制中,也不会在本地生成它们,因为 EAS Build 会在构建过程中自动完成。也就是说,在编写自定义原生代码时,生成原生目录并使用 npx expo run 在本地构建是很常见的,以便快速反馈循环和完全访问 Android Studio / Xcode 中的原生调试工具。
使用配置插件进行原生项目配置
如果您的原生代码需要您对项目配置进行更改,例如修改项目的 AndroidManifest.xml 或 Info.plist,您应通过配置插件应用这些更改,而不是直接修改 android 和 ios 目录中的文件。请记住,直接对原生项目目录所做的更改将在您使用 CNG 时的下次运行 prebuild 时丢失。