Розробка інтерактивних графіків на ApexCharts для сайту

Графіки на дашборді гальмують, втрачають дані при оновленні та лякають користувачів? Ми проєктуємо та впроваджуємо інтерактивні графіки на ApexCharts під ключ — від підключення джерел даних до плавної візуалізації на великих обсягах. Ваша команда отримує візуалізацію, яка скорочує час аналізу та не деградує при зростанні навантаження.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка інтерактивних графіків на ApexCharts для сайту
Простий
від 1 дня до 3 днів
Часті запитання

Чому інтерактивні графіки на ApexCharts ламаються у продакшені

Графік, який на демо-даних із сотні точок відкривався миттєво, на реальному потоці починає гальмувати: спочатку підлаглює при наведенні, потім перестає встигати за оновленнями, а через кілька годин роботи вкладка з'їдає пам'ять і падає.

Причина майже завжди одна — бібліотека перемальовує весь набір даних цілком при кожній зміні, а не лише змінену ділянку.

Далі вмикається ланцюжок деградації. Кожне оновлення створює новий екземпляр графіка поверх старого, і якщо попередній не знищено явно, слухачі подій і таймери залишаються висіти — це класичний витік пам'яті в браузері. Вона не видна на тестах, але на довгій сесії вкладка зростає в обсязі, поки не впреться в ліміт.

Окрема історія — рендеринг великих масивів даних: десятки тисяч точок на графіку не потрібні користувачеві, він усе одно бачить кілька сотень пікселів по ширині, але браузер чесно малює кожну.

Продуктивність графіків упирається в три речі: обсяг даних, частота оновлень і кількість живих екземплярів на сторінці.

Коли дашборд тримає десяток віджетів, кожен зі своїм таймером опитування, вони починають конкурувати за головний потік — інтерфейс завмирає на час відрисовки, і це вже не косметика, а відмова сценарію.

Розбираємо, як це закривається: де різати дані до відрисовки, як вибудувати життєвий цикл екземплярів і що перевіряти перед викаткою, щоб графік переживав не демо, а реальне навантаження.

Що дає правильно спроєктована візуалізація даних

Правильно спроєктована візуалізація — це не «гарні графіки», а передбачувана робота інтерфейсу на реальних обсягах. Коли на дашборді 10-15 діаграм, кожна з яких тягне свій набір даних, браузер витрачає ресурси на перемальовування всього полотна при кожному оновленні.

Ми розносимо рендеринг по незалежних шарах: важкі серії вантажаться окремо від легких, оновлення однієї діаграми не зачіпає сусідні. Час до інтерактивності скорочується з десятків секунд до 1-2 — користувач починає працювати з даними, не чекаючи, поки домалюється останній графік.

Стабільність під навантаженням тримається на трьох речах: агрегація на стороні сервера, обмеження кількості точок на серію і скасування застарілих запитів.

Якщо користувач десять разів перемкнув період, в інтерфейс повернеться тільки остання відповідь — решта відкидаються, а не накладаються одна на одну.

При піках, коли до дашборду одночасно звертаються десятки людей, інтерфейс не «залипає»: важкі вибірки рахуються заздалегідь і віддаються з кешу, а не перераховуються на кожен запит.

Окрема стаття — навантаження на інтерфейс. Анімації, тултіпи і зум за замовчуванням увімкнені, але на великих серіях вони з'їдають кадри і перетворюють перетягування в слайд-шоу. Ми вимикаємо зайве там, де це не впливає на сенс, і залишаємо плавність тільки на ключових графіках.

За нашою практикою, після такої оптимізації кількість звернень у підтримку з формулюванням «дашборд не вантажиться» падає в рази — люди перестають чекати і оновлювати сторінку.

Ефект вимірний: швидкість відмальовування, стабільність при пікових навантаженнях і зниження кількості інцидентів — це те, що видно в метриках, а не тільки на око.

Режими підключення даних: порівняння підходів

Вибір способу подачі даних визначає не лише навантаження на сервер, а й те, як графік поводиться при масштабуванні: скільки точок він тримає без просідань, як швидко реагує на фільтри та що відбувається при обриві з'єднання. Нижче — три робочі схеми, між якими реально обирають на проєктах.

