פיתוח גרפים אינטראקטיביים עם ApexCharts לאתר

הגרפים בלוח הבקרה מאטים, מאבדים נתונים בעת רענון ומפחידים את המשתמשים? אנחנו מתכננים ומטמיעים גרפים אינטראקטיביים עם ApexCharts מקצה לקצה — מחיבור מקורות נתונים ועד רינדור חלק בנפחים גדולים. הצוות שלך מקבל ויזואליזציה שמקצרת את זמן הניתוח ואינה מדרדרת עם גידול בעומס.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
פיתוח גרפים אינטראקטיביים עם ApexCharts לאתר
פשוט
מ- 1 יום עד 3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

מדוע גרפים אינטראקטיביים ב-ApexCharts נשברים בפרודקשן

גרף שנפתח באופן מיידי על נתוני דמו של מאה נקודות מתחיל לגמגם בזרימת נתונים אמיתית: תחילה מגמגם קלות בעת ריחוף, לאחר מכן מפסיק להדביק את הקצב של העדכונים, וכעבור מספר שעות עבודה הלשונית אוכלת זיכרון וקורסת. הסיבה כמעט תמיד אחת — הספרייה מציירת מחדש את כל מערך הנתונים כולו בכל שינוי, ולא רק את הקטע שהשתנה.

לאחר מכן נכנסת לשרשרת ההידרדרות. כל עדכון יוצר מופע חדש של הגרף מעל הישן, ואם הקודם לא הושמד באופן מפורש, מאזיני אירועים וטיימרים נשארים תלויים — זוהי דליפת זיכרון קלאסית בדפדפן. היא אינה נראית בבדיקות, אך בסשן ארוך הלשונית גדלה בנפחה עד שהיא נתקלת במגבלה.

סיפור נפרד הוא רינדור של מערכים גדולים של נתונים: עשרות אלפי נקודות בגרף אינן נחוצות למשתמש, הוא ממילא רואה כמה מאות פיקסלים לרוחב, אך הדפדפן מצייר כל אחת מהן ביושר.

ביצועי הגרפים נתקלים בשלושה דברים: נפח הנתונים, תדירות העדכונים ומספר המופעים החיים בעמוד. כאשר דשבורד מחזיק עשרה ווידג'טים, כל אחד עם הטיימר הסקר שלו, הם מתחילים להתחרות על ה-thread הראשי — הממשק קופא למשך זמן הרינדור, וזה כבר לא קוסמטיקה אלא כשל של התרחיש.

מפרקים כיצד זה נסגר: היכן לחתוך נתונים לפני הרינדור, כיצד לבנות את מחזור החיים של המופעים ומה לבדוק לפני ההעלאה לאוויר, כדי שהגרף ישרוד לא דמו אלא עומס אמיתי.

מה נותנת ויזואליזציה של נתונים שתוכננה נכון

ויזואליזציה שתוכננה נכון היא לא "גרפים יפים", אלא עבודה צפויה של הממשק על נפחים אמיתיים. כאשר בלוח מחוונים יש 10-15 תרשימים, שכל אחד מהם מושך מערך נתונים משלו, הדפדפן מבזבז משאבים על ציור מחדש של כל הקנבס בכל עדכון.

אנחנו מפרידים את הרינדור לשכבות עצמאיות: סדרות כבדות נטענות בנפרד מהקלות, עדכון של תרשים אחד לא נוגע בשכנים. הזמן עד לאינטראקטיביות מתקצר מעשרות שניות ל-1-2 — המשתמש מתחיל לעבוד עם הנתונים בלי לחכות שהגרף האחרון יסיים להיצייר.

יציבות תחת עומס נשענת על שלושה דברים: אגרגציה בצד השרת, הגבלת מספר הנקודות לסדרה וביטול בקשות מיושנות. אם המשתמש החליף תקופה עשר פעמים, לממשק תחזור רק התשובה האחרונה — השאר נזרקות ולא מונחות זו על זו.

בשיאים, כאשר עשרות אנשים פונים ללוח המחוונים בו-זמנית, הממשק לא "נתקע": חיתוכים כבדים מחושבים מראש ומוגשים מהמטמון, ולא מחושבים מחדש בכל בקשה.

נושא נפרד הוא העומס על הממשק. אנימציות, תוויות מידע וזום מופעלים כברירת מחדל, אבל על סדרות גדולות הם אוכלים פריימים והופכים גרירה למצגת. אנחנו מכבים את המיותר במקום שבו זה לא משפיע על המשמעות, ומשאירים חלקות רק בגרפים המרכזיים.

