בפרויקט Next.js 14, היינו זקוקים לעורך טקסט עשיר עבור פאנל ניהול CMS המטפל בעד 5000 רשומות. ה-Quill 2.x הסטנדרטי לא התאים: סרגל הכלים שלו לא יכול היה להעלות תמונות לשרת, וחסרה עיצוב טבלאות—היינו צריכים לאחסן מחרוזות base64, מה שמנפח את גודל המסמך ב-30–50%. המודולים המובנים סיפקו רק תכונות בסיסיות, אבל מוצר אמיתי דרש מטפלים מותאמים אישית ותמיכה בפורמט Delta. פיתחנו מודולים מותאמים אישית שמשתלבים עם React ו-Vue. תנו לי לסקור את האתגרים שנתקלנו בהם וכיצד פתרנו אותם.
למה Quill בסיסי לא מתאים ל-CMS
התקנת Quill טיפוסית נותנת פונקציונליות בסיסית, אבל בייצור נתקלים בבעיות:
- העלאת תמונות. כברירת מחדל, Quill מטמיע תמונות כ-base64, מה שמנפח את ה-JSON ב-30–50%. אנו כותבים מטפל מותאם אישית שמעלה את הקובץ לשרת ומכניס את ה-URL. זה מפחית את עומס מסד הנתונים ומאיץ את טעינת הדפים.
- מודולים מותאמים אישית: טבלאות, רשימות מקוננות, צבע טקסט. Quill ניתן להרחבה דרך תוספים של צד שלישי, אבל הם לא תמיד יציבים. עבור פרויקט אחד, היינו צריכים לכתוב מודול לרשימות מקוננות כי המוכן לא תמך בעומק מעבר ל-2 רמות.
- שמירה ב-Delta לעומת HTML. Delta נוחה לגרסאות ועריכה שיתופית, אבל HTML נדרשת לעתים קרובות לפלט. אנו מספקים את שניהם על ידי המרת Delta ל-HTML באמצעות
quill-delta-to-html.
| בעיה | פתרון | זמן יישום | חיסכון לעומת עורך מסחרי |
|---|---|---|---|
| תמונות base64 | מטפל מותאם אישית עם העלאה לשרת | 2–4 שעות | הפחתת עלויות משמעותית |
| טבלאות חסרות | תוסף quill-better-table |
1–2 שעות | — |
| התאמה אישית מורכבת | יצירת מודול משל עצמנו המבוסס על Quill API | מיום אחד | חיסכון משמעותי ברישיון |
איך אנו משלבים Quill עם מודולים מותאמים אישית
התהליך שלנו כולל:
- ניתוח דרישות העורך: כפתורים, פורמטים, העלאת מדיה, תמיכה במובייל.
- עיצוב מודולים: מטפלים מותאמים אישית, ערכת נושא (snow/bubble או מותאמת אישית), הגדרת סרגל כלים.
- יישום: קוד ב-React (
const imageHandler = () => { const input = document.createElement('input'); input.setAttribute('type', 'file'); input.setAttribute('accept', 'image/*'); input.click(); input.onchange = async () => { const file = input.files[0]; const formData = new FormData(); formData.append('image', file); const response = await fetch('/api/media/upload', { method: 'POST', body: formData }); const { url } = await response.json(); const quill = quillRef.current.getEditor(); const range = quill.getSelection(true); quill.insertEmbed(range.index, 'image', url); }; }; const MODULES = { toolbar: { container: [...], handlers: { image: imageHandler } } };), Vue, או JavaScript וניל. דוגמה למטפל תמונות מותאם אישית:
const imageHandler = () => {
const input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('accept', 'image/*');
input.click();
input.onchange = async () => {
const file = input.files[0];
const formData = new FormData();
formData.append('image', file);
const response = await fetch('/api/media/upload', {
method: 'POST',
body: formData
});
const { url } = await response.json();
const quill = quillRef.current.getEditor();
const range = quill.getSelection(true);
quill.insertEmbed(range.index, 'image', url);
};
};
const MODULES = {
toolbar: {
container: [...],
handlers: {
image: imageHandler
}
}
}; - בדיקה על כל המכשירים והדפדפנים (Chrome, Firefox, Safari, Edge). אימות נכונות SSR, העלאת תמונות, המרת Delta->HTML.
- פריסה ותיעוד. אנו מספקים קוד מקור, הוראות התקנה, ושלושה חודשי תמיכה.
מה מציע פורמט Delta
Delta היא מערך של פעולות (insert, delete, retain) שקל לאחסן, לשדר ולשנות. בניגוד ל-HTML, Delta שומרת על סמנטיקת עיצוב: כל סגנון מאוחסן כתכונת פעולה. זה מאפשר ביטול/חזרה בכל שלב, עריכה שיתופית באמצעות אלגוריתמי OT, ומיזוג אוטומטי של שינויים. כמתואר בתיעוד פורמט Delta, אובייקט Delta הוא בדרך כלל קטן ב-40% מ-HTML מקביל עבור אותו תוכן. אם הפרויקט שלך דורש גרסאות, Delta היא הבחירה הנכונה.
השוואה עם חלופות
| קריטריון | Quill 2.x | TinyMCE 6 | CKEditor 5 |
|---|---|---|---|
| גודל חבילה (min+gzip) | ~40 KB | ~200 KB | ~300 KB |
| פורמט נתונים | Delta (JSON) | HTML | HTML/JSON |
| התאמה אישית | בינוני (מודול API) | גבוה (תוספים) | גבוה (UI) |
| טבלאות | תוסף | מובנה | מובנה |
| רישיון שנתי (USD) | 0 (קוד פתוח) | מ-~$1,200 | מ-~$1,800 |
Quill מנצח במהירות טעינה ופשטות. אם אינך צריך בלוקים מקוננים מורכבים, זו הבחירה הטובה ביותר. אם אינך בטוח, צור קשר לייעוץ.
איך להימנע מטעויות אינטגרציה נפוצות
- שכחת השבתת SSR עבור Quill ב-Next.js נותנת
document is not defined. השתמש בייבוא דינמי עםssr: false. - שימוש ב-
react-quillמיושן במקוםreact-quill-new(האחרון תומך ב-React 18 ו-SSR כראוי). - אי עטיפת מטפלים ב-
useCallback—רינדור מחדש אינסופי. - בלבול בין Delta ו-HTML: הכנסת HTML דרך
setContentsמאבדת עיצוב. השתמש ב-clipboard.dangerouslyPasteHTMLאו בהמרה.
מה כלול בעבודת האינטגרציה
- ניתוח דרישות ובחירת מחסנית (React, Vue, או Next.js)
- הגדרת סרגל כלים, מודולים וערכת נושא
- מטפל העלאת תמונות מותאם אישית
- ייצוא ל-HTML ו/או Delta
- אינטגרציית Hook (onChange, onBlur, ולידציה)
- תיעוד והדרכת צוות
- אחריות קוד (3 חודשי תמיכה חינם)
ציר זמן ועלות
אינטגרציה של Quill עם מודולים מותאמים אישית אורכת 1 עד 3 ימים תלוי במורכבות. העלות מחושבת בנפרד לאחר בריף. בממוצע, אינטגרציה כזו זולה ב-30–50% מרישוי עורכים מסחריים. קבל ייעוץ מהנדס—צור קשר להערכת הפרויקט שלך.







