SVG.js предоставляет удобный API для работы с векторной графикой на стороне клиента. Однако, библиотека также может использоваться для генерации SVG на сервере, что особенно важно для динамических изображений, графиков, отчетов и экспорта SVG в другие форматы.
Для работы на сервере требуется Node.js. SVG.js полностью совместима с Node.js при использовании jsdom для эмуляции DOM:
const { JSDOM } = require('jsdom');
const { SVG } = require('@svgdotjs/svg.js');
// Создание виртуального DOM
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>');
global.document = dom.window.document;
global.window = dom.window;
// Инициализация SVG.js
const draw = SVG(document.body);
Ключевой момент: на сервере отсутствует настоящий
DOM, поэтому jsdom позволяет создавать виртуальный DOM, на
который SVG.js может «рисовать».
Для серверного рендеринга стандартная процедура создания SVG сохраняется:
const rect = draw.rect(200, 100).fill('#3498db').stroke({ width: 4, color: '#2c3e50' });
const circle = draw.circle(80).fill('red').move(50, 50);
Особенности серверного рендеринга:
.move(), .size(),
.attr() работают идентично клиентской версии.После создания элементов важно получить строковое представление SVG для сохранения или отправки клиенту:
const svgString = draw.svg();
const fs = require('fs');
fs.writeFileSync('image.svg', svgString);
Важно: SVG.js генерирует корректный XML-код, который полностью совместим с любым SVG-редактором или веб-браузером.
Группировка элементов (<g>) позволяет управлять
множественными объектами одновременно:
const group = draw.group();
group.add(draw.rect(50, 50).fill('green'));
group.add(draw.circle(30).fill('yellow').move(10, 10));
group.move(100, 100).rotate(45);
group.move(x, y) смещает всю группу.group.rotate(angle) вращает все элементы вокруг их
центра.transform SVG.SVG.js поддерживает текстовые элементы с форматированием:
draw.text(function(add) {
add.tspan('Пример текста').newLine();
add.tspan('на сервере').fill('#e74c3c');
}).font({ size: 24, family: 'Arial' }).move(50, 150);
Особенности серверного рендеринга текста:
tspan обеспечивает перенос и стиль
отдельных строк.На сервере анимации SVG.js не выполняются, так как
они рассчитаны на браузерное исполнение через
requestAnimationFrame. Но можно создавать статические кадры
анимации для экспорта:
for (let i = 0; i <= 10; i++) {
const frame = draw.circle(20).fill('blue').move(10 + i*15, 50);
fs.writeFileSync(`frame_${i}.svg`, draw.svg());
}
Каждый кадр — отдельный SVG, готовый для последующего объединения в анимацию или GIF.
SVG.js поддерживает фильтры и стили:
const filter = draw.filterWith(function(add) {
add.gaussianBlur(5);
});
draw.rect(100, 100).fill('orange').filterWith(filter);
На сервере фильтры сохраняются в SVG как <filter>
и <feGaussianBlur>, что делает их совместимыми с
рендерингом в браузере или графических редакторах.
.attr() позволяют программно очищать лишние
параметры.svgo) для минимизации перед отправкой:const SVGO = require('svgo');
const optimizedSvg = SVGO.optimize(svgString).data;
Сгенерированные SVG-файлы можно отдавать через Express.js:
const express = require('express');
const app = express();
app.get('/image', (req, res) => {
res.setHeader('Content-Type', 'image/svg+xml');
res.send(draw.svg());
});
app.listen(3000);
jsdom..svg(), который
возвращает корректный XML.