לפי הניסיון שלנו, אחרי אופטימיזציה כזו מספר הפניות לתמיכה בנוסח "לוח המחוונים לא נטען" יורד פי כמה — אנשים מפסיקים לחכות ולרענן את הדף.

האפקט מדיד: מהירות רינדור, יציבות בעומסי שיא וירידה במספר התקלות — זה מה שנראה במטריקות, ולא רק בעין.

מצבי חיבור נתונים: השוואת גישות

בחירת אופן הזנת הנתונים קובעת לא רק את העומס על השרת, אלא גם כיצד הגרף מתנהג בעת הגדלה: כמה נקודות הוא מחזיק ללא ירידות ביצועים, באיזו מהירות הוא מגיב למסננים ומה קורה בעת ניתוק החיבור. להלן שלוש סכמות עבודה שמהן באמת בוחרים בפרויקטים.

אפשרות מתי מתאימה מגבלות
טעינה באצוות דוחות, לוחות מחוונים עם רענון נדיר, חתכים היסטוריים הנתונים מתיישנים בין בקשות; בנפח גדול גדל זמן הרינדור הראשון
הזרמה ניטור, מדדים בזמן אמת, לוחות תפעוליים חיבור מתמיד ועומס על השרת; נדרש חוצץ ודילול נקודות
סכמה היברידית היסטוריה ארוכה + "זנב" חי, מסננים כבדים מורכבת יותר לניפוי שגיאות: יש לסנכרן שני מקורות לפי זמן וקנה מידה

מגבלות רינדור

הדפדפן מצייר בנוחות אלפי נקודות, אך ההידרדרות מתחילה באופן בלתי מורגש: תחילה יורדת החלקות האנימציה, לאחר מכן מואטים רמזי העכבר בעת ריחוף. לכן נתוני הזרמה כמעט תמיד מדוללים בצד הלקוח, וההיסטוריה נטענת במצטברים לפי מרווחים — שעה, יום, שבוע.

כיצד בוחרים סכמה

מסתכלים על תדירות הרענון ועומק ההיסטוריה. אם הגרף מתרענן פעם בדקה ולעיתים רחוקות יותר — טעינה באצוות פשוטה יותר וצפויה יותר. אם הנתונים זורמים ברציפות, מוסיפים חוצץ, מגבילים את חלון התצוגה ומפעילים חזרה למצב אצווה בעת אובדן חיבור — כך הלוח לא "קופא" לנגד עיני המשתמש.

כיצד אנו מטמיעים גרפים אינטראקטיביים: שלבי העבודה

את העבודה מתחילים באודיט של הוויזואליזציה: בודקים אילו נתונים כבר קיימים, באיזה פורמט הם מועברים ומה בדיוק צריך להופיע על הגרף. בשלב זה מתעדים את המקורות, את תדירות העדכון ואת נפח הנקודות — מכך תלוי אם אנו מציירים פרוסה סטטית או זרם שמתעדכן בזמן אמת.

  1. אודיט ויזואליזציה. מנתחים את הדוחות והדשבורדים הנוכחיים, מסמנים אילו מדדים משוכפלים, אילו אינם קריאים, והיכן המשתמש עוזב את העמוד. בפלט — רשימת גרפים עם עדיפות וייעוד ברור לכל אחד.
  2. סכמת זרימות נתונים. קובעים מהיכן מגיעים הנתונים, באיזו תדירות הם משתנים והאם נדרשת אגרגציה בצד השרת. אם יש אלפי נקודות, חלק מהן מאגדים מראש — אחרת הדפדפן של המשתמש יתחיל לגמגם ברינדור.
  3. אב טיפוס והגדרת גרפים. בונים מוקאפ עובד על ApexCharts: סוג התרשים, הצירים, הטולטיפים, מסננים לפי תקופה, התנהגות בריחוף ובמסכים צרים. מתאמים איתכם לפני שמתחילים להטמיע בעמודים החיים.
  4. אינטגרציה בממשק. מחברים את הגרפים לנתונים אמיתיים, מגדירים מצבי טעינה ובחירות ריקות, כדי שהמשתמש יראה תשובה ברורה ולא בלוק ריק. בנפרד מפתחים את ההתנהגות בעת ניתוק הקשר עם המקור.
  5. בדיקת עומס. מריצים עמודים עם נפח גדול של נקודות ועדכון תכוף, מודדים כיצד הממשק מתנהג עם עשרות גרפים על מסך אחד. מייעלים לפני שהמשתמשיבחין בכך.
  6. מסירת תיעוד. מוסרים תיאור של מבנה הנתונים, הגדרות הגרפים והוראות להוספת תרשימים חדשים. הצוות שלכם יוכל להרחיב את הדשבורד בלעדינו.

