Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリと ミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するのと 並行して、カスタム クライアント SDK を生成します。 Data Connect次に、この SDK のメソッドをクライアント ロジックに統合します。
他の場所でも説明したように、Data Connect クエリとミューテーションはクライアントコードによって送信され、 サーバーで実行されるわけではないことに注意してください。デプロイすると、Data Connect オペレーションは Cloud Functions のようにサーバーに保存されます。つまり、既存のユーザー(古いアプリのバージョンなど)に影響を与えないようにするには、対応するクライアント サイドの変更をデプロイする必要があります。
そのため、Data Connect には、サーバーにデプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できる開発環境と ツールが用意されています。 また、プロトタイプ作成時にクライアントサイド SDK が自動的に生成されます。
サービスとクライアント アプリの更新を繰り返したら、サーバーサイドとクライアントサイドの両方の更新をデプロイできます。
Firebase JavaScript SDK を使用してクライアント コードを実装する
このセクションでは、Firebase JavaScript SDK を使用してクライアントを実装する方法について説明します。
React または Angular を使用している場合は、フレームワーク用の 生成Data Connect SDK に関する代替設定手順と 追加ドキュメントへのリンクをご覧ください。
アプリを初期化する
まず、 標準の Firebase シーケンスを使用してアプリを初期化します。
initializeApp({...});
生成された JavaScript SDK をインストールする
Firebase CLI を使用して、アプリに Data Connect で生成された SDK を設定します。
init コマンドは、現在のフォルダ内のすべてのアプリを検出し、生成された SDK を自動的にインストールします。
firebase init dataconnect:sdk
アプリを Data Connect サービスに接続します。
import { connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';
const dataConnect = getDataConnect(connectorConfig);
// [Optionally] Configure the SDK to use Data Connect local emulator.
connectDataConnectEmulator(dataConnect, 'localhost', 9399);
プロトタイプ作成中に SDK を更新する
Data Connect VS Code 拡張機能をインストールしている場合は、生成された SDK が常に最新の状態に保たれます。
Data Connect VS Code 拡張機能を使用しない場合は、Firebase CLI を使用して、生成された SDK を最新の状態に保つことができます。
firebase dataconnect:sdk:generate --watchビルド パイプラインで SDK を生成する
Firebase CLI を使用して、CI/CD ビルドプロセスで Data Connect SDK を生成できます。
firebase dataconnect:sdk:generateライブラリをインポートする
クライアント コードを初期化するには、一般的な 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 '@dataconnect/generated';
JavaScript SDK のクエリを使用する
生成されたコードには、事前定義されたクエリ参照がすでに含まれています。インポートして実行するだけで済みます。
import { executeQuery } from 'firebase/data-connect';
import { listMoviesRef } from '@dataconnect/generated';
const ref = listMoviesRef();
const { data } = await executeQuery(ref);
console.log(data.movies);
SDK クエリ メソッドを呼び出す
これらのアクション ショートカット関数を使用する例を次に示します。
import { listMovies } from '@dataconnect/generated';
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`
列挙フィールドの変更を処理する
アプリのスキーマには、列挙型を含めることができます。 これは、GraphQL クエリでアクセスできます。
アプリのデザインが変更されると、列挙型でサポートされる新しい値を追加することがあります。たとえば、アプリケーションのライフサイクルの後半で、AspectRatio 列挙型に FULLSCREEN 値を追加するとします。
Data Connect ワークフローでは、ローカル開発ツールを使用して クエリと SDK を更新できます。
ただし、クライアントの更新バージョンをリリースする前に、デプロイ済みの古いクライアントが破損する可能性があります。
復元力のある実装例
列挙値に対する switch ステートメントに常に default ブランチを追加するか、
列挙値と比較する if/else if ブロックに else ブランチを追加します。
これは JavaScript/TypeScript 言語では強制されませんが、新しい列挙値が追加された場合にクライアント コードを堅牢にする方法です。
const queryResult = await getOldestMovie();
if (queryResult.data) {
// we can use a switch statement's "default" case to check for unexpected values
const oldestMovieAspectRatio = queryResult.data.originalAspectRatio;
switch (oldestMovieAspectRatio) {
case AspectRatio.ACADEMY:
case AspectRatio.WIDESCREEN:
case AspectRatio.ANAMORPHIC:
console.log('This movie was filmed in Academy, widescreen or anamorphic aspect ratio!');
break;
default:
// the default case will catch FULLSCREEN, UNAVAILABLE or _UNKNOWN
// it will also catch unexpected values the SDK isn't aware of, such as CINEMASCOPE
console.log('This movie was was NOT filmed in Academy, widescreen or anamorphic.');
break;
}
// alternatively, we can check to see if the returned enum value is a known value
if (!Object.values(AspectRatio).includes(oldestMovieAspectRatio)) {
console.log(`Unrecognized aspect ratio: ${oldestAspectRatio}`);
}
} else {
console.log("no movies found!");
}
JavaScript SDK のミューテーションを使用する
ミューテーションには、クエリと同じ方法でアクセスできます。
import { executeMutation } from 'firebase/data-connect';
import { createMovieRef } from '@dataconnect/generated';
const { data } = await executeMutation(createMovieRef({ movie: 'Empire Strikes Back' }));
Data Connect エミュレータに接続する
必要に応じて、
connectDataConnectEmulator を呼び出してエミュレータに接続し、次のように Data Connect
インスタンスを渡すことができます。
import { connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';
const dataConnect = getDataConnect(connectorConfig);
connectDataConnectEmulator(dataConnect, 'localhost', 9399);`
// Make calls from your app
本番環境リソースに切り替えるには、エミュレータに接続するための行をコメントアウトします。
React と Angular のクライアント コードを実装する
Firebase Data Connect は、Invertase のパートナーである TanStack Query Firebase のライブラリを使用して、React と Angular のフックを含む生成済み SDK を提供します。
このライブラリは、アプリケーションで Firebase を使用した非同期タスクの処理を大幅に簡素化するフックのセットを提供します。
アプリを初期化する
まず、他の Firebase ウェブアプリと同様に、 標準の Firebase シーケンスを使用してアプリを初期化します。
initializeApp({...});
TanStack Query Firebase パッケージをインストールする
プロジェクトに TanStack Query のパッケージをインストールします。
React
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
Angular
ng add @angular/fire
React または Angular SDK を生成する
前述のように、標準のウェブ SDK と同様に、Firebase ツールはスキーマとオペレーションに基づいて SDK の自動生成を処理します。
プロジェクトに React または Angular を追加した場合は、firebase init dataconnect:sdk を再実行して、追加のフレームワーク バインディングを含めるように生成された SDK を再構成します。
ライブラリをインポートする
React または Angular クライアント コードを初期化するには、一般的な Data Connect インポート、一般的な TanStack インポート、 JS と React で生成された SDK の特定のインポートの 4 つのインポート セットが必要です。
一般的なインポートに含まれる ConnectorConfig 型に注意してください。
React
// 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 '@dataconnect/generated';
// generated React hooks from SDK
import { useListAllMovies, useCreateMovie } from "@dataconnect/generated/react";
Angular
// general imports
import { ConnectorConfig, DataConnect, getDataConnect, QueryRef, MutationRef, QueryPromise, MutationPromise } from 'firebase/data-connect';
// TanStack Query-related functions
import { provideTanStackQuery, QueryClient } from "@tanstack/angular-query-experimental";
// generated queries and mutations from SDK
import { ListMoviesResponse, connectorConfig } from '@dataconnect/generated';
// generated React hooks from SDK
import { injectListAllMovies, injectCreateMovie } from "@dataconnect/generated/angular";
React または Angular クライアントでクエリとミューテーションを使用する
設定が完了したら、生成された SDK のメソッドを組み込むことができます。
次のスニペットでは、生成された SDK の React 用の use 接頭辞付きメソッド useListAllMovies と、Angular 用の inject 接頭辞付きメソッド injectListAllMovies に注目してください。
React
生成された SDK のこのようなオペレーション(クエリとミューテーションの両方)は、TanStackQuery バインディングを呼び出します。
- クエリはTanStack
useDataConnectQueryフックを呼び出して返します。 - ミューテーションは TanStack
useDataConnectMutationフック を呼び出して返します。
import { useListAllMovies } from '@dataconnect/generated/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>
}
Angular
import { injectAllMovies, connectorConfig } from '@dataconnect/generated/angular';
import { provideDataConnect, getDataConnect } from '@angular/fire/data-connect';
import { provideTanStackQuery, QueryClient } from "@tanstack/angular-query-experimental";
const queryClient = new QueryClient();
...
providers: [
...
provideTanStackQuery(queryClient),
provideDataConnect(() => {
const dc = getDataConnect(connectorConfig);
return dc;
})
]
React と Angular で自動再読み込みクエリを使用する
データの変更時にクエリが自動的に再読み込みされるように構成できます。
React
export class MovieListComponent {
movies = useListAllMovies();
}
export class AddPostComponent {
const mutation = useCreateMovie({ invalidate: [listAllMoviesRef()] });
addMovie() {
// The following will automatically cause Tanstack to reload its listAllMovies query
mutation.mutate({ title: 'The Matrix });
}
}
Angular
// class
export class MovieListComponent {
movies = injectListAllMovies();
}
// template
@if (movies.isPending()) {
Loading...
}
@if (movies.error()) {
An error has occurred: {{ movies.error() }}
}
@if (movies.data(); as data) {
@for (movie of data.movies; track movie.id) {
<mat-card appearance="outlined">
<mat-card-content>{{movie.description}}</mat-card-content>
</mat-card>
} @empty {
<h2>No items!</h2>
}
}
Data Connect エミュレータに接続する
必要に応じて、
connectDataConnectEmulator を呼び出してエミュレータに接続し、次のように生成されたフックに Data Connect
インスタンスを渡すことができます。
React
import { getDataConnect, connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';
import { useListAllMovies } from '@dataconnect/generated/react';
const dc = getDataConnect(connectorConfig);
connectDataConnectEmulator(dc, 'localhost', 9399);
class AppComponent() {
...
const { isLoading, data, error } = useListAllMovies(dc);
...
}
Angular
// app.config.ts
import { provideDataConnect } from '@angular/fire/data-connect';
import { getDataConnect, connectDataConnectEmulator } from 'firebase/data-connect';
provideDataConnect(() => {
const dc = getDataConnect(connectorConfig);
connectDataConnectEmulator(dc, 'localhost', 9399);
return dc;
}),
本番環境リソースに切り替えるには、エミュレータに接続するための行をコメントアウトします。
SDK のデータ型
Data Connect サーバーは、一般的な GraphQL データ型を表します。これらは SDK で次のように表されます。
| Data Connect 型 | TypeScript |
|---|---|
| タイムスタンプ | 文字列 |
| 日付 | 文字列 |
| UUID | 文字列 |
| Int64 | 文字列 |
| Double | 数値 |
| Float | 数値 |
プロトタイプ作成中に SDK を更新する
Data Connect VS Code 拡張機能をインストールしている場合は、生成された SDK が常に最新の状態に保たれます。
Data Connect VS Code 拡張機能を使用しない場合は、Firebase CLI を使用して、生成された SDK を最新の状態に保つことができます。
firebase dataconnect:sdk:generate --watchビルド パイプラインで SDK を生成する
Firebase CLI を使用して、CI/CD ビルドプロセスで Data Connect SDK を生成できます。
firebase dataconnect:sdk:generate