モジュールのためのライブラリを作成する
React Nativeには、一般的な問題を解決するための豊富なライブラリのエコシステムがあります。React Nativeのライブラリはreactnative.directoryウェブサイトにまとめられており、これはすべての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++)が必要かを選択できます。
- 最後に、最後のオプションとして
テストアプリ
を選択します。このオプションは、ライブラリフォルダー内にすでに構成されている個別のアプリを使用してライブラリを作成します。
インタラクティブなプロンプトが完了すると、このツールは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モジュール、またはクロスプラットフォームのTurbo Nativeモジュール)に示されているガイドラインに従って、アプリにローカルのTurbo Nativeモジュールがあることを前提としています。ただし、コンポーネントとレガシーアーキテクチャのモジュールとコンポーネントでも機能します。コピーして更新する必要があるファイルを調整する必要があります。
- [レガシーアーキテクチャのモジュールとコンポーネントには不要] アプリの
specs
フォルダーにあるコードを、create-react-native-library
フォルダーで作成されたsrc
フォルダーに移動します。 - ライブラリからアクセスできるように、Turbo Nativeモジュール仕様を適切にエクスポートするように
index.ts
ファイルを更新します。例:
import NativeSampleModule from './NativeSampleModule';
export default NativeSampleModule;
-
ネイティブモジュールをコピーする
android/src/main/java/com/<モジュール名>
内のコードを、ネイティブモジュールのアプリで記述したコード(存在する場合)に置き換えます。ios
フォルダー内のコードを、ネイティブモジュールのアプリで記述したコード(存在する場合)に置き換えます。cpp
フォルダー内のコードを、ネイティブモジュールのアプリで記述したコード(存在する場合)に置き換えます。
-
[レガシーアーキテクチャのモジュールとコンポーネントには不要]以前の仕様名から新しい仕様名(ライブラリの
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 configuration
* https://reactnative.dokyumento.jp/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に追加のパス(この場合は、必要なsrc/index
ファイルを含む../Library
パス)でファイルと変更を監視するように指示します。resolver
プロパティは、アプリで使用されるReact Nativeコードをライブラリにフィードするために必要です。ライブラリはReact Nativeからコードを参照およびインポートする場合があります。追加のリゾルバーがないと、ライブラリ内のインポートは失敗します。
この時点で、通常どおりにアプリをビルドして実行できます。
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のみ、ネイティブコードを含む新しいモジュールをインストールするたびに、bundle exec pod install
(推奨)またはRubyのBundlerを使用していない場合はpod install
(非推奨)を実行してCocoaPodsを再インストールする必要があります。
おめでとうございます!最初のReact Nativeライブラリを公開しました。