Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリとミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するときに、カスタム クライアント SDK を並行して生成します。次に、この SDK のメソッドをクライアント ロジックに統合します。
他の場所でも説明しましたが、Data Connect クエリとミューテーションはクライアント コードによって送信されず、サーバーで実行されることに注意してください。代わりに、デプロイ時に Data Connect オペレーションは Cloud Functions のようにサーバーに保存されます。つまり、既存のユーザー(古いアプリ バージョンなど)に影響しないように、対応するクライアントサイドの変更をデプロイする必要があります。
そのため、Data Connect には、サーバー デプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できるデベロッパー環境とツールが用意されています。また、プロトタイプ作成中にクライアントサイド SDK も自動的に生成されます。
サービス アプリとクライアント アプリの更新を反復処理したら、サーバーサイドとクライアントサイドの両方の更新をデプロイする準備が整います。
Firebase JavaScript SDK を使用してクライアント コードを実装する
このセクションでは、Firebase JavaScript SDK を使用してクライアントを実装する方法について説明します。
React を使用している場合は、Data Connect 用の React SDK の生成に関する代替のセットアップ手順と追加のドキュメントへのリンクをご覧ください。
アプリを初期化する
まず、標準の Firebase シーケンスを使用してアプリを初期化します。
initializeApp({...});
JavaScript SDK を生成する
ほとんどの Firebase プロジェクトと同様に、Firebase Data Connect クライアント コードの作業はローカル プロジェクト ディレクトリで行います。Data Connect VS Code 拡張機能と Firebase CLI はどちらも、クライアント コードの生成と管理に重要なローカル ツールです。
SDK 生成オプションは、プロジェクトの初期化時に生成された dataconnect.yaml
ファイル内の複数のエントリにキーされています。
SDK 生成を初期化する
connector.yaml
に outputDir
、package
、(ウェブ SDK の場合は)packageJsonDir
を追加します。generate:
javascriptSdk:
outputDir: "../movies-generated"
package: "@movie-app/movies"
packageJsonDir: "../../"
outputDir
には、生成された SDK の出力先を指定します。
package
にはパッケージ名を指定します。
packageJsonDir
は、パッケージをインストールする場所を指定します。
この場合は、firebase@latest
をインストールして、このピア依存関係が確実に満たされるようにします。
JavaScript SDK を初期化する
Data Connect の設定に使用した情報を使用して Data Connect インスタンスを初期化します(すべて Firebase コンソールの [Data Connect] タブで確認できます)。
ConnectorConfig オブジェクト
SDK にはコネクタ構成オブジェクトが必要です。
このオブジェクトは、dataconnect.yaml
の serviceId
と location
、connector.yaml
の connectorId
から自動的に生成されます。
ライブラリをインポートする
クライアント コードを初期化するには、一般的な Data Connect インポートと、生成された特定の SDK インポートの 2 つのインポート セットが必要です。
一般的なインポートに含まれる ConnectorConfig
オブジェクトに注目してください。
// general imports
import { ConnectorConfig, DataConnect, getDataConnect, QueryRef, MutationRef, QueryPromise, MutationPromise } from 'firebase/data-connect';
// generated queries and mutations from SDK
import { listMovies, ListMoviesResponse, createMovie, connectorConfig } from '@myorg/myconnector';
JavaScript SDK のクエリを使用する
生成されたコードには、事前定義されたクエリ参照がすでに含まれています。インポートして execute を呼び出すだけで使用できます。
import { executeQuery } from 'firebase/data-connect';
import { listMoviesRef } from '@movie-app/movies';
const ref = listMoviesRef();
const { data } = await executeQuery(ref);
console.log(data.movies);
SDK クエリ メソッドを呼び出す
これらのアクション ショートカット関数を使用した例を次に示します。
import { listMovies } from '@movie-app/movies';
function onBtnClick() {
// This will call the generated JS from the CLI and then make an HTTP request out // to the server.
listMovies().then(data => showInUI(data)); // == executeQuery(listMoviesRef);
}
変更をサブスクライブする
変更をサブスクライブできます(クエリを実行するたびに更新されます)。
const listRef = listAllMoviesRef();
// subscribe will immediately invoke the query if no execute was called on it previously.
subscribe(listRef, ({ data }) => {
updateUIWithMovies(data.movies);
});
await createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi", rating: 5 });\
await listMovies(); // will update the subscription above`
JavaScript SDK のミューテーションを使用する
ミューテーションには、クエリと同じ方法でアクセスできます。
import { executeMutation } from 'firebase/data-connect';
import { createMovieRef } from '@movie-app/movies';
const { data } = await executeMutation(createMovieRef({ movie: 'Empire Strikes Back' }));
Data Connect エミュレータに接続する
必要に応じて、connectDataConnectEmulator
を呼び出して Data Connect インスタンスを渡すことで、エミュレータに接続できます。次に例を示します。
import { connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@myorg/myconnector'; // Replace with your package name
const dataConnect = getDataConnect(connectorConfig);
connectDataConnectEmulator(dataConnect, 'localhost', 9399);`
// Make calls from your app
本番環境リソースに切り替えるには、エミュレータに接続する行をコメント化します。
React のクライアント コードを実装する
Firebase Data Connect は、Firebase のパートナーである Invertase の TanStack Query Firebase ライブラリを使用して、React 用のフックが生成された SDK を提供します。
このライブラリには、アプリで Firebase を使用して非同期タスクを簡単に処理できる一連のフックが用意されています。
アプリを初期化する
まず、他の Firebase ウェブアプリと同様に、標準の Firebase シーケンスを使用してアプリを初期化します。
initializeApp({...});
TanStack Query Firebase パッケージをインストールする
プロジェクトに TanStack Query のパッケージをインストールします。
npm i --save @tanstack/react-query @tanstack-query-firebase/react
npm i --save firebase@latest # Note: React has a peer dependency on ^11.3.0
React SDK を生成する
前述のとおり、標準のウェブ SDK と同様に、Firebase ツールはスキーマとオペレーションに基づいて SDK の自動生成を処理します。
プロジェクト用の React SDK を生成するには、connector.yaml
構成ファイルに react
キーを追加します。
generate:
javascriptSdk:
react: true
outputDir: "../movies-generated"
package: "@movie-app/movies"
packageJsonDir: "../../"
ライブラリをインポートする
React クライアント コードを初期化するには、一般的な Data Connect インポート、一般的な TanStack インポート、JS と React で生成された SDK の特定のインポートの 4 つのインポート セットが必要です。
一般的なインポートに含まれている ConnectorConfig
型に注意してください。
// general imports
import { ConnectorConfig, DataConnect, getDataConnect, QueryRef, MutationRef, QueryPromise, MutationPromise } from 'firebase/data-connect';
// TanStack Query-related functions
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
// generated queries and mutations from SDK
import { ListMoviesResponse, connectorConfig } from '@myorg/myconnector';
// generated React hooks from SDK
import { useListAllMovies, useCreateMovie } from "@myorg/connector/react";
React クライアントでクエリとミューテーションを使用する
設定が完了したら、生成された React SDK のメソッドを組み込むことができます。
次のスニペットでは、生成された React SDK の use
接頭辞のメソッド useListAllMovies
に注目してください。生成された SDK 内のこのような use
オペレーション(クエリとミューテーションの両方)は、TanStack クエリ バインディングを呼び出します。
- クエリが TanStack
useDataConnectQuery
フックを呼び出して返します。 - ミューテーションは TanStack
useDataConnectMutation
フックを呼び出して返します。
import { useListAllMovies } from '@movies-app/movies/react';
function MyComponent() {
const { isLoading, data, error } = useListAllMovies();
if(isLoading) {
return <div>Loading...</div>
}
if(error) {
return <div> An Error Occurred: {error} </div>
}
}
// App.tsx
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import MyComponent from './my-component';
function App() {
const queryClient = new QueryClient();
return <QueryClientProvider client={queryClient}>
<MyComponent />
</QueryClientProvider>
}
Data Connect エミュレータに接続する
必要に応じて、connectDataConnectEmulator
を呼び出して、生成されたフックに Data Connect インスタンスを渡すことで、エミュレータに接続できます。次に例を示します。
import { getDataConnect, connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@movies-app/movies';
import { useListAllMovies } from '@movies-app/movies/react';
const dc = getDataConnect(connectorConfig);
connectDataConnectEmulator(dc, 'localhost', 9399);
function App() {
...
const { isLoading, data, error } = useListAllMovies(dc);
...
}
本番環境リソースに切り替えるには、エミュレータに接続する行をコメント化します。
SDK のデータ型
Data Connect サーバーは、一般的な GraphQL データ型を表します。これらは SDK で次のように表されます。
Data Connect の種類 | TypeScript |
---|---|
タイムスタンプ | 文字列 |
日付 | 文字列 |
UUID | 文字列 |
Int64 | 文字列 |
Double | 数値 |
浮動小数点数 | 数値 |
SDK 生成に関する特別な考慮事項
node_modules
を基準とするパスを構成する
JavaScript SDK の場合、Data Connect は npm link
を使用して SDK をインストールするため、生成された SDK は node_modules
パスと同じレベルのディレクトリ、または node_modules
にアクセスできる子ディレクトリに出力する必要があります。
つまり、生成された SDK が正しく機能するには、firebase
ノード モジュールにアクセスできる必要があります。
たとえば、node_modules
が my-app/
にある場合、js-email-generated
が親の node_modules
フォルダからインポートできるように、出力ディレクトリは my-app/js-email-generated
にする必要があります。
my-app/
dataconnect/
connector/
connector.yaml
node_modules/
firebase/
js-email-generated/
// connector.yaml
connectorId: "my-connector"
generate:
javascriptSdk:
outputDir: "../../js-email-generated"
package: "@myapp/my-connector"
モジュールがルートでホストされている monorepo がある場合は、出力ディレクトリを monorepo 内の任意のフォルダに配置できます。
my-monorepo/
dataconnect/
connector/
connector.yaml
node_modules/
firebase/
my-app/
js-email-generated/
package.json
// connector.yaml
connectorId: "my-connector"
generate:
javascriptSdk:
outputDir: "../../my-app/js-email-generated" # You can also output to ../../js-email-generated
プロトタイプ作成中に SDK を更新する
Data Connect VS Code 拡張機能とその Data Connect エミュレータを使用してインタラクティブにプロトタイプを作成する場合は、スキーマ、クエリ、ミューテーションを定義する .gql
ファイルを変更するときに、SDK ソースファイルが自動的に生成および更新されます。これは、ホット(再)読み込みワークフローで便利な機能です。
.gql
の更新にウォッチを設定し、SDK ソースを自動的に更新することもできます。
または、CLI を使用して、.gql ファイルが変更されるたびに SDK を再生成することもできます。
firebase dataconnect:sdk:generate --watch
統合と本番環境リリース用の SDK を生成する
CI テストに送信するプロジェクト ソースを準備する場合など、Firebase CLI を呼び出してバッチ更新を行うことができます。
このような場合は、firebase dataconnect:sdk:generate
を使用します。
その他のフレームワークに関する考慮事項
Angular
コードを生成する場合、Angular CLI
は依存関係の最適化コードが原因で新しい変更を検出しません。この問題を解決するには、angular.json
を変更する必要があります。
"projects": {
"myproject": {
"architect": {
"serve:": {
"prebundle": {
"exclude": ["@movie-app/movies"]
}
}
}
}
}