בעת בניית פרויקטים headless על Directus, יצירת API סטנדרטית לרוב אינה מכסה את הלוגיקה העסקית. תרחיש טיפוסי: הפרונטאנד מבצע 30 בקשות עבור דף קטלוג עקב יחסי N+1, פילטרים לא עובדים על שדות מקוננים, ו-GraphQL זורק שגיאות על אגרגציות מורכבות. הלקוח מאבד משתמשים עקב זמני טעינה איטיים. אנחנו צוות עם חמש שנות ניסיון בהטמעת Directus — אנחנו הופכים את ה-API שלך לפתרון בעל ביצועים גבוהים. הלקוחות שלנו חוסכים עד 40% על משאבי שרת ומפחיתים את TTFB מ-2 שניות ל-200 אלפיות השנייה.
בעיות שאנחנו פותרים
שאילתות N+1 עם יחסים
בקשת REST סטנדרטית /items/articles מחזירה רק שדות שטוחים. אם הפרונטאנד צריך את המחבר, הקטגוריה והתגובות — הוא מבצע 3 בקשות נוספות לכל פוסט. עם 20 פוסטים בעמוד, זה 60 בקשות. הפתרון הוא להשתמש ב-fields=*,author.*,category.*,comments.* עם בקשה אחת. אבל אם צריך למיין תגובות או להגביל את מספרן, נדרש הפרמטר deep. אנחנו מגדירים deep populate עם מיון והגבלות מותאמים אישית, ומצמצמים את מספר הבקשות ל-1–2.
סינון לפי אוספים קשורים
משימה נפוצה: להציג מאמרים רק מקטגוריה מסוימת, אבל הקטגוריה היא רשומה קשורה. ב-Directus, זה נעשה דרך filter[category][slug][_eq]=tech. עם זאת, תנאי OR עם יחסים מקוננים יכולים לייצר תוצאות שגויות. לדוגמה, filter[_or][0][title][_icontains]=react&filter[_or][1][content][_icontains]=react עובד, אבל שילובו עם פילטר על המחבר מסבך את התחביר. אנחנו משתמשים ב-endpoints מותאמים אישית על Flows ללוגיקה מורכבת.
אגרגציות עם קיבוץ
לוחות מחוונים לעתים קרובות צריכים סכומים חודשיים של מכירות. Directus תומך ב-aggregate[sum]=total&groupBy[]=status, אבל אי אפשר לקבץ לפי שני שדות שונים בבקשה אחת. אנחנו משתמשים ב-SDK וכותבים שאילתות SQL מותאמות אישית דרך migrations.
איך אנחנו עושים את זה: טכנולוגיות ומקרה שימוש
פרויקט לקוח — חנות מקוונת על Next.js + Directus 10. משימה: לבנות API לקטלוג עם פילטרים (מחיר, מותג, מאפיינים), חיפוש דרך Meilisearch, ועדכוני עגלה בזמן אמת. טכנולוגיות: Directus (REST + WebSocket), Meilisearch לחיפוש טקסט מלא, Redis לקאשינג.
מקרה: אגרגציה של צ'ק ממוצע ליום. REST סטנדרטי לא יכול לעשות זאת — רק סוג אגרגציה אחד לכל בקשה. כתבנו endpoint מותאם אישית על Flows עם שאילתת SQL:
SELECT DATE(date_created) as day, AVG(total) as avg_check FROM orders WHERE status = 'paid' GROUP BY day ORDER BY day; תוצאה: בקשה אחת במקום 30, מהירות לוח המחוונים גדלה פי 4. הלקוח חסך $2000 בחודש על קאשינג ו-CDN.
תהליך העבודה
- ניתוח: ביקורת על הבקשות הקיימות, זיהוי צווארי בקבוק (Core Web Vitals, מספר בקשות).
- עיצוב: בחירת REST, GraphQL או WebSocket למשימות. הגדרת סכמת היחסים והפילטרים.
-
יישום: הגדרת endpoints, Flows מותאמים אישית, אופטימיזציה דרך
SELECT DATE(date_created) as day, AVG(total) as avg_check FROM orders WHERE status = 'paid' GROUP BY day ORDER BY day;ו-fields. לחיפוש, שילוב Meilisearch או Elasticsearch. - בדיקות: בדיקות עומס (k6), בדיקה עם 1000 בקשות במקביל.
- פריסה: הגדרת rate limiting, CORS, SSL, קאשינג (Redis/Varnish).
איך להגדיר GraphQL ב-Directus?
הפעל GraphQL על ידי ציון ב-deep:
GRAPHQL_SDLFILE=/tmp/schema.graphql GraphQL זמין בכתובת .env. בסביבת production, השבת introspection דרך GRAPHQL_SDLFILE=/tmp/schema.graphql . השתמש ב-mutations ליצירת רשומות וב-subscriptions לזמן אמת.
למה REST API מהיר יותר מ-GraphQL?
ב-Directus, REST API משתמש בקאשינג ברמת מסד הנתונים (מפתחות שאילתה), בעוד ש-GraphQL לא. עבור בחירות פשוטות, REST נותן זמן אחזור נמוך יותר (20–30% מהיר יותר). אבל GraphQL נוח יותר לשאילתות מקוננות מורכבות עם שדות שונים. הבחירה תלויה במשימה: ל-endpoints ציבוריים — REST, לפאנלים ניהוליים — GraphQL.
איך לשלב חיפוש דרך Meilisearch?
Meilisearch מחובר כשירות ב-Directus דרך Hook או Flow. הגדר אינדוקס של שדות, רלוונטיות ופילטרים. דוגמת הגדרה:
{ "index": "articles",
"primaryKey": "id",
"searchableAttributes": ["title", "content"],
"filterableAttributes": ["status", "category_id"] }לאחר סנכרון, הנתונים זמינים דרך endpoint נפרד. תוצאה: חיפוש ב-10–50 אלפיות השנייה במקום 500+ עם חיפוש טקסט מלא ב-PostgreSQL.
השוואה בין REST ל-GraphQL
| קריטריון | REST | GraphQL |
|---|---|---|
| קאשינג | מובנה (URL כמפתח) | אין (דורש הגדרה מותאמת) |
| Overfetching | כן (אם שדות לא צוינו) | לא (מחזיר רק שדות מבוקשים) |
| שאילתות מקוננות | דרך deep, מורכב ל-OR | טבעי (שפת שאילתות) |
| ביצועים | גבוהים יותר לבחירות פשוטות | נמוכים יותר עקב ניתוח שאילתות |
| מומלץ עבור | APIs ציבוריים, קאשינג | ממשקי לקוח מורכבים |
טעויות נפוצות בהגדרת Directus API
| טעות | תוצאה | פתרון |
|---|---|---|
| תחביר deep שגוי | שגיאה 500, תגובה ריקה | קידוד URL לפרמטרים: /graphql |
| אינדקסים חסרים | סריקה מלאה, שאילתות איטיות | צור אינדקסים על שדות המסוננים לעתים קרובות |
| שדות רחבים מדי | תעבורה גבוהה, תגובה איטית | ציין רק שדות נחוצים |
| התעלמות מקאשינג | עומס יתר על מסד הנתונים | הפעל קאשינג דרך Varnish/Cloudflare |
מה כלול
- ביקורת על הבקשות הקיימות ואופטימיזציה.
- הגדרת REST, GraphQL או WebSocket למשימות.
- כתיבת endpoints מותאמים אישית על Flows ללוגיקה מורכבת.
- שילוב חיפוש (Meilisearch/Elasticsearch).
- Rate limiting, קאשינג, הגדרת אבטחה.
- תיעוד API (OpenAPI/Swagger).
- הדרכה לצוות הלקוח.
- חודש תמיכה לאחר ההשקה.
לוח זמנים
הגדרת REST/GraphQL בסיסית: 2 עד 5 ימים. Endpoints מותאמים אישית ואגרגציות מורכבות: 5 עד 10 ימים. לוח זמנים מדויק לאחר הביקורת.
קבלו ייעוץ לפרויקט שלכם. הזמינו ביקורת Directus API — נציע פתרון אופטימלי.







