Библиотека timeago.js ориентирована на работу в современных браузерах
и не использует тяжёлые зависимости. Основная функциональность построена
на стандартных возможностях Jav * aScript: объектах Date,
таймерах setInterval, DOM API и строковых операциях.
Благодаря этому библиотека корректно функционирует в большинстве
актуальных браузерных движков.
Полная поддержка обеспечивается в следующих браузерах:
Поддерживаются как десктопные, так и мобильные версии браузеров.
Пример базового подключения:
<script src="https://unpkg.com/timeago.js/dist/timeago.min.js"></script>
После подключения библиотека работает без дополнительной настройки:
<time class="timeago" datetime="2025-05-20T12:00:00Z"></time>
<script>
timeago.render(document.querySelectorAll('.timeago'));
</script>
Библиотека может использоваться в Internet Explorer 11, однако существуют ограничения, связанные с отсутствием некоторых современных возможностей JavaScript.
Наиболее частые проблемы:
NodeList.forEachВ большинстве случаев достаточно добавить полифилы.
Пример подключения полифилов:
<script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
<script src="https://unpkg.com/timeago.js/dist/timeago.min.js"></script>
Использование не рекомендуется. Основные причины:
Для старых корпоративных систем предпочтительнее применять статическую генерацию дат на сервере.
Библиотека корректно работает в мобильных браузерах:
Пример:
timeago.render(document.querySelectorAll('time'));
Обновление времени происходит автоматически через внутренние интервалы, поэтому на мобильных устройствах важно учитывать энергопотребление.
Современные браузеры поддерживают импорт модулей напрямую:
<script type="module">
import { format } from 'https://cdn.skypack.dev/timeago.js';
console.log(format(Date.now() - 10000));
</script>
Поддержка type="module" присутствует в большинстве
актуальных браузеров.
При использовании сборщиков вроде Webpack или Browserify библиотека импортируется через CommonJS:
const timeago = require('timeago.js');
Такой подход особенно актуален для старых проектов.
Совместимость браузеров часто зависит не от самой библиотеки, а от
обработки дат объектом Date.
Наиболее безопасный и совместимый формат:
const date = '2025-05-20T10:30:00Z';
Использование ISO-формата обеспечивает одинаковое поведение в разных браузерах.
Некоторые строки интерпретируются браузерами по-разному:
'2025/05/20'
'05-20-2025'
'20.05.2025'
Особенно нестабильно такие форматы работают в Safari и старых версиях Internet Explorer.
Рекомендуется всегда использовать:
new Date().toISOString()
или UNIX timestamp:
Date.now()
Safari имеет ряд особенностей при обработке времени и дат.
Safari менее терпим к нестандартным строкам даты:
new Date('2025-05-20 10:00:00')
В Chrome такая запись может работать, а в Safari возвращается
Invalid Date.
Корректный вариант:
new Date('2025-05-20T10:00:00')
Safari чувствителен к отсутствию указания временной зоны.
Рекомендуемый формат:
2025-05-20T10:00:00Z
или
2025-05-20T10:00:00+03:00
Mozilla Firefox обычно демонстрирует высокую совместимость с timeago.js, однако возможны нюансы:
setInterval при энергосбереженииНапример, если вкладка неактивна, обновление времени может происходить реже:
timeago.render(nodes);
Это нормальное поведение браузера, направленное на снижение нагрузки.
Современные браузеры ограничивают работу таймеров в неактивных вкладках.
Особенно активно это реализовано в:
Возможные последствия:
После возврата пользователя на вкладку библиотека автоматически синхронизирует отображаемое время.
При использовании с SSR-фреймворками вроде Next.js необходимо учитывать наличие DOM.
Некорректный пример:
timeago.render(document.querySelectorAll('time'));
На сервере объект document отсутствует.
if (typeof window !== 'undefined') {
timeago.render(document.querySelectorAll('time'));
}
В React библиотека чаще используется через эффекты:
useEffect(() => {
timeago.render(ref.current);
}, []);
Важно очищать таймеры:
useEffect(() => {
timeago.render(ref.current);
return () => {
timeago.cancel();
};
}, []);
В Vue.js обычно применяется в mounted:
mounted() {
timeago.render(this.$refs.time);
}
Для Angular рекомендуется запускать рендер после инициализации компонента:
ngAfterViewInit() {
timeago.render(this.element.nativeElement);
}
Для контроля поддержки браузеров часто применяется конфигурация Browserslist:
> 0.5%
last 2 versions
not dead
Она используется сборщиками:
Если проект поддерживает старые браузеры, рекомендуется транспиляция:
npm install @babel/preset-env
Конфигурация:
{
"presets": ["@babel/preset-env"]
}
Полифилы требуются при поддержке:
Чаще всего добавляют:
import 'core-js/stable';
или:
<script src="https://polyfill.io/v3/polyfill.min.js"></script>
timeago.js поддерживает локали через собственный механизм:
timeago.register('ru', localeFunc);
Однако старые браузеры могут иметь проблемы:
Особенно это касается старых Android WebView.
Мобильные приложения часто используют встроенные браузеры:
В старых WebView возможны:
Для стабильной работы рекомендуется:
Библиотека периодически пересчитывает отображение:
timeago.render(nodes);
В современных браузерах механизм работает стабильно, но при большом количестве элементов могут возникать:
Особенно это заметно в старых мобильных браузерах.
Вместо обновления тысяч элементов одновременно:
timeago.render(document.querySelectorAll('time'));
лучше ограничивать область:
const container = document.querySelector('.feed');
timeago.render(container.querySelectorAll('time'));
Перед использованием можно выполнять feature detection:
if ('querySelector' in document) {
timeago.render(document.querySelectorAll('time'));
}
Проверка поддержки модулей:
const supportsModules = 'noModule' in HTMLScriptElement.prototype;
Библиотека может подключаться через CDN:
<script src="https://unpkg.com/timeago.js/dist/timeago.min.js"></script>
или:
<script src="https://cdn.jsdelivr.net/npm/timeago.js"></script>
Практически все современные браузеры поддерживают такие подключения без ограничений.
Проблемы могут возникать только в:
console.log(new Date('2025-05-20T10:00:00Z'));
Если выводится Invalid Date, проблема связана с
браузерным парсером даты.
timeago.render(document.querySelectorAll('time'));
Если время не обновляется:
timeago.format(Date.now() - 10000, 'ru');
Если локализация отсутствует, необходимо проверить регистрацию языка.