Vega и Vega-Lite распространяются как набор npm-пакетов и подключаются в JavaScript-проектах через стандартную систему управления зависимостями Node.js.
Базовая установка выполняется через npm:
npm install vega
npm install vega-lite
В большинстве практических сценариев дополнительно устанавливается пакет для рендеринга:
npm install vega-embed
Ключевой момент архитектуры: Vega-Lite не рендерит графики напрямую. Он компилируется в спецификацию Vega, которая затем интерпретируется движком Vega.
Современные сборщики (Vite, Webpack, Rollup) используют ES Modules:
import embed from 'vega-embed';
import vegaLite from 'vega-lite';
Типичная цепочка работы:
Пример минимальной спецификации:
const spec = {
data: { values: [
{category: "A", value: 28},
{category: "B", value: 55}
]},
mark: "bar",
encoding: {
x: {field: "category", type: "nominal"},
y: {field: "value", type: "quantitative"}
}
};
Рендеринг через vega-embed:
import embed from 'vega-embed';
embed('#vis', spec);
Для быстрых прототипов используется подключение через CDN:
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
Рендеринг осуществляется через глобальный объект:
<div id="vis"></div>
<script>
const spec = {
mark: "line",
data: { values: [
{x: 1, y: 3},
{x: 2, y: 5},
{x: 3, y: 2}
]},
encoding: {
x: {field: "x", type: "quantitative"},
y: {field: "y", type: "quantitative"}
}
};
vegaEmbed("#vis", spec);
</script>
В сборочных системах важны корректные зависимости и обработка JSON-спецификаций.
Vite автоматически поддерживает ESM-модули:
import embed from 'vega-embed';
import spec from './chart.json';
embed('#vis', spec);
В Webpack иногда требуется настройка JSON-лоадера (в новых версиях встроен):
import embed from 'vega-embed';
import spec from './chart.json';
embed('#vis', spec);
Vega-Lite является надстройкой над Vega, поэтому перед рендерингом происходит трансформация:
import vegaLite from 'vega-lite';
const vgSpec = vegaLite.compile(spec).spec;
На выходе получается полноценная Vega-спецификация:
import vega from 'vega';
const view = new vega.View(vega.parse(vgSpec))
.renderer('canvas')
.initialize('#vis')
.run();
Node.js применяется для генерации графиков на сервере (PNG, SVG, PDF через дополнительные библиотеки).
Установка:
npm install vega vega-lite canvas
Пример серверного рендеринга:
import vega from 'vega';
import vegaLite from 'vega-lite';
import fs from 'fs';
const spec = {
mark: "bar",
data: { values: [
{a: "X", b: 10},
{a: "Y", b: 20}
]},
encoding: {
x: {field: "a", type: "nominal"},
y: {field: "b", type: "quantitative"}
}
};
const vgSpec = vegaLite.compile(spec).spec;
const view = new vega.View(vega.parse(vgSpec), {
renderer: 'none'
});
view.toSVG()
.then(svg => fs.writeFileSync('chart.svg', svg));
Обе библиотеки предоставляют типы:
npm install --save-dev @types/vega @types/vega-lite
Использование строгой типизации позволяет проверять корректность спецификаций на этапе компиляции:
import { TopLevelSpec } from 'vega-lite';
const spec: TopLevelSpec = {
mark: "point",
data: { values: [] },
encoding: {}
};
Vega использует разные движки:
Настройка выполняется при создании View:
new vega.View(vega.parse(spec))
.renderer('svg')
.initialize('#vis')
.run();
При подключении через CDN создаются глобальные объекты:
vegavegaLitevegaEmbedЗависимости должны подключаться в строгом порядке:
Нарушение порядка приводит к ошибкам компиляции спецификаций.
Vega и Vega-Lite развиваются синхронно, но версии не всегда строго совпадают.
Типовая связка:
Несовместимость версий приводит к:
В монорепозиториях важно избегать дублирования зависимостей:
npm dedupe
или через pnpm:
pnpm add vega vega-lite
Vega-Lite спецификации обычно хранятся как JSON:
{
"mark": "area",
"data": { "values": [] },
"encoding": {}
}
Импорт возможен напрямую:
import spec from './vis.json' assert { type: 'json' };
Для встраивания в DOM используется контейнер:
<div id="vis"></div>
и функция embed:
vegaEmbed('#vis', spec, {
actions: false
});
Параметр actions отключает панель экспорта и просмотра
спецификации.
Архитектура основана на слоях:
Эта структура позволяет разделять описание графика и механизм его отрисовки, обеспечивая переносимость между средами браузера и Node.js.