Работа с Vivus в современных проектах часто требует сборки через модульный бандлер, поскольку библиотека ориентирована на использование в браузере и опирается на DOM API для анимации SVG. При разработке модульных приложений основная задача — корректно интегрировать её в пайплайн сборки без потери функциональности и с сохранением оптимизации итогового бандла.
В качестве инструмента сборки используется Rollup, поскольку он обеспечивает эффективную работу с ES-модулями, минимальный оверхед и качественное tree-shaking, что особенно важно для клиентских библиотек.
Установка базового набора зависимостей:
npm install rollup --save-dev
npm install @rollup/plugin-node-resolve @rollup/plugin-commonjs --save-dev
npm install @rollup/plugin-terser --save-dev
Саму библиотеку анимации SVG:
npm install vivus
После установки формируется структура проекта:
project/
├── src/
│ └── index.js
├── dist/
├── rollup.config.js
├── package.json
Файл конфигурации Rollup определяет процесс сборки, подключение зависимостей и формат выходного файла.
Минимальная конфигурация:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import terser from '@rollup/plugin-terser';
export default {
input: 'src/index.js',
output: [
{
file: 'dist/bundle.esm.js',
format: 'esm'
},
{
file: 'dist/bundle.umd.js',
format: 'umd',
name: 'VivusApp'
}
],
plugins: [
resolve(),
commonjs(),
terser()
]
};
Такой подход позволяет формировать два основных формата:
<script>Vivus импортируется как обычный ES-модуль:
import Vivus from 'vivus';
const animation = new Vivus('my-svg', {
type: 'delayed',
duration: 200,
start: 'autostart'
});
SVG элемент должен присутствовать в DOM:
<svg id="my-svg" viewBox="0 0 100 100">
<path d="M10 10 H 90 V 90 H 10 Z" />
</svg>
При сборке через Rollup важно учитывать, что библиотека не всегда предназначена для серверного выполнения, поэтому требуется изоляция от SSR-окружения.
При создании библиотеки или крупного приложения важно исключить Vivus из итогового бандла, если она подключается отдельно через CDN или npm на стороне потребителя.
В конфигурации Rollup это реализуется через
external:
export default {
input: 'src/index.js',
external: ['vivus'],
output: {
file: 'dist/bundle.esm.js',
format: 'esm'
},
plugins: [
resolve(),
commonjs()
]
};
Такой подход предотвращает дублирование кода и снижает размер итогового пакета.
Некоторые версии Vivus могут экспортироваться в формате CommonJS, что требует корректной обработки через плагин:
import commonjs from '@rollup/plugin-commonjs';
Без него возможны ошибки вида:
Default export is not definedrequire is not definedRollup преобразует CommonJS в ESM на этапе сборки, обеспечивая совместимость модулей.
Минификация играет ключевую роль при использовании SVG-анимаций в продакшене. Плагин terser позволяет сократить размер кода:
import terser from '@rollup/plugin-terser';
Дополнительно применяются следующие техники:
Rollup автоматически выполняет tree-shaking при условии использования ESM:
export function initAnimation() {
return new Vivus('svg-id');
}
Если функция не используется — она исключается из финального бандла.
Практика разделения сборок позволяет ускорить разработку и оптимизировать продакшен-сборку.
const isProd = process.env.NODE_ENV === 'production';
export default {
input: 'src/index.js',
output: {
file: isProd ? 'dist/bundle.min.js' : 'dist/bundle.js',
format: 'esm',
sourcemap: !isProd
},
plugins: [
resolve(),
commonjs(),
isProd && terser()
]
};
Vivus в этом контексте используется одинаково в обеих средах, но итоговый размер и отладочная информация различаются.
SVG-анимация требует корректной загрузки DOM-элементов, поэтому структура кода обычно разделяется:
import Vivus from 'vivus';
export function mountAnimation(selector) {
return new Vivus(selector, {
type: 'sync',
duration: 150
});
}
Rollup объединяет этот код в единый модуль, обеспечивая сохранение зависимости от DOM только на клиентской стороне.
Иногда требуется собрать файл для прямого подключения через
<script>:
output: {
file: 'dist/bundle.iife.js',
format: 'iife',
name: 'VivusModule'
}
Такой формат позволяет использовать библиотеку без модульной системы:
<script src="bundle.iife.js"></script>
<script>
new VivusModule('svg-id');
</script>
При разработке важно включать source maps:
output: {
file: 'dist/bundle.esm.js',
format: 'esm',
sourcemap: true
}
Это позволяет отлаживать код Vivus напрямую в браузере, сохраняя связь с исходными файлами.
Рекомендуемая структура при использовании Rollup:
src/
├── animations/
│ └── vivus-init.js
├── components/
│ └── svg-view.js
├── index.js
Пример разделения логики:
// vivus-init.js
import Vivus from 'vivus';
export const createAnimation = (id) =>
new Vivus(id, { type: 'delayed', duration: 180 });
// index.js
import { createAnimation } from './animations/vivus-init';
createAnimation('logo');
SVG-файлы могут импортироваться через дополнительные плагины Rollup:
npm install @rollup/plugin-url --save-dev
Конфигурация:
import url from '@rollup/plugin-url';
plugins: [
resolve(),
commonjs(),
url()
]
Это позволяет использовать SVG как строки или URL для дальнейшей анимации Vivus.
Финальный этап сборки через Rollup обычно включает:
Пример команды:
NODE_ENV=production rollup -c
Результатом становится оптимизированный бандл, готовый к использованию в продакшене с анимациями SVG, управляемыми Vivus.