כל שלב מסתיים בתוצאה ניתנת לבדיקה, ולא בדוח על העבודה שנעשתה. אם באודיט רואים שחלק מהגרפים אינם נחוצים — נאמר על כך מיד, כדי לא לבזבז זמן על ויזואליזציה לשם ויזואליזציה.

חפצים שנשארים אצל הצוות שלכם

עבודה עם גרפים אינטראקטיביים מסתיימת לא בהדגמה בשיחת וידאו, אלא בחבילת קבצים שהצוות שלכם יכול לפתוח, לקרוא ולשנות ללא עזרתנו. להלן מה בדיוק מתועד בחבילה הנמסרת ולמה כל פריט נחוץ בעבודה היומיומית.

  • תצורת גרפים — מערכי פרמטרים לכל סוג ויזואליזציה: צירים, סקאלות, עיצוב תוויות, התנהגות תיבות רמז, פלטת צבעים, מצבים אדפטיביים. הם מופרדים לקבצים נפרדים ולא מפוזרים בקוד העמוד, כך שגרף חדש מתווסף על ידי העתקת בלוק ועריכת ערכים.
  • סכמת אינטגרציה — מאיפה מגיעים הנתונים, באיזה פורמט, באיזו תדירות ומה קורה כאשר התשובה ריקה או מגיעה חלקית. בנפרד מתוארים מצבי טעינה ושגיאה, כדי שהגרף לא יהפוך למלבן ריק.
  • נוהל עדכון נתונים — מי ואיך משנה את המקור, איך נבדקת תקינות לאחר שינוי מבנה התשובה, אילו שדות קריטיים לציור. זה מסיר סוג של תקלות שבהן הגרף "עובד" אך מציג מספרים שגויים.
  • תיעוד ויזואליזציה — אילו סוגי גרפים מתאימים לאילו מדדים, איך לבחור סקאלה ולא לעוות את הדינמיקה, היכן מסתיימת ויזואליזציה הוגנת ומתחילה מניפולציה על התפיסה.
  • רשימת בדיקה לקבלה — בדיקות לפני פרסום: התנהגות במסכים צרים, קריאות תוויות, תקינות בנפח גדול של נקודות, מהירות ציור, נגישות מהמקלדת.
  • הוראות להרצה מקומית — איך להרים את הפרויקט, מאיפה לקחת נתוני בדיקה ואיך לשחזר בעיה שדיווח המשתמש.
  • יומן שינויים — מה ולמה השתנה בתצורות, כדי שכעבור חצי שנה אף אחד לא יתלבט למה הציר נראה דווקא כך.

החבילה נאספת תוך כדי העבודה, ולא בשבוע האחרון, ולכן עד لح moment ההעברה היא כבר נבדקה על נתונים אמיתיים. תארו את המשימה — נחזור עם הערכה ותוכנית, כולל הרכב החפצים הנמסרים למקרה שלכם.

מקרה בוחן: כיצד סילקנו את ההידרדרות של הגרפים בלוח המחוונים

הלקוח הגיע עם לוח מחוונים אנליטי: למעלה מ-40 גרפים אינטראקטיביים ב-ApexCharts, כל אחד עם סט משלו של סדרות ומתגי תקופה. בפתיחת העמוד הדפדפן נתקע למשך 6-8 שניות, בעת החלפת מסנן הממשק "נתקע" למשך 3-4 שניות, ובמחשבים חלשים הלשונית קרסה בגלל זיכרון. המשתמשים הפסיקו לפתוח את הדוחות — הם הסתכלו על ייצוא בטבלאות.

מה מצאנו בניתוח

פרופיילינג הראה שלושה צווארי בקבוק. הגרפים צוירו מחדש במלואם בכל שינוי מצב, אף שהשתנתה סדרה אחת. הנתונים נמשכו בבקשות נפרדות עבור כל וידג'ט — 40 פניות לשרת עבור טעינה אחת. אובייקטי התרשימים לא הושמדו בעת החלפת תקופה, והזיכרון גדל עם כל החלפת מסנן.

מה שינינו

