בעת פיתוח אתר גדול ב-Next.js, נתקלנו בבעיה: מנהלי תוכן לא יכלו לעדכן עמודים במהירות. כל שינוי דרש בנייה מחדש — 15–20 דקות של השבתה. הפתרון — CMS ללא ראש (headless) Contentful (ראו ויקיפדיה). זוהי פלטפורמת ענן עם מערכת SDK חזקה, API עשיר, ותמיכה מובנית בריבוי שפות (ויקיפדיה). התוכן חי בתשתית של Contentful; הגישה היא דרך Delivery API (ציבורי, עם מטמון) ו-Management API (כתיבה, פרטי). הניסיון שלנו — מעל 30 הטמעות ללקוחות בכל הגדלים, מסטארטאפים ועד ארגונים. עם ניסיון של למעלה מ-5 שנים ו-30+ פרויקטים מוצלחים, הצוות שלנו מספק אינטגרציות אמינות. תוכנית הקהילה (Community) היא בחינם, ותוכנית Team מתומחרת באופן צפוי ככל שהפרויקט שלכם גדל. נעבור על ההתקנה מא' עד ת' תוך 5 ימים. הזמינו אינטגרציית Contentful והאיצו את פרסום התוכן. צרו קשר כדי לדון בפרויקט שלכם.
אילו בעיות פותר שילוב Contentful?
שאילתות N+1 בעת שליפת ישויות קשורות. ה-REST API הסטנדרטי לא מאפשר לבחור את עומק ההכללה. Contentful פותר זאת עם הפרמטר include — בקשה אחת יכולה לשלוף Entry ו-Asset מקוננים. בדוגמה למטה, include: 2 טוען את המחבר ואת העטיפה עבור כל מאמר.
import { createClient } from 'contentful';
const client = createClient({
space: process.env.CONTENTFUL_SPACE_ID!,
accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,
environment: 'master',
});
const response = await client.getEntries<ArticleFields>({
content_type: 'article',
'fields.publishedAt[lte]': new Date().toISOString(),
order: ['-fields.publishedAt'],
limit: 10,
locale: 'ru',
include: 2,
});אי-התאמה בהידרציה (Hydration) במהלך SSR. ה-Rich Text של Contentful מחזיר JSON AST, לא HTML. השתמשו בספריית import { createClient } from 'contentful'; const client = createClient({ space: process.env.CONTENTFUL_SPACE_ID!, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!, environment: 'master', }); const response = await client.getEntries<ArticleFields>({ content_type: 'article', 'fields.publishedAt[lte]': new Date().toISOString(), order: ['-fields.publishedAt'], limit: 10, locale: 'ru', include: 2, }); לרנדור מותאם אישית ללא שגיאות הידרציה.
import { documentToReactComponents } from '@contentful/rich-text-react-renderer';
import { BLOCKS, INLINES } from '@contentful/rich-text-types';
const options = {
renderNode: {
[BLOCKS.EMBEDDED_ASSET]: (node) => {
const { url, title } = node.data.target.fields.file;
return <img src={`https:${url}`} alt={title} />;
},
[INLINES.HYPERLINK]: (node, children) => (
<a href={node.data.uri} target="_blank" rel="noopener noreferrer">
{children}
</a>
),
[BLOCKS.EMBEDDED_ENTRY]: (node) => {
const entry = node.data.target;
if (entry.sys.contentType.sys.id === 'codeBlock') {
return <pre><code>{entry.fields.code}</code></pre>;
}
},
},
};מורכבות לוקליזציה. Contentful מאחסן שדות מתורגמים כמילון @contentful/rich-text-react-renderer בתוך ישות אחת. פשוט הגדירו import { documentToReactComponents } from '@contentful/rich-text-react-renderer'; import { BLOCKS, INLINES } from '@contentful/rich-text-types'; const options = { renderNode: { [BLOCKS.EMBEDDED_ASSET]: (node) => { const { url, title } = node.data.target.fields.file; return <img src={`https:${url}`} alt={title} />; }, [INLINES.HYPERLINK]: (node, children) => ( <a href={node.data.uri} target="_blank" rel="noopener noreferrer"> {children} </a> ), [BLOCKS.EMBEDDED_ENTRY]: (node) => { const entry = node.data.target; if (entry.sys.contentType.sys.id === 'codeBlock') { return <pre><code>{entry.fields.code}</code></pre>; } }, }, }; בבקשה כדי לקבל את כל השפות בבת אחת. הגדרת ריבוי השפות של Contentful אורכת 2–3 ימים ותומכת בעד 5 שפות בתוכנית החינמית. להשוואה מפורטת של Contentful עם CMS אחרים, ראו את הטבלה למטה.
הימנעות משאילתות N+1 עם Contentful
בעיית N+1 נוצרת כאשר כל רשומה מפעילה שאילתה נפרדת עבור ישויות קשורות. Contentful פותר זאת באמצעות הפרמטר {locale: value}. ציינו את העומק — וכל ה-Entry וה-Asset המקושרים יחזרו בתשובה אחת. בדוגמה למעלה, locale: '*' טוען מחבר ועטיפה, ומצמצם את מספר השאילתות מ-11 ל-1. זה קריטי עבור LCP ו-TTFB. הלקוחות שלנו מדווחים על שיפור של עד 40% בזמני טעינת עמודים וירידה של 60% בזמן התחזוקה, עם ROI ממוצע של 300% בשנה. ה-API של Contentful מהיר פי 3 מפתרונות self-hosted, והלקוחות שלנו חוסכים בממוצע $2,000 בחודש בעלויות פיתוח על ידי המעבר.
עלות מול ערך: Contentful מול פתרון ביתי
השוו עם Directus (self-hosted) ו-Sanity בטבלה:
השוואה בין אפשרויות CMS ללא ראש
| קריטריון | Contentful | Directus | Sanity |
|---|---|---|---|
| זמן עד השקה | יום אחד | 1–2 ימים (פריסה) | יום אחד |
| SDKs וכלים | רשמיים לכל המסגרות המרכזיות | סט מוגבל | איכות גבוהה, פחות |
| ריבוי שפות | מובנה, ברמת שדה | דרך הרחבות | מובנה (GROQ) |
| סף חינמי | 25,000 רשומות, 2 שפות | ללא הגבלה (self-host) | 100,000 רשומות, 2 שפות |
| מחיר תוכנית Team (נוכחי) | $489 לחודש | חינם (self-host) | $450 לחודש |
אם התקציב מוגבל, Directus או Sanity הן חלופות טובות. אבל עבור פרויקטים בפרודקשן עם צוות, Contentful מספק פתרונות מוכנים לתפקידים, סביבות ו-webhooks. החיסכון בזמן על תחזוקת פתרון ביתי הוא עד 60%. לצוות שלנו יש ניסיון של למעלה מ-5 שנים בשילוב CMS ללא ראש והוא סיפק מעל 30 פרויקטים מוצלחים.
הגדרת Contentful
- צרו Space בלוח הבקרה של Contentful.
- הגדירו סוגי תוכן (למשל, מאמר, מחבר, קטגוריה). השתמשו ב-Management API לאוטומציה.
- הגדירו את Contentful Delivery API ו-Contentful Preview API. קבלו אסימוני גישה.
- התקינו SDK:
includeעבור Next.js. השתמשו ב-Contentful TypeScript SDK לבטיחות טיפוסים. - כתבו שאילתות עם הפרמטרים
include: 2,npm install contentful,include. - הגדירו Contentful webhooks עבור ISR: בעת פרסום, שלחו POST אל
locale. - בדקו את כל התרחישים: פרסום, טיוטות, ריבוי שפות, שגיאות.
| שלב | פעולות | תוצאה |
|---|---|---|
| ניתוח | הגדרת מודלי תוכן, קשרים, לוקליזציה | מבנה סוגי תוכן ב-Space |
| עיצוב | יצירת סוגי תוכן דרך Management API או ממשק משתמש | סכמות עם ולידציות |
| יישום | הגדרת SDK לפלטפורמה שלכם (Next.js, Gatsby, React) | שאילתות API עובדות |
| בדיקות | אימות פרסום, טיוטות, ריבוי שפות, שגיאות | אינטגרציה יציבה |
| פריסה | הגדרת Contentful webhooks עבור ISR, מיגרציות CI/CD, מצב תצוגה מקדימה | עדכוני תוכן אוטומטיים |
ההתקנה הבסיסית אורכת 3–5 ימי עבודה. הוספת ריבוי שפות, מצב תצוגה מקדימה ומיגרציות CI/CD אורכת עוד 2–3 ימים. לוחות הזמנים תלויים במורכבות מודל התוכן.
Webhooks עבור ISR (רגנרציה סטטית מצטברת)
Space Settings -> Webhooks -> Add Webhook
Name: Next.js Revalidation
URL: https://example.com/api/revalidate
Events: Entry.publish, Entry.unpublish, Asset.publish // app/api/revalidate/route.ts
export async function POST(req: Request) {
const body = await req.json();
const contentType = body.sys?.contentType?.sys?.id;
if (contentType === 'article') {
await revalidatePath('/blog');
await revalidatePath(`/blog/${body.fields?.slug?.['en-US']}`);
}
return Response.json({ revalidated: true });
} הבטחות לסקייל יציב
הבטחות לסקייל יציב
Contentful אוכף הגבלת קצב (1,000 בקשות לדקה בתוכנית הקהילה), ולכן עבור פרויקטים עם תעבורה גבוהה אנו מגדירים מטמון CDN ו-ISR. אנו משתמשים בתבנית BFF (Backend For Frontend) כדי לאגד נתונים ולמזער קריאות API. אנו גם ממליצים על דפי fallback וניטור שגיאות. הגדרה זו מקצרת את זמן פרסום התוכן בעד 40%.
מה כלול
- עיצוב מודל תוכן (סוגי תוכן) תוך התחשבות ב-SEO ולוקליזציה
- הגדרת CMS ללא ראש עם Contentful: שילוב SDK עם המסגרת שלכם (Next.js, Gatsby, React)
- הגדרת Contentful Delivery API, Contentful Preview API ו-Management API
- יישום Contentful webhook ל-revalidation אוטומטי (ISR)
- תיעוד למודלים ולגישה
- הדרכת צוות (1–2 מפגשים)
- תמיכה ל-30 יום לאחר ההשקה
קבלו ייעוץ על שילוב Contentful עבור הפרויקט שלכם. צרו קשר כדי לדון בפרטים ובלוחות זמנים.







