Библиотека vega-embed служит связующим слоем между
декларативными спецификациями визуализаций (Vega и Vega-Lite) и их
отображением в DOM. Основная задача инструмента — упростить процесс
рендеринга графиков, скрывая внутренние этапы компиляции, инициализации
движка Vega и настройки взаимодействия.
В типичном сценарии vegaEmbed принимает контейнер и
спецификацию визуализации, после чего выполняет полный цикл подготовки:
преобразование Vega-Lite в Vega (если требуется), компиляцию, создание
runtime-движка и отрисовку SVG или Canvas.
Функция имеет следующий общий вид:
vegaEmbed(container, spec, options?)
Возвращаемое значение — Promise, который резолвится
объектом:
{
view: View, // экземпляр Vega View
spec: Object, // финальная Vega-спецификация
embedOptions: Object
}
Минимальный пример использования:
import embed from 'vega-embed';
const spec = {
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": { "values": [10, 20, 30, 40] },
"mark": "bar",
"encoding": {
"x": { "field": "data", "type": "quantitative" }
}
};
embed('#vis', spec);
Процесс выполнения включает:
Vega-Lite используется как высокоуровневое описание графиков.
vegaEmbed автоматически трансформирует его в полноценную
Vega-спецификацию.
Пример:
const spec = {
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"description": "Простой линейный график",
"data": {
"values": [
{ "x": 1, "y": 2 },
{ "x": 2, "y": 3 },
{ "x": 3, "y": 5 }
]
},
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" }
}
};
embed('#vis', spec);
Внутренне выполняется компиляция через механизм Vega-Lite, после чего результат передаётся в Vega runtime.
При передаче нативной Vega-спецификации этап компиляции пропускается.
const spec = {
"$schema": "https://vega.github.io/schema/vega/v5.json",
"width": 400,
"height": 200,
"data": [
{
"name": "table",
"values": [1, 2, 3, 4]
}
],
"marks": [
{
"type": "rect",
"from": { "data": "table" },
"encode": {
"enter": {
"x": { "scale": "xscale", "field": "data" }
}
}
}
]
};
embed('#vis', spec);
Объект options управляет поведением рендера и
инструментами взаимодействия.
Определяет способ отрисовки:
"canvas" — высокая производительность при больших
данных"svg" — лучшая интерактивность и масштабированиеembed('#vis', spec, { renderer: 'canvas' });
Управляет панелью действий (export, view source и т.д.):
embed('#vis', spec, {
actions: false
});
или детальная настройка:
embed('#vis', spec, {
actions: {
export: true,
source: false,
compiled: false
}
});
Позволяют переопределить размеры визуализации:
embed('#vis', spec, {
width: 600,
height: 300
});
Поддержка встроенных тем оформления:
embed('#vis', spec, {
theme: 'dark'
});
Включение/настройка всплывающих подсказок:
embed('#vis', spec, {
tooltip: true
});
container может задаваться тремя способами:
embed('#chart', spec);
const el = document.getElementById('chart');
embed(el, spec);
const div = document.createElement('div');
document.body.appendChild(div);
embed(div, spec);
При отсутствии контейнера создаётся ошибка выполнения, так как рендер невозможен без DOM-привязки.
vegaEmbed возвращает Promise, что позволяет управлять
процессом загрузки и инициализации:
embed('#vis', spec)
.then(result => {
const view = result.view;
})
.catch(error => {
console.error(error);
});
Экземпляр view предоставляет доступ к низкоуровневому
API Vega Runtime.
Перерисовка осуществляется либо повторным вызовом
vegaEmbed, либо через методы view.
embed('#vis', newSpec);
result.view
.change('table', vega.changeset().insert(newData))
.run();
Такой подход позволяет избегать полного пересоздания графика.
Ошибки могут возникать на этапах:
Типичная обработка:
embed('#vis', spec)
.catch(err => {
console.error('Ошибка визуализации:', err);
});
При отладке полезно включать режим отображения compiled spec через options.
import embed from 'vega-embed';
const embed = require('vega-embed');
<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>
После подключения функция становится доступной как
vegaEmbed.
Одной из ключевых особенностей является встроенный компилятор Vega-Lite. Он выполняет:
В результате пользователь работает только с декларативным уровнем, не взаимодействуя с низкоуровневым Vega API напрямую.
Экземпляр view поддерживает систему событий:
view.addEventListener('click', function(event, item) {
console.log(item);
});
Также поддерживаются:
Визуализации выполняются в рамках ограниченного runtime:
Это снижает риск выполнения произвольного кода при загрузке внешних спецификаций.
import { useEffect, useRef } from 'react';
import embed from 'vega-embed';
function Chart({ spec }) {
const ref = useRef(null);
useEffect(() => {
embed(ref.current, spec);
}, [spec]);
return <div ref={ref} />;
}
mounted() {
embed(this.$refs.chart, this.spec);
}
Ключевые факторы влияния:
canvas для больших датасетовПри высоконагруженных сценариях предпочтительно повторно использовать
view, а не пересоздавать embed.
Изменение данных через реактивные потоки с пересборкой spec.
Использование view.change() для минимизации затрат на
рендер.
Комбинация embed для инициализации и view API для обновлений данных.