为你的模块创建库
React Native 拥有丰富的库生态系统来解决常见问题。我们在 reactnative.directory 网站上收集了 React Native 库,对于每位 React Native 开发者来说,这是一个非常值得收藏的资源。
有时,你可能正在开发一个值得提取到单独库中以实现代码重用的模块。这个库可以是你想在你所有应用中重用的库,你想作为开源组件分发到生态系统的库,甚至是你想出售的库。
在本指南中,你将学习
- 如何将模块提取到库中
- 如何使用 NPM 分发库
将模块提取到库中
你可以使用 create-react-native-library
工具来创建一个新的库。此工具使用所有必要的样板代码设置一个新的库:所有配置文件和各种平台所需的所有文件。它还带有一个友好的交互式菜单来指导你完成库的创建。
要将模块提取到单独的库中,你可以按照以下步骤操作
- 创建新的库
- 将代码从应用移动到库
- 更新代码以反映新的结构
- 发布它。
1. 创建库
- 通过运行以下命令开始创建过程
npx create-react-native-library@latest <Name of Your Library>
- 为你的模块添加一个名称。它必须是一个有效的 npm 名称,所以它应该是全部小写。你可以使用
-
分隔单词。 - 为软件包添加描述。
- 继续填写表单,直到你看到问题 “你想开发哪种类型的库?”
- 为了本指南的目的,选择 Turbo 模块 选项。请注意,你可以为新架构和旧架构创建库。
- 然后,你可以选择是否需要一个访问平台的库(Kotlin & Objective-C)或一个共享的 C++ 库(用于 Android 和 iOS 的 C++)。
- 最后,选择
Test App
作为最后一个选项。此选项创建一个库,其中包含一个已在库文件夹中配置好的单独应用。
一旦交互式提示完成,该工具将创建一个文件夹,其结构在 Visual Studio Code 中如下所示

随意浏览为你创建的代码。然而,最重要的部分
android
文件夹:这是 Android 代码所在的位置cpp
文件夹:这是 c++ 代码所在的位置ios
文件夹:这是 iOS 代码所在的位置src
文件夹:这是 JS 代码所在的位置。
package.json
已经配置了我们提供给 create-react-native-library
工具的所有信息,包括软件包的名称和描述。请注意,package.json
也已经配置为运行 Codegen。
"codegenConfig": {
"name": "RN<your module name>Spec",
"type": "all",
"jsSrcsDir": "src",
"outputDir": {
"ios": "ios/generated",
"android": "android/generated"
},
"android": {
"javaPackageName": "com.<name-of-the-module>"
}
},
最后,该库已经包含了将库与 iOS 和 Android 链接的所有基础设施。
2. 从你的应用复制代码
本指南的其余部分假设你的应用中有一个本地 Turbo Native Module,它是按照网站上其他指南中所示的准则创建的:平台特定的 Turbo Native Module,或者 跨平台 Turbo Native Module。但它也适用于组件和旧架构模块和组件。你必须调整你需要复制和更新的文件。
- [旧架构模块和组件不需要] 将你在应用
specs
文件夹中的代码移动到create-react-native-library
文件夹创建的src
文件夹中。 - 更新
index.ts
文件以正确导出 Turbo Native Module spec,以便可以从库中访问它。例如
import NativeSampleModule from './NativeSampleModule';
export default NativeSampleModule;
-
复制原生模块
- 将
android/src/main/java/com/<模块名称>
中的代码替换为你为原生模块在应用中编写的代码(如果有)。 - 将
ios
文件夹中的代码替换为你为原生模块在应用中编写的代码(如果有)。 - 将
cpp
文件夹中的代码替换为你为原生模块在应用中编写的代码(如果有)。
- 将
-
[旧架构模块和组件不需要] 更新从之前的 spec 名称到新的 spec 名称的所有引用,新名称在库的
package.json
的codegenConfig
字段中定义。例如,如果在应用package.json
中你将AppSpecs
设置为codegenConfig.name
,而在库中它被称为RNNativeSampleModuleSpec
,你必须将每次出现的AppSpecs
替换为RNNativeSampleModuleSpec
。
就这样!你已将所有必需的代码从你的应用移出并放入一个单独的库中。
测试你的库
create-react-native-library
附带一个有用的示例应用程序,该应用程序已配置为与库正确配合使用。这是测试它的好方法!
如果你查看 example
文件夹,你可以找到与你可以从 react-native-community/template
创建的新 React Native 应用程序相同的结构。
要测试你的库
- 导航到
example
文件夹。 - 运行
yarn install
以安装所有依赖项。 - 仅对于 iOS,你需要安装 CocoaPods:
cd ios && pod install
。 - 使用
yarn android
从example
文件夹构建并运行 Android。 - 使用
yarn ios
从example
文件夹构建并运行 iOS。
将你的库用作本地模块
在某些情况下,你可能希望将你的库用作应用程序的本地模块,而无需将其发布到 NPM。
在这种情况下,你最终可能会遇到你的库与你的应用位于同一级别的情况。
Development
├── App
└── Library
在这种情况下,你也可以使用使用 create-react-native-library
创建的库。
- 通过导航到
App
文件夹并运行yarn add ../Library
将你的库添加到你的应用。 - 仅对于 iOS,导航到
App/ios
文件夹并运行bundle exec pod install
以安装你的依赖项。 - 更新
App.tsx
代码以导入库中的代码。例如
import NativeSampleModule from '../Library/src/index';
如果你现在运行你的应用程序,Metro 将找不到它需要提供给应用程序的 JS 文件。 那是因为 metro 将从 App
文件夹开始运行,并且它将无法访问位于 Library
文件夹中的 JS 文件。 为了解决这个问题,让我们按如下方式更新 metro.config.js
文件
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
/**
* Metro configuration
* https://reactnative.net.cn/docs/metro
*
* @type {import('metro-config').MetroConfig}
*/
+ const path = require('path');
- const config = {}
+ const config = {
+ // Make Metro able to resolve required external dependencies
+ watchFolders: [
+ path.resolve(__dirname, '../Library'),
+ ],
+ resolver: {
+ extraNodeModules: {
+ 'react-native': path.resolve(__dirname, 'node_modules/react-native'),
+ },
+ },
+};
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
watchFolders
配置告诉 Metro 监视一些附加路径中的文件和更改,在本例中是 ../Library
路径,其中包含你需要的 src/index
文件。 resolver
属性是必需的,以便向库提供应用程序使用的 React Native 代码。 该库可能会引用和导入来自 React Native 的代码:如果没有额外的解析器,库中的导入将失败。
此时,你可以像往常一样构建并运行你的应用程序
- 使用
yarn android
从example
文件夹构建并运行 Android。 - 使用
yarn ios
从example
文件夹构建并运行 iOS。
在 NPM 上发布库
由于 create-react-native-library
,在 NPM 上发布所有内容的设置已经到位。
- 在你的模块中安装依赖项
yarn install
。 - 通过运行
yarn prepare
构建库。 - 使用
yarn release
发布它。
稍等片刻,你将在 NPM 上找到你的库。 要验证这一点,请运行
npm view <package.name>
其中 package.name
是你在库初始化期间在 package.json
文件中设置的 name
。
现在,你可以通过运行以下命令在你的应用程序中安装库
yarn add <package.name>
仅对于 iOS,每当你安装带有某些原生代码的新模块时,你都必须重新安装 CocoaPods,通过运行 bundle exec pod install
(推荐)或 pod install
(如果你不使用 Ruby 的 Bundler,则不推荐)。
恭喜!你发布了你的第一个 React Native 库。