Логирование в контексте работы с библиотекой mo.js представляет собой систематический сбор и вывод информации о ходе выполнения анимаций, состоянии объектов и последовательности событий. Это важный инструмент при разработке сложных интерфейсов, где визуальные эффекты зависят от множества параметров и взаимодействий.
Основные задачи логирования:
Библиотека mo.js активно использует событийную
модель, в которой объекты (например, Tween,
Timeline, Burst, Shape)
генерируют события в процессе выполнения.
Ключевые события:
onStart — вызывается при запуске анимации;onUpdate — срабатывает при каждом обновлении
кадра;onComplete — вызывается после завершения;onRepeat — при повторении анимации.Каждое из этих событий может быть использовано как точка логирования.
console.logПростейший способ — вывод информации в консоль:
const tween = new mojs.Tween({
duration: 1000,
onStart() {
console.log('Анимация началась');
},
onUpdate(progress) {
console.log(`Прогресс: ${progress}`);
},
onComplete() {
console.log('Анимация завершена');
}
});
Такой подход удобен на этапе отладки, но быстро становится неудобным при увеличении объёма данных.
Для более сложных проектов рекомендуется использовать структурированные сообщения:
onUpdate(progress) {
console.log({
event: 'update',
progress: progress,
timestamp: Date.now()
});
}
Преимущества:
Важно отслеживать не только события, но и параметры:
const shape = new mojs.Shape({
radius: { 0: 100 },
duration: 2000,
onStart() {
console.log('Параметры:', this.props);
}
});
Поле this.props содержит текущие настройки объекта,
включая динамические значения.
TimelineПри использовании Timeline логирование становится
особенно полезным:
const timeline = new mojs.Timeline({
onStart() {
console.log('Timeline стартовал');
},
onComplete() {
console.log('Timeline завершён');
}
});
timeline.add(tween1, tween2);
Позволяет контролировать синхронизацию нескольких анимаций.
В крупных проектах логирование выносится в отдельный модуль:
const logger = {
log(event, data) {
console.log(`[${event}]`, data);
}
};
Использование:
onStart() {
logger.log('start', { id: this._id });
}
Преимущества:
Разделение логов по уровням:
const logger = {
debug(msg) { console.debug(msg); },
info(msg) { console.info(msg); },
warn(msg) { console.warn(msg); },
error(msg) { console.error(msg); }
};
Применение:
debug — технические детали;info — основные события;warn — потенциальные проблемы;error — критические сбои.mo.js часто используется в интерфейсах, реагирующих на действия пользователя:
button.addEventListener('click', () => {
console.log('Кнопка нажата');
burst.play();
});
Комбинирование пользовательских и анимационных логов помогает восстановить цепочку событий.
Частое логирование в onUpdate может снижать
производительность. Для анализа используется выборочная запись:
let frame = 0;
onUpdate(progress) {
if (frame % 10 === 0) {
console.log('Прогресс:', progress);
}
frame++;
}
Или измерение времени:
const start = performance.now();
onComplete() {
console.log('Время выполнения:', performance.now() - start);
}
Для улучшения читаемости:
onStart() {
console.group('Анимация');
console.log('Старт');
}
onComplete() {
console.log('Завершение');
console.groupEnd();
}
Обработка исключений:
try {
tween.play();
} catch (error) {
console.error('Ошибка анимации:', error);
}
Или внутри обработчиков:
onUpdate() {
try {
// логика
} catch (e) {
console.error(e);
}
}
Логи могут отправляться на сервер:
function sendLog(data) {
fetch('/logs', {
method: 'POST',
body: JSON.stringify(data)
});
}
Использование:
onComplete() {
sendLog({
event: 'complete',
time: Date.now()
});
}
Часто логирование отключается:
const isDev = process.env.NODE_ENV === 'development';
if (isDev) {
console.log('Отладка');
}
Или через переопределение:
const logger = isDev ? console : {
log: () => {},
error: () => {}
};
Пример комплексного логирования:
const tween = new mojs.Tween({
duration: 1500,
onStart() {
console.log('[START]', Date.now());
},
onUpdate(p) {
console.log('[UPDATE]', p.toFixed(2));
},
onComplete() {
console.log('[END]', Date.now());
}
});
Позволяет полностью восстановить ход выполнения.
Частый вызов console.log в
onUpdate → приводит к просадке FPS.
Отсутствие структуры → сложно анализировать данные.
Логирование без контекста → сообщения теряют смысл.
Игнорирование ошибок → сложнее находить проблемы.
const id = Math.random().toString(36);
onStart() {
console.log(`Анимация ${id} старт`);
}
onUpdate(p) {
console.log({
state: 'running',
progress: p
});
}
console.log(new Date().toISOString());
Логи могут использоваться для:
Грамотно организованное логирование в mo.js:
Использование событийной модели библиотеки позволяет внедрять логирование без изменения основной логики анимации, сохраняя чистоту и модульность кода.