Плагинная архитектура Chart.js построена вокруг идеи расширяемого жизненного цикла графика, в который можно «встраиваться» на разных этапах рендеринга и обработки данных. Плагины не изменяют ядро библиотеки напрямую, а работают через заранее определённые точки расширения (hooks), получая доступ к контексту графика.
Ключевая особенность модели — декларативная регистрация поведения, которое автоматически применяется ко всем или выбранным графикам без необходимости модифицировать код построения диаграммы.
Плагин в Chart.js представляет собой объект, содержащий набор функций-хуков и метаданные:
id)Плагины могут быть зарегистрированы на двух уровнях:
Глобальный плагин применяется ко всем графикам, создаваемым после регистрации:
Chart.register({
id: 'customBackground',
beforeDraw(chart) {
const { ctx, chartArea } = chart;
ctx.save();
ctx.fillStyle = '#f5f5f5';
ctx.fillRect(chartArea.left, chartArea.top, chartArea.width, chartArea.height);
ctx.restore();
}
});
После регистрации такой плагин становится частью глобального реестра и участвует в рендеринге каждого экземпляра Chart.
Плагин можно передать непосредственно в конфигурацию конкретного графика:
new Chart(ctx, {
type: 'bar',
data,
options,
plugins: [
{
id: 'onlyThisChartPlugin',
afterDatasetsDraw(chart) {
console.log('Рендер завершён');
}
}
]
});
Локальные плагины ограничены конкретным экземпляром и не влияют на остальные графики.
Плагины взаимодействуют с Chart.js через строго определённые этапы жизненного цикла. Эти хуки вызываются в предсказуемом порядке.
beforeInit(chart)afterInit(chart)На этом этапе доступны базовые структуры графика, но рендер ещё не начался. Часто используется для модификации конфигурации или подготовки данных.
beforeUpdate(chart, args, options)afterUpdate(chart, args, options)Используется для реагирования на изменение данных или конфигурации. Например, можно пересчитать вспомогательные структуры или кэшировать вычисления.
beforeDraw(chart, args, options)На этом этапе можно модифицировать canvas до начала отрисовки элементов графика.
afterDraw(chart, args, options)Позволяет добавлять поверх графика дополнительные визуальные элементы (водяные знаки, аннотации, кастомные слои).
beforeDatasetsDraw(chart, args, options)afterDatasetsDraw(chart, args, options)Эти хуки разделяют рендеринг осей и фоновых элементов от рендеринга самих данных. Это критически важно для наложения кастомной графики поверх или под данными.
beforeEvent(chart, args, options)afterEvent(chart, args, options)Позволяют вмешиваться в систему обработки событий (hover, click, tooltip interactions). Через них можно изменять поведение интерактивности или блокировать события.
resize(chart, size, options)Вызывается при изменении размеров контейнера. Используется для адаптивных вычислений, перерасчёта layout-логики или масштабирования кастомных элементов.
destroy(chart, options)Хук очистки ресурсов. Используется для удаления подписок, таймеров, слушателей событий и освобождения памяти.
Каждый хук получает объект chart, содержащий полное
состояние экземпляра:
chart.data — данные графикаchart.options — конфигурацияchart.ctx — canvas rendering contextchart.width / chart.height — размерыchart.chartArea — область построенияchart.scales — оси координатДополнительно могут передаваться:
args — параметры текущего шагаoptions — настройки плагинаЭтот контекст является основным способом взаимодействия с внутренним состоянием библиотеки.
Если зарегистрировано несколько плагинов, порядок их выполнения определяется:
order или
аналогичные механизмы)Важная особенность: плагины не изолированы друг от друга. Они могут изменять общий canvas и состояние графика, поэтому порядок выполнения критичен для визуального результата.
Chart.js позволяет передавать настройки плагинов через секцию
options.plugins.
options: {
plugins: {
legend: {
display: true
},
tooltip: {
enabled: false
},
customBackground: {
color: '#eeeeee'
}
}
}
Каждый плагин может читать свою секцию конфигурации:
beforeDraw(chart, args, options) {
const color = options.color || 'white';
}
Таким образом достигается изоляция настроек между плагинами.
Плагин может быть активен или деактивирован:
Chart.register /
Chart.unregisterenabled: false (если поддерживается
конфигурацией)options.plugins.<pluginId>.enabledЭто позволяет гибко управлять поведением без удаления кода.
Базовая форма плагина включает идентификатор и набор хуков:
const myPlugin = {
id: 'myPlugin',
beforeInit(chart) {
// подготовка
},
afterDraw(chart) {
const { ctx } = chart;
ctx.save();
ctx.fillStyle = 'rgba(0,0,0,0.1)';
ctx.fillRect(0, 0, chart.width, chart.height);
ctx.restore();
}
};
После этого он может быть зарегистрирован глобально или локально.
Плагины работают напрямую с CanvasRenderingContext2D.
Это означает:
ctx.save()
/ ctx.restore()Любое изменение canvas становится частью финального изображения, поэтому плагины часто реализуют слои:
beforeDraw)afterDatasetsDraw)afterDraw)Через beforeEvent и afterEvent можно
изменять поведение событий:
beforeEvent(chart, args) {
if (args.event.type === 'click') {
args.event.cancelable = false;
}
}
Это позволяет реализовывать:
Несмотря на гибкость, модель имеет ряд ограничений:
Эти особенности требуют аккуратного проектирования плагинов при их совместном использовании в одном графике.