Vivus часто используется в связке с современными сборщиками модулей, где ключевую роль играет tree shaking — механизм удаления неиспользуемого кода на этапе сборки. Для библиотек анимации SVG это особенно критично, поскольку даже небольшое увеличение бандла заметно влияет на скорость загрузки и время до интерактивности.
Tree shaking опирается на статический анализ ESM-модулей. Сборщик (Webpack, Rollup, Vite) строит граф зависимостей и исключает экспортированные сущности, которые не используются в конечной программе.
Основные условия эффективного tree shaking:
import /
export)requiresideEffects в
package.jsonПри нарушении хотя бы одного условия код начинает восприниматься как «небезопасный для удаления».
Библиотека Vivus изначально разрабатывалась как класс для поэтапного рисования SVG. В типичной поставке встречаются несколько вариантов сборки:
<script>)UMD-версия не подлежит tree shaking в принципе, поскольку весь код представляет собой единый модуль без экспортируемых частей. ESM-версия, напротив, позволяет удалять неиспользуемые элементы при корректной настройке сборщика.
Даже при использовании ESM-сборки Vivus tree shaking часто не срабатывает из-за следующих факторов:
Если модуль выполняет код при импорте (например, регистрирует глобальные объекты или сразу инициализирует логику), сборщик помечает его как имеющий side effects.
Пример типичной проблемы:
window или document на уровне
импортаsideEffects флагаВ package.json библиотеки может отсутствовать:
{
"sideEffects": false
}
Без этого флага bundler часто перестаёт агрессивно удалять неиспользуемые части.
Наиболее частая ошибка:
import Vivus from 'vivus';
Такой импорт заставляет сборщик включить весь код библиотеки, даже если используется только минимальный функционал.
Tree shaking становится эффективным только при точечном импорте ESM-сборки.
import Vivus from 'vivus/dist/vivus.es.js';
В этом случае сборщик может анализировать модульную структуру и удалять неиспользуемые части.
const Vivus = await import('vivus');
или:
const { default: Vivus } = await import('vivus');
Такой подход полезен при анимациях, запускаемых только при появлении элемента в viewport.
SVG-анимации имеют особенность: большая часть кода часто сосредоточена вокруг:
getTotalLength)requestAnimationFrame)Tree shaking в таких библиотеках не столько уменьшает объём логики анимации, сколько позволяет убрать вспомогательные модули:
Если библиотека экспортирует единственный класс:
export default class Vivus { ... }
то tree shaking практически бесполезен: весь класс считается обязательным.
Если же присутствуют дополнительные экспортируемые модули:
export { Vivus }
export { EasingFunctions }
export { Utils }
то становится возможным удаление вспомогательных частей при их неиспользовании.
В Webpack 4+ tree shaking включён по умолчанию в production mode, но требует корректной конфигурации:
module.exports = {
mode: 'production',
optimization: {
usedExports: true
}
};
Критически важен флаг mode: production, поскольку именно
он активирует TerserPlugin, удаляющий мёртвый код.
Если импортируется Vivus как CommonJS:
const Vivus = require('vivus');
tree shaking отключается полностью.
Rollup считается наиболее «чистым» инструментом для tree shaking. При подключении ESM-версии Vivus:
Особенно эффективно при сборке библиотек поверх Vivus, где используется только один режим анимации.
Vite использует Rollup на этапе production build, поэтому:
При этом Vivus, как правило, попадает в pre-bundled зависимости через esbuild, что может «заморозить» структуру модуля до этапа tree shaking Rollup.
SVG-анимация часто связана с DOM:
document.querySelectorТакие операции считаются side effects, и даже если часть логики теоретически не используется, сборщик может сохранить весь модуль из-за потенциального влияния на DOM.
Эффективная стратегия tree shaking часто заменяется архитектурным разделением:
Пример логического разделения:
Хотя tree shaking напрямую не ускоряет выполнение анимации, он влияет на:
Для SVG-анимаций, запускающихся при скролле, это особенно заметно: уменьшение начального JS-бандла снижает задержку перед первой активацией анимации.