Варіант Коли підходить Обмеження
Пакетне завантаження Звіти, дашборди з рідкісним оновленням, історичні зрізи Дані застарівають між запитами; при великому обсязі зростає час першого рендерингу
Потокова передача Моніторинг, live-метрики, операційні панелі Постійне з'єднання та навантаження на сервер; потрібен буфер і проріджування точок
Гібридна схема Довга історія + живий «хвіст», важкі фільтри Складніше у зневадженні: два джерела потрібно синхронізувати за часом і шкалою

Обмеження рендерингу

Браузер комфортно малює тисячі точок, але деградація починається непомітно: спочатку падає плавність анімації, потім підгальмовують підказки при наведенні.

Тому потокові дані майже завжди проріджують на стороні клієнта, а історію підвантажують агрегатами за інтервалами — година, день, тиждень.

Як обираємо схему

Дивимося на частоту оновлення та глибину історії. Якщо графік оновлюється раз на хвилину і рідше — пакетне завантаження простіше й передбачуваніше.

Якщо дані йдуть безперервно, додаємо буфер, обмежуємо вікно відображення та вмикаємо відкат до пакетного режиму при втраті з'єднання — так панель не «замерзає» на очах у користувача.

Як ми впроваджуємо інтерактивні графіки: етапи робіт

Роботу починаємо з аудиту візуалізації: дивимося, які дані вже є, у якому вигляді вони віддаються і що саме має потрапити на графік.

На цьому етапі фіксуємо джерела, частоту оновлення та обсяг точок — від цього залежить, чи малюємо ми статичний зріз чи потік, який оновлюється в реальному часі.

  1. Аудит візуалізації. Розбираємо поточні звіти та дашборди, відзначаємо, які метрики дублюються, які не читаються, де користувач залишає сторінку. На виході — список графіків з пріоритетом і зрозумілим призначенням кожного.
  2. Схема потоків даних. Визначаємо, звідки надходять дані, як часто змінюються і чи потрібна агрегація на стороні сервера. Якщо точок тисячі, частину зводимо заздалегідь — інакше браузер користувача почне гальмувати на відрисовці.
  3. Прототип і налаштування графіків. Збираємо робочий макет на ApexCharts: тип діаграм, осі, тултіпи, фільтри за періодом, поведінку при наведенні та на вузьких екранах. Узгоджуємо з вами до того, як почнемо вбудовувати в бойові сторінки.
  4. Інтеграція в інтерфейс. Підключаємо графіки до реальних даних, налаштовуємо стани завантаження та порожніх вибірок, щоб користувач бачив зрозумілу відповідь, а не порожній блок. Окремо опрацьовуємо поведінку при обриві зв'язку з джерелом.
  5. Перевірка навантаження. Проганяємо сторінки з великим обсягом точок і частим оновленням, заміряємо, як поводиться інтерфейс при десятках графіків на одному екрані. Оптимізуємо до того, як це помітить користувач.
  6. Передача документації. Віддаємо опис структури даних, налаштування графіків та інструкцію з додавання нових діаграм. Ваша команда зможе розширювати дашборд без нас.

Кожен етап закінчується перевірюваним результатом, а не звітом про виконану роботу. Якщо на аудиті видно, що частина графіків не потрібна, — скажемо про це відразу, щоб не витрачати час на візуалізацію заради візуалізації.

Артефакти, які залишаються у вашої команди

Робота з інтерактивними графіками закінчується не демонстрацією на дзвінку, а пакетом файлів, який ваша команда може відкрити, прочитати й змінити без нас. Нижче — що саме фіксується в передаваному комплекті та навіщо кожна позиція потрібна в щоденній роботі.

  • Конфігурація графіків — набори параметрів за кожним типом візуалізації: осі, шкали, форматування підписів, поведінка підказок, палітра, адаптивні режими. Винесені в окремі файли, а не розмазані по коду сторінки, тому новий графік додається копіюванням блоку й правкою значень.
  • Схема інтеграції — звідки надходять дані, у якому вигляді, з якою періодичністю і що відбувається при порожній або частково отриманій відповіді. Окремо описані стани завантаження й помилки, щоб графік не перетворювався на порожній прямокутник.
  • Регламент оновлення даних — хто і як змінює джерело, як перевіряється коректність після зміни структури відповіді, які поля критичні для відображення. Це знімає клас збоїв, коли графік «працює», але показує неправильні числа.
  • Документація з візуалізації — які типи графіків доречні для яких метрик, як вибирати масштаб і не спотворювати динаміку, де закінчується чесна візуалізація і починається маніпуляція сприйняттям.
  • Чек-лист приймання — перевірки перед публікацією: поведінка на вузьких екранах, читабельність підписів, коректність при великому обсязі точок, швидкість відображення, доступність з клавіатури.
  • Інструкція з локального запуску — як підняти проєкт, де взяти тестові дані й як відтворити проблему, про яку повідомив користувач.
  • Журнал змін — що і навіщо змінювалося в конфігураціях, щоб через пів року ніхто не гадав, чому вісь виглядає саме так.

