Chrome DevTools и аналогичные инструменты в других браузерах позволяют в реальном времени исследовать поведение timeago.js: состояние таймеров, обновления DOM, потребление памяти.
Когда timeago.js управляет DOM-элементом, изменения
textContent видны в реальном времени:
<time datetime="...">.Установить breakpoint внутри timeago.js для понимания внутреннего потока:
Ctrl+P → ввести
timeago.format или обработчик таймера.Увидеть стек вызовов: какой компонент вызывает format и
с какими аргументами.
Запись активности таймеров:
Main → Timer Fired — это
таймеры timeago.js.Нормальная картина: Timer Fired появляется каждые 10-60 секунд, занимает < 1 мс.
Тревожная картина: Timer Fired каждые 100 мс, или Forced Reflow после каждого обновления.
Проверка на утечки:
HTMLTimeElement в строке поиска.Если # New > 0 — элементы не удаляются,
cancel не вызывается.
// Выполнить в консоли
(function() {
let count = 0;
const elements = document.querySelectorAll('[datetime]');
elements.forEach(el => {
const observer = new MutationObserver((mutations) => {
mutations.forEach(m => {
if (m.type === 'characterData') {
console.log(`Update #${++count}: "${m.oldValue}" → "${m.target.textContent}"`);
}
});
});
observer.observe(el, { characterData: true, subtree: true });
});
console.log(`Watching ${elements.length} time elements`);
})();
TimeAgo.useState (если
используются).Что искать: частота ре-рендеров, причина рендера (props change, hook change).
TimeAgo.npx lighthouse http://localhost:3000 --view --preset=desktop
Что проверять:
// Добавить в приложение для постоянного мониторинга
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.entryType === 'measure' && entry.name.startsWith('timeago')) {
console.log(`${entry.name}: ${entry.duration.toFixed(2)}ms`);
}
}
});
observer.observe({ entryTypes: ['measure'] });
// В обёртке format:
performance.mark('timeago-format-start');
const result = format(date, locale);
performance.mark('timeago-format-end');
performance.measure('timeago-format', 'timeago-format-start', 'timeago-format-end');
node --inspect app.js
Открыть chrome://inspect в Chrome → RemoteTarget →
app.js → Inspect.
В SSR-контексте убедиться, что render не вызывается на
сервере. В Node.js нет document — вызов бросит
ReferenceError.
Для больших проектов можно создать хелпер, который выводит статистику в консоль:
window.__timeagoDebug = {
elements: () => document.querySelectorAll('[datetime]').length,
values: () => Array.from(document.querySelectorAll('[datetime]'))
.map(el => ({ datetime: el.getAttribute('datetime'), text: el.textContent })),
check: () => {
const els = document.querySelectorAll('[datetime]');
const invalid = Array.from(els).filter(el => !el.textContent?.trim());
if (invalid.length) {
console.warn(`${invalid.length} time elements without text`);
} else {
console.log(`All ${els.length} time elements have text`);
}
},
};
// Использование в консоли браузера
__timeagoDebug.check();
__timeagoDebug.values();