Установка пакета в проектах на базе npm выполняется через стандартный менеджер зависимостей:
npm install vivus
или при использовании Yarn:
yarn add vivus
Пакет устанавливается в node_modules и становится
доступным для импорта в модулях сборщика. Библиотека Vivus не требует
дополнительных зависимостей и работает как в браузерной среде, так и в
современных фронтенд-сборках.
В проектах, использующих ES Modules (Vite, modern Webpack, Rollup, Parcel), библиотека импортируется напрямую:
import Vivus from 'vivus';
const animation = new Vivus('my-svg', {
type: 'delayed',
duration: 200,
start: 'autostart'
});
Импорт возвращает конструктор, который создаёт экземпляр анимации для указанного SVG-элемента.
SVG-элемент должен присутствовать в DOM до инициализации:
<svg id="my-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<path d="M10 10 L90 90" />
</svg>
В средах Node.js или старых конфигурациях Webpack применяется CommonJS-синтаксис:
const Vivus = require('vivus');
const animation = new Vivus('my-svg', {
type: 'sync',
duration: 150
});
При этом важно учитывать, что сама библиотека ориентирована на браузер, поэтому выполнение должно происходить в окружении с DOM (например, после загрузки страницы или в клиентской части SPA).
В React инициализация выполняется после монтирования компонента:
import { useEffect } from 'react';
import Vivus from 'vivus';
export default function Logo() {
useEffect(() => {
new Vivus('logo-svg', {
type: 'scenario-sync',
duration: 180
});
}, []);
return (
<svg id="logo-svg" viewBox="0 0 200 200">
<path d="M20 20 L180 180" />
</svg>
);
}
Важно учитывать, что повторный рендер компонента не должен повторно создавать экземпляр анимации без необходимости.
В Vue 3 логика аналогична, но размещается в
onMounted:
import { onMounted } from 'vue';
import Vivus from 'vivus';
export default {
setup() {
onMounted(() => {
new Vivus('logo-svg', {
type: 'delayed',
duration: 220
});
});
}
};
При использовании сборщиков важно учитывать, что Vivus работает с DOM напрямую и не предназначена для серверного рендеринга.
В средах SSR (например, Next.js) инициализация должна выполняться только на клиенте:
if (typeof window !== 'undefined') {
import('vivus').then(({ default: Vivus }) => {
new Vivus('logo-svg', { duration: 200 });
});
}
Динамический импорт снижает начальный размер бандла и позволяет загружать анимацию только при необходимости:
async function initAnimation() {
const { default: Vivus } = await import('vivus');
new Vivus('logo-svg', {
type: 'oneByOne',
duration: 250
});
}
Подход особенно эффективен для ленивых компонентов интерфейса или анимаций, активируемых при прокрутке.
Типы для Vivus не всегда поставляются встроенно, поэтому используется базовая декларация:
declare module 'vivus' {
export default class Vivus {
constructor(
element: string | HTMLElement,
options?: {
type?: string;
duration?: number;
start?: string;
}
);
}
}
После добавления декларации импорт становится типобезопасным:
import Vivus from 'vivus';
const anim = new Vivus('svg-id', {
duration: 200,
type: 'delayed'
});
При использовании npm-подключения важно учитывать ряд особенностей интеграции:
stroke,
pathLength и getTotalLengthВ npm-среде возможно создание нескольких независимых экземпляров:
import Vivus from 'vivus';
const logo = new Vivus('logo', { duration: 180 });
const icon = new Vivus('icon', { duration: 120, type: 'sync' });
const line = new Vivus('line', { duration: 90, type: 'oneByOne' });
Каждый экземпляр управляет своим SVG без общего состояния, что позволяет масштабировать анимации на уровне интерфейса.
В долгоживущих SPA необходимо учитывать уничтожение компонентов. Хотя Vivus не предоставляет явного метода destroy, управление достигается через:
let animation = null;
function mount() {
animation = new Vivus('svg', { duration: 200 });
}
function unmount() {
document.getElementById('svg')?.remove();
animation = null;
}
В сборках можно уменьшить влияние библиотеки на стартовый пакет:
button.addEventListener('click', async () => {
const { default: Vivus } = await import('vivus');
new Vivus('svg', { duration: 150 });
});
В Vite и аналогичных инструментах импорт выполняется без дополнительной конфигурации:
import Vivus from 'vivus';
Webpack 5 также корректно обрабатывает пакет благодаря поддержке ES-модулей внутри зависимости.
При компонентном подходе анимация привязывается к конкретному жизненному циклу:
Такая модель позволяет масштабировать использование Vivus в сложных интерфейсах с десятками независимых анимаций.