הפרדנו בין עדכון הנתונים לציור מחדש: בעת החלפת תקופה מעדכנים רק את הסדרות באמצעים המובנים, בלי ליצור מחדש את התרשים. איחדנו את הטעינה לבקשה אחת עם אגרגציה בצד השרת והחזרת סטים מוכנים. הוספנו השמדה מפורשת של המופעים בעת פירוק ואתחול עצל — הגרף נבנה כאשר הוא נכנס לאזור הנראה.

בנפרד הגבלנו את מספר הנקודות לסדרה: עבור תקופות שנתיות הנתונים מאוגדים לפי שבועות, והפירוט נטען בלחיצה.

מדדים לפני ואחרי

מדד לפני אחרי
ציור ראשון של לוח המחוונים 6-8 ש' 1.2-1.5 ש'
תגובה להחלפת מסנן 3-4 ש' 200-400 מ"ש
בקשות לטעינה 40 1
צריכת זיכרון ב-20 החלפות תקופה גידול עד לקריסת הלשונית יציב

בדיקות עומס הרצנו על 50 סשנים במקביל עם החלפת מסננים — זמן התגובה נשמר בטווח של 500 מ"ש, ולא נרשמו דליפות זיכרון. הדוחות שבו להיות כלי עבודה, ולא עמוד שפותחים פעם אחת וסוגרים.

במה שונה הזרמת נתונים מטעינה מקובצת?

טעינה מקובצת מחזירה לגרף את כל מערך הנתונים בתשובה אחת: הדף מבקש פרוסה לתקופה, מקבל אותה בשלמותה ובונה את כל הסדרות בבת אחת. מצב כזה הוא צפוי — מספר הפניות לשרת ידוע מראש, ניתן לשמור את התשובה במטמון, והלקוח מצייר את הגרף פעם אחת ומכאן ואילך רק מצייר מחדש בעת שינוי מסננים.

המגבלה מתגלה במדגמים גדולים: ככל שהתקופה ארוכה יותר וככל שיש יותר נקודות בסדרה, כך התשובה גדולה יותר והרינדור הראשון אורך יותר, וערכים טריים מופיעים רק לאחר הבקשה הבאה.

הזרמת נתונים מחזיקה חיבור פתוח ושולחת נקודות נוספות עם הופעתן — דרך WebSocket או זרם אירועים. השהיית העדכון יורדת לשברי מרווח של הגעת הנתונים, והגרף ויזואלית "חי": המפעיל רואה את שינוי המדד כמעט ברגע האירוע.

המחיר לכך — חיבור מתמיד לכל לקוח והצורך לנהל חוצץ: אם מגיעות יותר נקודות ממה שהגרף מספיק לצייר, הפריימים מתחילים לפגר אחרי המציאות.

הפשרה המרכזית — העומס על השרת. מצב מקובץ יוצר בקשות כבדות נדירות שמתאימות היטב למטמון ולמשוכפלים; מצב זורם — בקשות רבות קלות, אך מתמידות, ומחזיק מצב פתוח לכל מנוי. לכן מצב זורם כמעט תמיד מוגבל: מנוי רק לתקופה הנראית, דילול נקודות במרחק רחוק, ביטול מנוי ביציאה מהלשונית.

בפועל מצבים אלה אינם שוללים זה את זה. היסטוריה של תקופות קודמות נמסרת במקבץ — היא בלתי משתנה ונשמרת במטמון, ואילו המרווח האחרון של הזמן עובר בזרימה. הגרף נבנה על מערך סדרות אחד: נקודות ישנות מגיעות מהפרוסה, חדשות מתווספות עם הגעתן, והמשתמש אינו רואה את התפר בין שני המקורות. את בחירת המצב אנו מצמידים לתרחיש — ניתוח פעם בשעה או ניטור בזמן אמת — ולא לנוחות המימוש.

ספקות טכניים נפוצים לפני ההתחלה

לפני ההתחלה כמעט תמיד אנחנו דנים באותה קבוצת שאלות: כיצד הספרייה תשתלב במערכת הקיימת, מה יקרה לדפדפן עם כמויות נתונים גדולות, מי ואיך יערוך את הגרפים לאחר ההשקה ומה לעשות עם ההיסטוריה שכבר נצברה. להלן תשובות קצרות לכל אחת מהן.

האם זה תואם לפריימוורק ולמערכת הבנייה שלנו?

כן. הספרייה אינה תלויה בפריימוורק מסוים: קיימות עטיפות רשמיות עבור React, Vue ו-Angular, ובשאר המקרים היא מחוברת כמודול רגיל ומאותחלת בנקודת ההרכבה של הרכיב.

