Firebase Data Connect 用戶端 SDK 可讓您直接從 Firebase 應用程式呼叫伺服器端查詢和變動。設計要部署至 Data Connect 服務的結構定義、查詢和變動時,您可以平行產生自訂用戶端 SDK。然後將這個 SDK 的方法整合至用戶端邏輯。
如我們在其他地方所述,請務必注意,Data Connect 查詢和突變不會由用戶端程式碼提交,而是在伺服器上執行。而是部署後,Data Connect 作業會儲存在伺服器上,例如 Cloud Functions。也就是說,您需要部署對應的用戶端變更,避免現有使用者 (例如使用舊版應用程式的使用者) 發生問題。
因此 Data Connect 提供開發人員環境和工具,方便您製作伺服器部署的結構定義、查詢和變動原型。此外,在您製作原型時,系統也會自動產生用戶端 SDK。
完成服務和用戶端應用程式的更新疊代後,即可部署伺服器端和用戶端更新。
什麼是客戶開發工作流程?
如果您已按照「開始使用」一文的說明操作,應該已瞭解 Data Connect 的整體開發流程。本指南將詳細說明如何從結構定義產生 Web SDK,以及如何處理用戶端查詢和變動。
總而言之,如要在用戶端應用程式中使用產生的 Web SDK,請按照下列必要步驟操作:
- 將 Firebase 新增至網頁應用程式。
接著:
- 開發應用程式結構定義。
- 使用 JavaScript SDK、React 或 Angular 程式庫初始化用戶端程式碼。
- 如果是 React 和 Angular,請安裝 Tanstack Query 套件。
設定 SDK 產生作業:
- 使用 Data Connect VS Code 擴充功能的「Add SDK to app」(在應用程式中加入 SDK) 按鈕
- 更新 JavaScript SDK 的
connector.yaml
,或是 React 或 Angular。
使用 JavaScript SDK 匯入程式庫和產生的程式碼,或使用 React 或 Angular。
使用 JavaScript SDK、React 或 Angular 實作查詢和變動的呼叫。
使用 JavaScript SDK、React 或 Angular 設定 Data Connect 模擬器,進行測試。
使用 Firebase JavaScript SDK 實作用戶端程式碼
本節說明如何使用 Firebase JavaScript SDK 實作用戶端。
如果您使用 React 或 Angular,請參閱替代設定操作說明,以及為架構產生 Data Connect SDK 的其他說明文件連結。
初始化應用程式
首先,請使用標準 Firebase 序列初始化應用程式。
initializeApp({...});
安裝產生的 JavaScript SDK
使用 Firebase CLI 在應用程式中設定產生的 SDK。Data Connectinit
指令應會偵測目前資料夾中的所有應用程式,並自動安裝產生的 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
您可以在 CI/CD 建構程序中使用 Firebase CLI,產生 Data Connect SDK。
firebase dataconnect:sdk:generate
匯入程式庫
如要初始化用戶端程式碼,需要兩組匯入項目:一般 Data Connect 匯入項目和特定的產生 SDK 匯入項目。
請注意一般匯入作業中包含的 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 查詢存取。
隨著應用程式設計變更,您可能會新增支援的列舉值。舉例來說,假設您在應用程式生命週期的稍後階段,決定將 FULLSCREEN 值新增至 AspectRatio
列舉。
在 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 會產生 SDK,並使用合作夥伴 Invertase 提供的程式庫,為 React 和 Angular 提供掛鉤,TanStack Query Firebase。
這個程式庫提供一組 Hook,可大幅簡化應用程式中 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
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 匯入的特定項目。
請注意一般匯入作業中包含的 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 '@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 的方法。
在下列程式碼片段中,請注意 React 的 use
前置方法 useListAllMovies
和 Angular 的 inject
前置方法 injectListAllMovies
,兩者都來自產生的 SDK。
回應
在產生的 SDK 中,所有這類作業 (包括查詢和突變) 都會呼叫 TanStackQuery 繫結:
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 自動重新載入查詢
您可以設定查詢,在資料變更時自動重新載入。
回應
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 例項傳遞至產生的 Hook,如下所示:
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 中會以以下方式表示。
資料連結類型 | TypeScript |
---|---|
時間戳記 | 字串 |
日期 | 字串 |
UUID | 字串 |
Int64 | 字串 |
雙人床 | 數字 |
浮點值 | 數字 |
在原型設計期間更新 SDK
如果您已安裝 Data Connect VS Code 擴充功能,系統一律會將產生的 SDK 維持在最新狀態。
如果您未使用 Data Connect VS Code 擴充功能,可以透過 Firebase CLI 讓產生的 SDK 維持最新狀態。
firebase dataconnect:sdk:generate --watch
在建構管道中產生 SDK
您可以在 CI/CD 建構程序中使用 Firebase CLI,產生 Data Connect SDK。
firebase dataconnect:sdk:generate