Клиентские SDK Firebase Data Connect позволяют вызывать серверные запросы и мутации непосредственно из приложения Firebase. Вы генерируете пользовательский клиентский SDK параллельно с проектированием схем, запросов и мутаций, которые развертываете в сервисе Data Connect . Затем вы интегрируете методы из этого SDK в свою клиентскую логику.
Как мы уже упоминали ранее, важно отметить, что запросы и мутации Data Connect не отправляются клиентским кодом и не выполняются на сервере. Вместо этого, при развертывании операции Data Connect хранятся на сервере, как и в Cloud Functions. Это означает, что вам необходимо развернуть соответствующие изменения на стороне клиента, чтобы избежать проблем с существующими пользователями (например, в старых версиях приложения).
Именно поэтому Data Connect предоставляет вам среду разработки и инструменты, позволяющие создавать прототипы развернутых на сервере схем, запросов и мутаций. Кроме того, он автоматически генерирует SDK для клиентской части во время создания прототипов.
После внесения изменений в ваши сервисные и клиентские приложения, обновления как на стороне сервера, так и на стороне клиента готовы к развертыванию.
Каков рабочий процесс разработки клиентской части?
Если вы следовали инструкциям в разделе «Начало работы» , вы познакомились с общим процессом разработки Data Connect . В этом руководстве вы найдете более подробную информацию о создании веб-SDK на основе вашей схемы, а также о работе с клиентскими запросами и мутациями.
Вкратце, для использования сгенерированных веб-SDK в клиентских приложениях необходимо выполнить следующие предварительные шаги:
- Добавьте Firebase в свое веб- приложение.
Затем:
- Разработайте схему вашего приложения.
- Инициализируйте клиентский код с помощью JavaScript SDK , библиотек React или Angular .
- Для React и Angular установите пакеты Tanstack Query.
Настройка генерации SDK:
- С помощью кнопки «Добавить SDK в приложение» в нашем расширении Data Connect для VS Code.
- Обновите файл
connector.yamlдля JavaScript SDK , React или Angular .
Импортируйте библиотеки и сгенерированный код с помощью JavaScript SDK , React или Angular .
Реализуйте вызовы запросов и мутаций с помощью JavaScript SDK , React или Angular .
Для тестирования настройте эмулятор Data Connect с использованием JavaScript SDK , React или Angular .
Реализуйте клиентский код с помощью Firebase JavaScript SDK.
В этом разделе рассматривается, как реализовать клиентскую часть с использованием Firebase JavaScript SDK.
Если вы используете React или Angular, ознакомьтесь с альтернативными инструкциями по настройке и ссылками на дополнительную документацию по генерации SDK Data Connect для фреймворков .
Инициализируйте ваше приложение.
Сначала инициализируйте приложение, используя стандартную последовательность действий 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 можно генерировать SDK для Data Connect в процессах сборки CI/CD.
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.
Сгенерированный код уже будет содержать предопределенные ссылки на запросы (Query Refs). Все, что вам нужно сделать, это импортировать их и вызвать метод execute.
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 с хуками для React и Angular, использующий библиотеки, доступные у наших партнеров из Invertase, TanStack Query и Firebase .
Эта библиотека предоставляет набор хуков, которые значительно упрощают обработку асинхронных задач с помощью 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
Угловой
ng add @angular/fire
Сгенерируйте свой SDK для React или Angular.
Как и в случае со стандартным веб-SDK, описанным ранее , инструменты Firebase обеспечивают автоматическую генерацию SDK на основе вашей схемы и операций.
Если вы только что добавили React или Angular в свой проект, повторно запустите firebase init dataconnect:sdk , чтобы перенастроить сгенерированные SDK и включить дополнительные привязки фреймворка.
Импорт библиотек
Для инициализации клиентского кода React или Angular необходимы четыре набора импортов: общие импорты Data Connect , общие импорты TanStack и специфические импорты для SDK, сгенерированных вашим JavaScript и React.
Обратите внимание на тип 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";
Угловой
// 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.
В следующем фрагменте кода обратите внимание на метод useListAllMovies с префиксом use для React и метод injectListAllMovies inject префиксом injectListAllMovies для Angular, оба из сгенерированного SDK.
Реакции
Все подобные операции в сгенерированном SDK, как запросы, так и изменения, вызывают привязки TanStackQuery:
- Запросы вызывают и возвращают обработчик
useDataConnectQueryобъекта `TanStack`. - Мутации вызывают и возвращают обработчик
useDataConnectMutationобъекта `TanStack`.
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>
}
Угловой
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 });
}
}
Угловой
// 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 в сгенерированный вами хук, следующим образом:
Реакции
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);
...
}
Угловой
// 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 они представлены следующим образом.
| Тип подключения данных | Машинопись |
|---|---|
| Отметка времени | нить |
| Дата | нить |
| UUID | нить |
| Int64 | нить |
| Двойной | Число |
| Плавать | Число |
Обновляйте SDK во время прототипирования.
Если у вас установлено расширение Data Connect для VS Code, оно всегда будет поддерживать сгенерированные SDK в актуальном состоянии.
Если вы не используете расширение Data Connect для VS Code, вы можете использовать Firebase CLI для обновления сгенерированных SDK.
firebase dataconnect:sdk:generate --watchГенерация SDK в конвейерах сборки
С помощью Firebase CLI можно генерировать SDK для Data Connect в процессах сборки CI/CD.
firebase dataconnect:sdk:generate