ערכות SDK ללקוח של Firebase Data Connect מאפשרות לבצע קריאות לשאילתות ולמוטציות בצד השרת ישירות מאפליקציית Firebase. אתם יוצרים ערכת SDK מותאמת אישית ללקוח במקביל לתכנון הסכימות, השאילתות והמוטציות שאתם פורסים בשירות Data Connect. לאחר מכן, משלבים שיטות מה-SDK הזה לתוך הלוגיקה של הלקוח.
כפי שציינו במקום אחר, חשוב לציין ששאילתות ומוטציות של Data Connect לא נשלחות על ידי קוד הלקוח ומתבצעות בשרת. במקום זאת, כשפורסים פעולות Data Connect, הן מאוחסנות בשרת כמו ב-Cloud Functions. כלומר, צריך לפרוס את השינויים המתאימים בצד הלקוח כדי למנוע שיבושים אצל משתמשים קיימים (לדוגמה, בגרסאות ישנות יותר של האפליקציה).
לכן, Data Connect מספק סביבה למפתחים וכלים שמאפשרים ליצור אב טיפוס של הסכימות, השאילתות והמוטציות שנפרסות בשרת. בנוסף, המערכת יוצרת באופן אוטומטי ערכות SDK בצד הלקוח בזמן יצירת אב טיפוס.
אחרי שסיימתם לבצע עדכונים בשירות ובאפליקציות הלקוח, העדכונים בצד השרת ובצד הלקוח מוכנים לפריסה.
הטמעת קוד לקוח באמצעות ה-SDK של Firebase JavaScript
בקטע הזה נסביר איך מטמיעים לקוחות באמצעות ה-SDK של Firebase JavaScript.
אם אתם משתמשים ב-React, תוכלו לעיין בהוראות הגדרה חלופיות ובקישורים למסמכי עזרה נוספים בנושא יצירת ערכות SDK של React ל-Data Connect.
איך מפעילים את האפליקציה
קודם כול, צריך לאתחל את האפליקציה באמצעות הרצף הרגיל של Firebase.
initializeApp({...});
יצירת ה-SDK ל-JavaScript
כמו ברוב הפרויקטים ב-Firebase, העבודה על קוד הלקוח של Firebase Data Connect מתבצעת בספריית פרויקט מקומית. גם התוסף של Data Connect ל-VS Code וגם ה-CLI של Firebase הם כלים מקומיים חשובים ליצירה ולניהול של קוד לקוח.
אפשרויות היצירה של ה-SDK ממופות למספר רשומות בקובץ dataconnect.yaml
שנוצר כשאתם מאתחלים את הפרויקט.
אתחול היצירה של ה-SDK
ב-connector.yaml
, מוסיפים את outputDir
, את package
ואת packageJsonDir
(ל-SDK לאינטרנט).
generate:
javascriptSdk:
outputDir: "../movies-generated"
package: "@movie-app/movies"
packageJsonDir: "../../"
outputDir
מציין לאן צריך להוציא את ה-SDK שנוצר.
package
מציין את שם החבילה.
packageJsonDir
מציין איפה להתקין את החבילה.
במקרה כזה, צריך להתקין את firebase@latest
כדי לוודא שהתלות הזו בצד השני מתקיימת.
אתחול ה-JavaScript SDK
מאתחלים את המכונה של Data Connect באמצעות המידע ששימש להגדרת Data Connect (הכול זמין בכרטיסייה Data Connect במסוף Firebase).
האובייקט ConnectorConfig
כדי להשתמש ב-SDK, צריך אובייקט תצורה של מחבר.
האובייקט הזה נוצר באופן אוטומטי מ-serviceId
ו-location
ב-dataconnect.yaml
, ומ-connectorId
ב-connector.yaml
.
ייבוא ספריות
יש שתי קבוצות של ייבוא שנדרשות כדי לאתחל את קוד הלקוח: ייבוא כללי של 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 '@myorg/myconnector';
שימוש בשאילתות מ-JavaScript SDK
הקוד שנוצר כבר יכלול הפניות לשאילתות שהוגדרו מראש. כל מה שצריך לעשות הוא לייבא אותם ולקרוא להפעלה שלהם.
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 מספק ערכת SDK שנוצרה עם ווקים ל-React באמצעות ספרייה שזמינה מהשותפים שלנו ב-Invertase, TanStack Query Firebase.
הספרייה הזו מספקת קבוצה של וו hooks שמקלים מאוד על הטיפול במשימות אסינכררוניות באמצעות 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 לפרויקט, מוסיפים מפתח react
לקובץ התצורה connector.yaml
.
generate:
javascriptSdk:
react: true
outputDir: "../movies-generated"
package: "@movie-app/movies"
packageJsonDir: "../../"
ייבוא ספריות
יש ארבע קבוצות של ייבוא שנדרשות כדי לאתחל את קוד הלקוח של React: ייבוא כללי של Data Connect, ייבוא כללי של TanStack וייבוא ספציפי של ערכות ה-SDK שנוצרו ב-JS וב-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 '@myorg/myconnector';
// generated React hooks from SDK
import { useListAllMovies, useCreateMovie } from "@myorg/connector/react";
שימוש בשאילתות ובמוטציות בלקוח React
אחרי שתסיימו את ההגדרה, תוכלו לשלב שיטות מ-React SDK שנוצר.
בקטע הקוד הבא, שימו לב לשיטה useListAllMovies
עם הקידומת use
מ-React SDK שנוצר. כל הפעולות מסוג use
ב-SDK שנוצר, כולל שאילתות ומוטציות, קוראות לקישורי השאילתות של TanStack:
- שאילתות שמפעילות את ה-hook TanStack
useDataConnectQuery
ומחזירות אותו - פונקציות המוטציה קוראות להקלאץ'
useDataConnectMutation
של TanStack ומחזירות אותו
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 ל-hook שנוצר, כך:
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 | מחרוזת |
זוגית | מספר |
Float | מספר |
שיקולים מיוחדים ליצירת SDK
הגדרת נתיבים ביחס ל-node_modules
ב-SDK ל-JavaScript, מכיוון ש-Data Connect משתמש ב-npm link
כדי להתקין את ה-SDK, צריך להוציא את ה-SDK שנוצר לספרייה ברמה זהה לנתיב node_modules
או לספריית צאצא שיכולה לגשת ל-node_modules
.
במילים אחרות, כדי שה-SDK שנוצר יפעל כמו שצריך, צריכה להיות לו גישה למודול הצומת firebase
.
לדוגמה, אם node_modules
נמצא ב-my-app/
, ספריית הפלט צריכה להיות my-app/js-email-generated
כדי ש-js-email-generated
יוכל לייבא מתיקיית ההורה node_modules
.
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"
לחלופין, אם יש לכם מונו-מאגר שבו המודולים מתארחים ברמה הבסיסית, תוכלו למקם את ספריית הפלט בכל תיקייה במונו-מאגר.
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, קובצי המקור של ה-SDK נוצרים ומתעדכנים באופן אוטומטי בזמן שאתם משנים את קובצי ה-.gql
שמגדירים סכימות, שאילתות ומוטציות. זו יכולה להיות תכונה שימושית בתהליכי עבודה של טעינה (מחדש) חמה.
.gql
וגם לעדכן באופן אוטומטי את מקורות ה-SDK.
לחלופין, אפשר להשתמש ב-CLI כדי ליצור מחדש את ערכות ה-SDK בכל פעם שקובצי ה-gql משתנים:
firebase dataconnect:sdk:generate --watch
יצירת ערכות SDK לשילוב ולגרסאות ייצור
בתרחישים מסוימים, כמו הכנת מקורות של פרויקטים לשליחה לבדיקות CI, אפשר להפעיל את ה-CLI של Firebase כדי לבצע עדכון באצווה.
במקרים כאלה, צריך להשתמש ב-firebase dataconnect:sdk:generate
.
שיקולים נוספים לגבי מסגרות
Angular
כשיוצרים קוד, ה-Angular CLI
לא מזהה שינויים חדשים בגלל קוד האופטימיזציה של התלות שלו. כדי לפתור את הבעיה, צריך לשנות את angular.json
.
"projects": {
"myproject": {
"architect": {
"serve:": {
"prebundle": {
"exclude": ["@movie-app/movies"]
}
}
}
}
}