Velocity.mock — специальный режим библиотеки
Velocity.js, предназначенный для ускоренного выполнения анимаций или их
полной имитации без фактической отрисовки промежуточных кадров.
Используется преимущественно в тестировании, отладке, профилировании и
при разработке интерфейсов, где требуется быстро проверить поведение
анимационной логики без затрат на реальную анимацию.
Этот механизм позволяет:
В обычном режиме Velocity рассчитывает промежуточные значения
CSS-свойств и применяет их с заданной частотой (обычно через
requestAnimationFrame). При включении
Velocity.mock:
begin,
progress, complete)Velocity.mock = true;
При значении true:
progress может вызываться только один раз или не
вызываться вовсеVelocity.mock поддерживает числовое значение:
Velocity.mock = 10;
Это означает:
Пример:
Velocity(element, { opacity: 1 }, { duration: 1000 });
При Velocity.mock = 10:
Velocity.mock = true;
Velocity(element, { translateX: "100px" }, {
duration: 1000,
begin: function() {
console.log("Начало");
},
complete: function() {
console.log("Завершение");
}
});
Поведение:
begin вызывается сразуtranslateX устанавливается мгновенноcomplete вызывается без задержкиВызывается синхронно при старте анимации, независимо от режима.
В обычном режиме вызывается многократно
В mock-режиме:
Всегда вызывается, даже в mock-режиме, что важно для тестов.
Одно из ключевых применений — unit и integration тесты.
beforeEach(function() {
Velocity.mock = true;
});
afterEach(function() {
Velocity.mock = false;
});
Преимущества:
Velocity.mock = true;
Velocity(menu, { height: "200px" }, {
complete: function() {
assert(menu.style.height === "200px");
}
});
Позволяет мгновенно проверить финальные состояния элементов:
Velocity.mock = true;
Velocity(box, { scale: 2 });
При анализе производительности исключается влияние анимаций:
Velocity.mock = true;
// измерение времени выполнения логики
В режиме true отсутствуют промежуточные значения —
только конечное состояние.
Velocity(element, { opacity: 0.5 }, { duration: 500 })
.then(function() {
return Velocity(element, { opacity: 1 }, { duration: 500 });
});
При Velocity.mock = true:
then вызывается сразуVelocity.mock = true;
Velocity(element, { opacity: 0 }, { queue: "custom" });
Velocity(element, { opacity: 1 }, { queue: "custom" });
Velocity.Utilities.dequeue(element, "custom");
Очередь:
Velocity.mock = true;
Velocity(element, { opacity: 1 }, {
delay: 1000,
complete: function() {
console.log("Done");
}
});
Поведение:
complete вызывается сразуПри числовом mock:
Velocity.mock = 5;
Velocity поддерживает Promise:
Velocity(element, { opacity: 1 }).then(function() {
console.log("Finished");
});
В mock-режиме:
Velocity.mock = true;
Velocity(element, { opacity: 0 }, { duration: 1000 });
Velocity(element, "stop");
Так как анимация завершается мгновенно:
stop() не оказывает эффектаVelocity.mock = false; // стандартный режим
Velocity.mock = true; // мгновенный
Velocity.mock = 5; // ускоренный
Рекомендуется:
function enableFastAnimations() {
Velocity.mock = 5;
}
function disableFastAnimations() {
Velocity.mock = false;
}
Или для тестовой среды:
if (process.env.NODE_ENV === "test") {
Velocity.mock = true;
}
При включении mock:
tickrequestAnimationFrame| Режим | Поведение | Использование |
|---|---|---|
false |
Полная анимация | Production |
true |
Мгновенное выполнение | Тесты, отладка |
number > 1 |
Ускоренная анимация | Быстрый UI-прототипинг |
Velocity.mock = true;
Приводит к:
progress: function() {
// может не выполниться
}
В mock-режиме не гарантируется многократный вызов.
В режиме true delay не работает.
useEffect(() => {
Velocity.mock = process.env.NODE_ENV === "test";
}, []);
if (process.env.NODE_ENV === "test") {
Velocity.mock = true;
}
Mock-режим позволяет изолировать:
Это особенно важно при анализе узких мест.
Velocity(elements, { opacity: 1 });
В mock-режиме:
Velocity(elements, { opacity: 1 }, { stagger: 100 });
В режиме true:
При числовом mock:
if (window.DEBUG) {
Velocity.mock = 3;
}
Позволяет:
Velocity.mock — глобальная переменная:
Для локального контроля требуется вручную переключать значение.
Работает совместно с:
queuedelaylooprepeatpromiseОднако временные аспекты масштабируются или игнорируются.