Комплект збирається по ходу робіт, а не в останній тиждень, тому на момент передачі він уже перевірений на реальних даних. Опишіть задачу — повернемося з оцінкою та планом, включно зі складом передаваних артефактів під ваш випадок.

Кейс: як ми усунули деградацію графіків на дашборді

Замовник прийшов із дашбордом аналітики: 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, а в інших випадках вона підключається як звичайний модуль і ініціалізується в точці монтування компонента.

Ми обгортаємо її у власний компонент-обгортку — тоді оновлення даних, ресайз контейнера і очищення при розмонтуванні керуються з одного місця, а не розмазані по сторінці.

Чи не «повісить» графік браузер на великих обсягах?

Ключовий параметр — не сама бібліотека, а кількість точок, які ми віддаємо на відрисовку. На десятках тисяч точок вмикаємо проріджування за пікселями екрана і агрегацію на стороні сервера: користувач бачить форму кривої, а не кожне вимірювання.

Важкі набори завантажуємо посторінково в міру прокручування, анімацію на великих серіях вимикаємо — це знімає основне навантаження на відрисовку.

Що з підтримкою і правками після запуску?

Графік — це код у спільному репозиторії, а не налаштування в чужій панелі: правки йдуть через звичайний процес рев'ю і викочування. Ми передаємо конфігурації серій, осі, тултипи і форматери з коментарями, щоб ваша команда могла змінювати підписи і кольори без нас.

Для типових задач — новий тип графіка, експорт у зображення, фільтр за періодом — тримаємо готові шаблони.

Як переносимо вже накопичені дані?

Історію не переписуємо: будуємо шар підготовки, який приводить ваші вивантаження до єдиного формату серій і осей. Якщо дані лежать у базі — віддаємо їх через окремий ендпоінт з кешуванням; якщо у файлах — розбираємо при завантаженні.

Міграція йде паралельно з поточною візуалізацією, тому перемикання відбувається без простою і з можливістю відкату.

Якщо вашого питання не було в списку — опишіть задачу, повернемося з оцінкою і планом.

Обговоримо ваше завдання з візуалізації даних

Щоб повернутися з оцінкою та планом, а не із загальними словами, на першому дзвінку нам потрібна предметна розмова. Нижче — що саме ми уточнюємо і в якому порядку, щоб ви розуміли, які дані знадобляться з вашого боку.

  • Джерела даних. Звідки надходять цифри: база, внутрішній сервіс, вивантаження з облікової системи або сторонній інтерфейс. Уточнюємо частоту оновлення — раз на добу, за подією чи в реальному часі, — бо від цього залежить схема завантаження та кешування.
  • Типи графіків і метрики. Які подання потрібні: лінійні тренди, порівняння категорій, накопичувальні суми, розподіли. Тут же фіксуємо, що саме обчислюється на сервері, а що агрегується в браузері.
  • Сценарії користувача. Хто дивиться графіки і що робить: фільтрує період, порівнює сегменти, вивантажує дані, переходить за точкою в деталізацію. Кожен сценарій — окрема вимога до інтерактивності.
  • Обсяги та поведінка під навантаженням. Скільки точок в одному графіку і скільки користувачів одночасно відкривають дашборд. Це визначає, чи потрібне посторінкове підвантаження і як налаштовувати проріджування.
  • Технічні вимоги. Ваш стек, вимоги до доступів і ролей, політика зберігання даних, обмеження щодо браузерів і мобільних пристроїв.
  • Дизайн і бренд. Чи є макет, палітра, фірмові шрифти та вимоги до темної теми — щоб графіки не довелося перефарбовувати після здачі.
  • Терміни та пріоритети. Що має працювати в першій версії, а що можна винести в другу. Так ми збираємо план робіт з реалістичними датами, а не із запасом «про всяк випадок».

Після дзвінка ми повертаємося з оцінкою термінів, складом етапів і списком того, що знадобиться від вашої команди на кожному з них. Опишіть завдання у зручній формі — повернемося з планом.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060