Для работы с графиками в приложениях на SvelteKit широко используется библиотека Chart.js. Она предоставляет гибкий и мощный API для визуализации данных через линейные, столбчатые, круговые диаграммы и другие типы графиков. В SvelteKit интеграция строится на компонентах и реактивности, что позволяет динамически обновлять графики при изменении данных.
Установка библиотеки осуществляется через npm:
npm install chart.js
Для работы в SvelteKit рекомендуется использовать
onMount для инициализации графика, чтобы гарантировать, что
DOM уже отрисован:
<script lang="ts">
import { onMount } from 'svelte';
import { Chart, registerables } from 'chart.js';
Chart.register(...registerables);
let chartCanvas: HTMLCanvasElement;
let chart: Chart;
const data = {
labels: ['Январь', 'Февраль', 'Март', 'Апрель'],
datasets: [{
label: 'Продажи',
data: [150, 200, 180, 220],
backgroundColor: 'rgba(75, 192, 192, 0.2)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1
}]
};
const config = {
type: 'bar',
data,
options: {
responsive: true,
plugins: {
legend: { position: 'top' },
title: { display: true, text: 'Месячные продажи' }
}
}
};
onMount(() => {
chart = new Chart(chartCanvas, config);
});
</script>
<canvas bind:this={chartCanvas}></canvas>
Одним из сильных преимуществ SvelteKit является реактивность. Для динамического обновления графиков данные можно связывать с реактивными переменными:
<script lang="ts">
import { onMount } from 'svelte';
import { Chart, registerables } from 'chart.js';
Chart.register(...registerables);
let chartCanvas: HTMLCanvasElement;
let chart: Chart;
let salesData = [150, 200, 180, 220];
const data = {
labels: ['Январь', 'Февраль', 'Март', 'Апрель'],
datasets: [{
label: 'Продажи',
data: salesData,
backgroundColor: 'rgba(153, 102, 255, 0.2)',
borderColor: 'rgba(153, 102, 255, 1)',
borderWidth: 1
}]
};
const config = { type: 'bar', data, options: { responsive: true } };
onMount(() => { chart = new Chart(chartCanvas, config); });
$: if (chart) {
chart.data.datasets[0].data = salesData;
chart.update();
}
</script>
<canvas bind:this={chartCanvas}></canvas>
При изменении массива salesData график автоматически
перерисовывается благодаря реактивному блоку $:.
Chart.js поддерживает множество типов диаграмм,
каждый из которых можно кастомизировать через options и
plugins.
tension), цвет
линий, точки данных и их размеры.tooltip).Пример линейного графика с кривыми:
const data = {
labels: ['Неделя 1', 'Неделя 2', 'Неделя 3', 'Неделя 4'],
datasets: [{
label: 'Посещаемость',
data: [50, 75, 60, 90],
borderColor: 'rgba(255, 99, 132, 1)',
backgroundColor: 'rgba(255, 99, 132, 0.2)',
tension: 0.4
}]
};
const config = { type: 'line', data, options: { responsive: true } };
Chart.js предоставляет плагины для расширения
функционала: подсказки, легенды, анимация, zoom/pan. Для SvelteKit можно
использовать их через конфигурацию plugins:
import zoomPlugin from 'chartjs-plugin-zoom';
Chart.register(zoomPlugin);
const config = {
type: 'line',
data,
options: {
plugins: {
zoom: {
zoom: { wheel: { enabled: true }, mode: 'x' },
pan: { enabled: true, mode: 'x' }
}
}
}
};
При работе с большими массивами данных важно учитывать производительность:
chart.update('none') для пакетного
обновления без анимации.Chart.js поддерживает смешанные типы графиков, что позволяет объединять линейные и столбчатые диаграммы в одном компоненте:
const config = {
type: 'bar',
data: {
labels: ['Январь', 'Февраль', 'Март'],
datasets: [
{ type: 'line', label: 'Средний доход', data: [200, 250, 300], borderColor: 'blue' },
{ type: 'bar', label: 'Продажи', data: [150, 200, 180], backgroundColor: 'green' }
]
},
options: { responsive: true }
};
Такой подход помогает визуализировать зависимости и сравнения между разными наборами данных в одной диаграмме.
Для получения данных с сервера или API используется load
функция SvelteKit:
<script lang="ts">
import { onMount } from 'svelte';
import { Chart, registerables } from 'chart.js';
Chart.register(...registerables);
let chartCanvas: HTMLCanvasElement;
let chart: Chart;
let apiData = [];
onMount(async () => {
const res = await fetch('/api/sales');
apiData = await res.json();
const data = {
labels: apiData.map(d => d.month),
datasets: [{ label: 'Продажи', data: apiData.map(d => d.value) }]
};
chart = new Chart(chartCanvas, { type: 'bar', data, options: { responsive: true } });
});
</script>
<canvas bind:this={chartCanvas}></canvas>
Динамические данные могут обновляться через реактивные блоки, обеспечивая актуальную визуализацию без перезагрузки страницы.
Chart.js поддерживает полное управление стилем графиков:
const options = {
responsive: true,
plugins: {
legend: { labels: { font: { size: 14 }, color: '#333' } },
title: { display: true, text: 'Продажи', font: { size: 18 } }
},
scales: {
y: { beginAtZero: true, ticks: { color: '#555', font: { size: 12 } } },
x: { ticks: { color: '#555', font: { size: 12 } } }
}
};
Эта гибкость позволяет создавать корпоративные дашборды и аналитические панели с единым визуальным стилем, полностью управляемым через конфигурацию Chart.js в SvelteKit.