כאשר הלוגיקה העסקית לא מתאימה לסוגי תוכן מובנים מראש, KeystoneJS הופך לבסיס. זהו CMS headless מבוסס-קוד שבו סכמות הנתונים חיות ב-TypeScript, וה-API של GraphQL, פאנל הניהול וסכמת Prisma נוצרים אוטומטית. אתה לא מבזבז זמן על עטיפות CRUD: המערכת יוצרת אותן, ומשאירה לך להתמקד בלוגיקה העסקית. תוך 7–10 ימים, אתה מקבל פתרון מוכן עם שדות מותאמים אישית, גישת מבוססת-תפקידים, ואינטגרציה עם כל frontend—מ-Next.js ועד Angular. גישה זו מפחיתה את עלות הפיתוח ומבטלת שאילתות N+1 דרך API גמיש. צור איתנו קשר כדי לדון בפרויקט שלך.
בניגוד ל-CMS מבוסס-ניהול, KeystoneJS נותן שליטה מלאה על הנתונים. אתה מגדיר יחסים, hooks, שדות מחושבים—המערכת בונה migrations דרך Prisma. השתמשנו בגישה זו ביותר מ-10 פרויקטים: מחנויות e-commerce עם קטלוגים מותאמים אישית ועד פורטלים ארגוניים עם multisite. לפי המדידות שלנו, KeystoneJS מאיץ את יצירת ה-backend פי 1.5 בהשוואה ל-Strapi. קבל ייעוץ מהמהנדס שלנו להערכת פרויקט.
מתי לבחור ב-KeystoneJS
KeystoneJS מתאים כאשר:
- נדרשת שליטה מלאה על סכמת הנתונים והלוגיקה העסקית
- הצוות נוח עם Node.js ו-TypeScript
- נדרשת לוגיקת גישה מותאמת אישית, שדות מחושבים מורכבים, ו-hooks ברמת הנתונים
- GraphQL API הוא הממשק הראשי עבור ה-frontend
זה לא מתאים אם אתה צריך אירוח מובנה ללא DevOps או ממשק משתמש עשיר עבור עורכים לא טכניים (אז שקול את Strapi או Payload).
למה לבחור ב-KeystoneJS?
KeystoneJS עולה על CMS מסורתי בזכות הגישה מבוססת-הקוד שלו. אתה לא מוגבל על ידי מבנים קבועים: כל יחסים, שדות מחושבים ו-hooks על create/update. GraphQL API מספק ל-frontend בדיוק את הנתונים שהוא צריך, ללא שאילתות N+1. לפי התיעוד הרשמי, KeystoneJS יכול להפחית את זמן פיתוח ה-backend ב-30–40% באמצעות יצירה אוטומטית של פעולות CRUD.
| קריטריון | KeystoneJS | Strapi | Payload CMS |
|---|---|---|---|
| גישה | מבוסס-קוד | מבוסס-ניהול | מבוסס-קוד |
| טיפוסים | TypeScript | JS/TS חלקי | TypeScript |
| GraphQL | יצירה אוטומטית מלאה | REST + GraphQL | REST + GraphQL |
| התאמה אישית | מקסימלית | בינונית | גבוהה |
| DevOps | נדרש | אירוח מובנה | נדרש |
איך אנו מגדירים גישה ותפקידים
ב-KeystoneJS, זכויות גישה מוגדרות ברמת הפעולה (create/read/update/delete) וברמת השדה דרך access בכל רשימה. אנו מיישמים מודל תפקידים: מנהל, עורך, מחבר, אנונימי. תמיכה מובנית בסשנים דרך cookie או JWT.
// Пример доступа: только автор может редактировать свой пост
access: {
operation: {
query: allowAll,
create: ({ session }) => !!session,
update: ({ session, item }) => session?.data?.id === item.authorId,
delete: ({ session }) => session?.data?.role === 'admin',
},
}, תהליך
- גילוי: הגדרת מודלים, יחסים, תפקידים, אינטגרציות
- עיצוב: יצירת סכמת TypeScript, הגדרת אחסון (מקומי/S3)
- יישום: כתיבת רשימות, hooks, כללי גישה, התאמת Admin UI
- בדיקות: שאילתות GraphQL, בדיקות יחידה, בדיקות עומס
- פריסה: Prisma migrations, קונטיינר Docker, CI/CD
תצורה והשקה
// keystone.ts
import { config } from '@keystone-6/core';
import { lists } from './schema';
import { withAuth, session } from './auth';
export default withAuth(
config({
db: {
provider: 'postgresql',
url: process.env.DATABASE_URL!,
enableLogging: true,
idField: { kind: 'uuid' }
},
lists,
session,
ui: {
isAccessAllowed: (context) => !!context.session?.data
},
server: {
cors: {
origin: [process.env.FRONTEND_URL!],
credentials: true
}
},
})
); מודל לדוגמה: Post
// lists/Post.ts
import { list } from '@keystone-6/core';
import { text, relationship, timestamp, select, image, document } from '@keystone-6/core/fields';
export const Post = list({
access: {
operation: {
query: () => true,
create: ({ session }) => !!session,
update: ({ session }) => !!session,
delete: ({ session }) => session?.data?.role === 'admin',
},
},
fields: {
title: text({ validation: { isRequired: true } }),
slug: text({ validation: { isRequired: true }, isIndexed: 'unique' }),
status: select({
options: [
{ label: 'Draft', value: 'draft' },
{ label: 'Published', value: 'published' },
{ label: 'Archived', value: 'archived' },
],
defaultValue: 'draft',
}),
content: document({ formatting: true, links: true }),
author: relationship({ ref: 'Author.posts' }),
featuredImage: image({ storage: 'local_images' }),
},
});
GraphQL API ואינטגרציית Frontend
לאחר הרצת // Пример доступа: только автор может редактировать свой пост access: { operation: { query: allowAll, create: ({ session }) => !!session, update: ({ session, item }) => session?.data?.id === item.authorId, delete: ({ session }) => session?.data?.role === 'admin', }, }, , GraphQL Playground נפתח ב-// keystone.ts import { config } from '@keystone-6/core'; import { lists } from './schema'; import { withAuth, session } from './auth'; export default withAuth( config({ db: { provider: 'postgresql', url: process.env.DATABASE_URL!, enableLogging: true, idField: { kind: 'uuid' } }, lists, session, ui: { isAccessAllowed: (context) => !!context.session?.data }, server: { cors: { origin: [process.env.FRONTEND_URL!], credentials: true } }, }) ); . שאילתה לדוגמה:
query GetPosts {
posts(
where: { status: { equals: "published" } }
orderBy: { publishedAt: desc }
) {
id
title
slug
author {
name
}
}
}ב-Next.js, השתמש ב-Apollo Client:
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client';
export const client = new ApolloClient({
link: createHttpLink({
uri: process.env.KEYSTONE_API_URL,
}),
cache: new InMemoryCache(),
});
מה כלול
- יצירת סכמת נתונים (רשימות, יחסים, hooks)
- הגדרת גישה ותפקידים
- אינטגרציית frontend (Next.js, Nuxt 3, Gatsby)
- הגדרת אחסון (מקומי, S3)
- פריסה ו-migrations
- תיעוד API ו-Admin UI
- הדרכת צוות עורכים
- תמיכה חודש לאחר ההשקה
איך KeystoneJS מאיץ פיתוח
בפועל, הגישה מבוססת-הקוד מאפשרת לנו להפחית את זמן ההתקנה הראשוני פי 2–3 בהשוואה ל-CMS מבוסס-ניהול. אנו מקבלים פאנל ניהול ו-API מוכנים מיד לאחר תיאור הסכמה. לדוגמה, בפרויקט e-commerce אחד, חסכנו 4 ימים רק בשלב העיצוב, מה שהביא לחיסכון משמעותי בעלויות ללקוח.
ציר זמן פיתוח אתר טיפוסי
| שלב | משך |
|---|---|
| התקנה, הגדרת DB, רשימות בסיסיות | יום אחד |
| 3–5 מודלים עם יחסים | 2–3 ימים |
| הגדרת גישה ותפקידים | יום אחד |
| אימות + סשנים | 0.5 יום |
| אינטגרציית frontend | 2–3 ימים |
| פריסה + migrations | 0.5–1 יום |
| סה"כ לאתר בינוני | 7–10 ימים |
לפרויקטים מורכבים, 3–5 שבועות. קבל ייעוץ מהמהנדס שלנו להערכת פרויקט.