אנחנו עוטפים אותה ברכיב עטיפה משלנו — כך עדכון הנתונים, שינוי גודל המכל וניקוי בעת הסרת ההרכבה מנוהלים ממקום אחד, ולא מפוזרים על פני העמוד.

האם הגרף "יתלה" את הדפדפן עם כמויות גדולות?

הפרמטר המרכזי אינו הספרייה עצמה, אלא מספר הנקודות שאנחנו מוסרים לרינדור. בעשרות אלפי נקודות אנחנו מפעילים דילול לפי פיקסלים על המסך ואגרגציה בצד השרת: המשתמש רואה את צורת העקומה, ולא כל מדידה בודדת.

מערכי נתונים כבדים נטענים בעמודים נפרדים עם הגלילה, ואנימציה על סדרות גדולות מושבתת — זה מסיר את העומס העיקרי על הרינדור.

מה עם תמיכה ועריכות לאחר ההשקה?

הגרף הוא קוד במאגר המשותף, ולא הגדרה בפאנל של מישהו אחר: עריכות עוברות בתהליך רגיל של סקירה ופריסה. אנחנו מוסרים תצורות של סדרות, צירים, תיבות מידע ומפרמטים עם הערות, כדי שהצוות שלכם יוכל לשנות תוויות וצבעים בלעדינו. עבור משימות טיפוסיות — סוג גרף חדש, ייצוא לתמונה, סינון לפי תקופה — אנחנו מחזיקים תבניות מוכנות.

איך מעבירים נתונים שכבר נצברו?

אנחנו לא כותבים מחדש את ההיסטוריה: בונים שכבת הכנה שמביאה את הייצואים שלכם לפורמט אחיד של סדרות וצירים. אם הנתונים נמצאים במסד נתונים — אנחנו מוסרים אותם דרך נקודת קצה נפרדת עם מטמון; אם בקבצים — מפרסרים אותם בעת הטעינה. ההעברה מתבצעת במקביל להמחשה הנוכחית, כך שהמעבר מתרחש ללא השבתה ועם אפשרות לחזרה לאחור.

אם השאלה שלכם לא נכללה ברשימה — תארו את המשימה, ונחזור עם הערכה ותוכנית.

נדון במשימה שלכם לחזות נתונים

כדי לחזור עם הערכה ותוכנית, ולא עם מילים כלליות, בשיחה הראשונה אנחנו צריכים שיחה עניינית. להלן מה בדיוק אנחנו מבררים ובאיזה סדר, כדי שתבינו אילו נתונים יידרשו מצדכם.

  • מקורות נתונים. מאיפה מגיעים המספרים: מסד נתונים, שירות פנימי, ייצוא ממערכת חשבונאית או ממשק חיצוני. מבררים את תדירות העדכון — פעם ביום, לפי אירוע או בזמן אמת — מכיוון שזה משפיע על סכימת הטעינה והמטמון.
  • סוגי גרפים ומדדים. אילו תצוגות נדרשות: מגמות קוויות, השוואת קטגוריות, סכומים מצטברים, התפלגויות. כאן גם מגדירים מה בדיוק מחושב בשרת ומה נצבר בדפדפן.
  • תרחישי משתמש. מי צופה בגרפים ומה הוא עושה: מסנן תקופה, משווה מקטעים, מייצא נתונים, עובר מנקודה לפירוט. כל תרחיש — דרישה נפרדת לאינטראקטיביות.
  • נפחים והתנהגות תחת עומס. כמה נקודות בגרף אחד וכמה משתמשים פותחים את לוח המחוונים בו-זמנית. זה קובע אם נדרשת טעינה מדורגת ואיך להגדיר דילול.
  • דרישות טכניות. הסטאק שלכם, דרישות לגישות ולתפקידים, מדיניות שמירת נתונים, מגבלות בדפדפנים ובמכשירים ניידים.
  • עיצוב ומותג. האם יש פריסה, פלטת צבעים, גופנים ממותגים ודרישות למצב כהה — כדי שלא נצטרך לצבוע מחדש את הגרפים לאחר המסירה.
  • לוחות זמנים ועדיפויות. מה חייב לעבוד בגרסה הראשונה ומה אפשר להעביר לשנייה. כך אנחנו בונים תוכנית עבודה עם תאריכים מציאותיים, ולא עם מרווח "ליתר ביטחון".

לאחר השיחה אנחנו חוזרים עם הערכת לוחות זמנים, הרכב השלבים ורשימה של מה שיידרש מצוותכם בכל אחד מהם. תארו את המשימה בצורה נוחה לכם — נחזור עם תוכנית.