Chart.js построена на модульной архитектуре, в которой большинство
функциональности подключается явно через регистрацию компонентов. В
версиях 3 и выше библиотека перестала включать всё «из коробки», что
позволило значительно уменьшить размер сборки и улучшить tree-shaking.
Центральным механизмом подключения частей библиотеки является метод
Chart.register().
Архитектура Chart.js разделяет функциональность на несколько типов сущностей:
По умолчанию ни один из этих компонентов не активен автоматически. Перед созданием графика они должны быть зарегистрированы в глобальном реестре Chart.js.
Метод Chart.register() принимает произвольное количество
аргументов, каждый из которых является классом или объектом компонента
Chart.js.
Chart.register(component1, component2, component3);
Каждый переданный модуль добавляется в внутренний реестр, после чего становится доступным для использования при создании экземпляров графиков.
Регистрация является глобальной: один раз зарегистрированный компонент становится доступным для всех последующих графиков на странице.
Для построения линейного графика требуется минимальный набор: контроллер, элемент точки, элемент линии и оси.
import {
Chart,
LineController,
LineElement,
PointElement,
LinearScale,
CategoryScale
} from 'chart.js';
Chart.register(
LineController,
LineElement,
PointElement,
LinearScale,
CategoryScale
);
Без регистрации хотя бы одного из этих компонентов Chart.js не сможет корректно отрисовать график и выдаст ошибку о недостающем элементе или скейле.
Каждый тип графика требует собственного контроллера и набора элементов.
import {
Chart,
BarController,
BarElement,
CategoryScale,
LinearScale
} from 'chart.js';
Chart.register(
BarController,
BarElement,
CategoryScale,
LinearScale
);
import {
Chart,
PieController,
ArcElement
} from 'chart.js';
Chart.register(
PieController,
ArcElement
);
import {
Chart,
RadialLinearScale,
RadarController,
PointElement,
LineElement,
Filler
} from 'chart.js';
Chart.register(
RadialLinearScale,
RadarController,
PointElement,
LineElement,
Filler
);
Каждый из этих примеров демонстрирует важный принцип: Chart.js не включает зависимости автоматически, а требует явного указания всех используемых частей.
Контроллеры определяют, как именно интерпретируются данные и какой тип графика будет построен. Например:
LineController отвечает за линейный график;BarController управляет столбчатыми диаграммами;PieController используется для круговых графиков.Регистрация контроллера является обязательным шагом, без которого
экземпляр Chart не сможет сопоставить type с
реализацией.
Chart.register(LineController);
После регистрации становится возможным использование:
new Chart(ctx, {
type: 'line',
data: {...}
});
Скейлы отвечают за преобразование данных в координаты. Наиболее часто используемые:
CategoryScale — категориальная ось (обычно X);LinearScale — числовая ось;TimeScale — временная шкала;LogarithmicScale — логарифмическая шкала.Пример регистрации нескольких скейлов:
Chart.register(CategoryScale, LinearScale, TimeScale);
Отсутствие нужного скейла приводит к ошибке построения графика, даже если данные корректны.
Элементы отвечают за визуальное представление данных:
PointElement — точки на графике;LineElement — линии между точками;BarElement — столбцы;ArcElement — сегменты круговых диаграмм.Пример регистрации элементов:
Chart.register(PointElement, LineElement);
Элементы тесно связаны с контроллерами: контроллер определяет поведение, а элементы — визуализацию.
Плагины расширяют функциональность Chart.js, добавляя:
Пример регистрации стандартного плагина:
import { Chart, Legend, Tooltip } from 'chart.js';
Chart.register(Legend, Tooltip);
После регистрации плагины автоматически применяются ко всем графикам.
Регистрация через Chart.register() выполняется один раз
на уровне модуля. Повторная регистрация одного и того же компонента не
приводит к ошибке, но является избыточной операцией.
Глобальность означает:
Chart;Современная структура Chart.js рассчитана на использование с бандлерами (Webpack, Vite, Rollup). При использовании ES-модулей и явной регистрации достигается оптимизация размера сборки.
Без регистрации импортированные, но не зарегистрированные компоненты будут исключены из итогового бандла.
Пример корректной минимальной сборки:
import { Chart } from 'chart.js';
import { LineController, LineElement, PointElement } from 'chart.js';
import { CategoryScale, LinearScale } from 'chart.js';
Chart.register(
LineController,
LineElement,
PointElement,
CategoryScale,
LinearScale
);
Наиболее частые ошибки при работе:
Эти ошибки напрямую связаны с пропуском шага регистрации.
Chart.js позволяет создавать собственные расширения: элементы, контроллеры и плагины. Они регистрируются так же, как встроенные компоненты.
class CustomElement {
// реализация элемента
}
Chart.register(CustomElement);
После регистрации кастомный компонент становится частью внутреннего реестра и может использоваться в конфигурации графика.
Механизм регистрации выполняет роль централизованного реестра зависимостей. Он обеспечивает:
Именно через Chart.register() библиотека Chart.js
переходит от монолитной модели к компонентной архитектуре, где каждый
график собирается из отдельных независимых частей.