В экосистеме Nivo основная сложность серверного рендеринга связана с тем, что большинство компонентов построено на React и активно использует браузерные API: измерение размеров контейнера, обработку событий, анимации и работу с DOM. При классическом SSR такие зависимости становятся проблемой, поскольку сервер не имеет доступа к DOM и не может корректно выполнить полный рендер интерактивных компонентов.
Пакет @nivo/static решает эту задачу за счёт генерации «облегчённого» представления графиков, лишённого интерактивности и зависимостей от браузерной среды. На сервере формируется статическая версия диаграммы (SVG-разметка или упрощённый набор примитивов), которая затем может быть встроена в HTML и передана клиенту для последующей гидратации или полной замены интерактивным графиком.
Статический слой Nivo строится вокруг принципа разделения:
В пакете @nivo/static используется только первые три слоя. Это позволяет сформировать детерминированный результат, пригодный для серверного выполнения.
Ключевая особенность заключается в том, что результатом работы становится не React-компонент, а сериализуемая SVG-структура.
Обычный SSR React предполагает:
renderToString или
renderToStaticMarkupОднако для Nivo это не всегда возможно, так как:
ResizeObserver@nivo/static обходит эти ограничения, предоставляя отдельный слой генерации SVG без React lifecycle.
Процесс можно описать последовательностью шагов:
Результат не содержит:
Пакет устанавливается отдельно от основной библиотеки Nivo:
npm install @nivo/static
Внутри он представляет собой набор функций для генерации статических графиков, сгруппированных по типам визуализаций.
Типичная структура:
@nivo/static
├── bar
├── line
├── pie
├── heatmap
├── sankey
└── shared (scales, layouts, utils)
Основной пример использования связан с генерацией столбчатых диаграмм.
import { generateBar } from '@nivo/static'
const data = [
{ country: 'A', value: 40 },
{ country: 'B', value: 80 },
{ country: 'C', value: 60 }
]
const chart = generateBar({
width: 600,
height: 400,
data,
indexBy: 'country',
keys: ['value'],
margin: { top: 20, right: 20, bottom: 50, left: 60 }
})
const svg = chart.svg
Результатом является SVG-строка, которую можно вставить напрямую в HTML:
<div>
<!-- server generated -->
<svg viewBox="0 0 600 400">
...
</svg>
</div>
Линейные графики требуют дополнительной обработки точек и интерполяции.
import { generateLine } from '@nivo/static'
const data = [
{
id: 'series-1',
data: [
{ x: 0, y: 10 },
{ x: 1, y: 20 },
{ x: 2, y: 15 }
]
}
]
const chart = generateLine({
width: 700,
height: 300,
data,
xScale: { type: 'point' },
yScale: { type: 'linear', min: 0, max: 30 }
})
Внутренне происходит:
d атрибутКруговые диаграммы в @nivo/static строятся через вычисление угловых сегментов.
import { generatePie } from '@nivo/static'
const data = [
{ id: 'A', value: 30 },
{ id: 'B', value: 50 },
{ id: 'C', value: 20 }
]
const chart = generatePie({
width: 400,
height: 400,
data
})
Внутренний алгоритм:
SVG, генерируемый @nivo/static, обладает рядом характеристик:
onClick,
onMouseMove)Это делает его пригодным для:
В SSR-фреймворках вроде Next.js статический слой используется для предварительного рендеринга графиков на сервере.
Пример интеграции:
import { generateBar } from '@nivo/static'
export async function getServerSideProps() {
const data = await fetchData()
const chart = generateBar({
width: 800,
height: 500,
data,
indexBy: 'name',
keys: ['value']
})
return {
props: {
svg: chart.svg
}
}
}
На клиенте SVG вставляется без необходимости повторной генерации.
Классический Nivo-компонент после SSR требует гидратации:
Статический вариант:
Это уменьшает нагрузку на клиентскую часть, но исключает интерактивность.
Использование @nivo/static накладывает архитектурные ограничения:
Сильной стороной является предсказуемая стоимость вычислений:
При массовом рендеринге (например, генерация тысяч графиков) основной лимит определяется CPU, а не браузерными ограничениями.
В SSG-подходах (например, Gatsby или Next.js Static Export) @nivo/static позволяет:
Это особенно эффективно для аналитических дашбордов с неизменяемыми данными.
Внутренняя архитектура допускает создание собственных генераторов на основе базовых утилит:
Это позволяет строить специализированные графики, сохраняя совместимость со статическим рендерингом.
@Nivo/static поддерживает тот же формат данных, что и основной Nivo:
Это снижает стоимость миграции между интерактивным и статическим режимами.
Ключевым элементом является использование SVG не как финального DOM-элемента, а как промежуточного представления:
Это делает @nivo/static универсальным инструментом серверной визуализации.