为你的模块创建一个库
React Native 拥有丰富的生态系统库来解决常见问题。我们在 reactnative.directory 网站收集 React Native 库,这是每位 React Native 开发者都值得收藏的绝佳资源。
有时,你可能正在开发一个值得提取为独立库以便复用的模块。这可能是一个你想在所有应用中复用的库,一个你想作为开源组件分发到生态系统的库,甚至是一个你想出售的库。
在本指南中,你将学习:
- 如何将模块提取为库
- 如何使用 NPM 分发库
将模块提取为库
你可以使用 create-react-native-library 工具来创建一个新库。此工具会设置一个包含所有所需样板代码的新库:所有配置文件以及各种平台所需的所有文件。它还带有一个友好的交互式菜单来指导你完成库的创建。
要将模块提取为独立的库,你可以遵循以下步骤:
- 创建新库
- 将代码从 App 移动到库
- 更新代码以反映新结构
- 发布它。
1. 创建库
- 运行以下命令开始创建过程:
npx create-react-native-library@latest <Name of Your Library>
- 为你的模块添加一个名称。它必须是有效的 npm 名称,所以应该全小写。你可以使用
-来分隔单词。 - 为 package 添加描述。
- 继续填写表单,直到遇到问题 "你想开发什么类型的库?"

- 为了本指南的目的,选择 Turbo module 选项。注意你可以为新架构和旧架构创建库。
- 然后,你可以选择是想要一个访问平台的库(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. 从你的 App 复制代码
本指南的其余部分假设你在你的应用中有一个本地 Turbo Native Module,它是按照网站其他指南中显示的准则创建的:平台特定的 Turbo Native Modules,或 跨平台 Turbo Native Modules。但它也适用于 Components 和旧架构模块及组件。你将需要调整你需要复制和更新的文件。
- [旧架构模块和组件不需要] 将你在应用的
specs文件夹中的代码移动到由create-react-native-library文件夹创建的src文件夹中。 - 更新
index.ts文件以正确导出 Turbo Native Module spec,以便可以从库中访问。例如:
import NativeSampleModule from './NativeSampleModule';
export default NativeSampleModule;
-
复制原生模块:
- 用你在应用中为原生模块编写的代码(如果有)替换
android/src/main/java/com/<name-of-the-module>中的代码。 - 用你在应用中为原生模块编写的代码(如果有)替换
ios文件夹中的代码。 - 用你在应用中为原生模块编写的代码(如果有)替换
cpp文件夹中的代码。
- 用你在应用中为原生模块编写的代码(如果有)替换
-
[旧架构模块和组件不需要] 更新所有从前一个 spec 名称到新 spec 名称的引用,即在库的
package.json的codegenConfig字段中定义的那个。例如,如果在应用的package.json中你将codegenConfig.name设置为AppSpecs,而在库中它被称为RNNativeSampleModuleSpec,你必须将每次出现的AppSpecs替换为RNNativeSampleModuleSpec。
就是这样!你已经将所有必需的代码从你的应用中移动到了一个独立的库中。
测试你的库
create-react-native-library 带有一个有用的示例应用,它已经配置好可以与库正常工作。这是测试它的好方法!
如果你查看 example 文件夹,你可以找到与你可以从 react-native-community/template 创建的新 React Native 应用相同的结构。
要测试你的库:
- 导航到
example文件夹。 - 运行
yarn install安装所有依赖。 - 仅对于 iOS,你需要安装 CocoaPods:
cd ios && pod install。 - 从
example文件夹使用yarn android构建并运行 Android。 - 从
example文件夹使用yarn ios构建并运行 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 配置
* https://reactnative.dev/docs/metro
*
* @type {import('metro-config').MetroConfig}
*/
+ const path = require('path');
- const config = {}
+ const config = {
+ // 让 Metro 能够解析所需的外部依赖
+ 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 中的代码:如果没有额外的 resolver,库中的导入将失败。
此时,你可以像往常一样构建并运行你的应用:
- 从
example文件夹使用yarn android构建并运行 Android。 - 从
example文件夹使用yarn ios构建并运行 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(推荐)或者如果你没有使用 Ruby 的 Bundler 则运行 pod install(不推荐)。
恭喜!你发布了你的第一个 React Native 库。