Выбор между timeago.js, Intl.RelativeTimeFormat,
date-fns и другими инструментами зависит от конкретных требований
проекта. Принятие обоснованного решения упрощается при наличии чётких
критериев.
| Требование | Решение |
|---|---|
| Chrome, Firefox, Safari 14+ | Intl.RelativeTimeFormat — встроенный |
| IE11 или Safari < 14 | timeago.js с полифиллом |
| Только современные браузеры | Любое решение подходит |
// Определение поддержки
const supportsRTF = typeof Intl !== 'undefined' &&
typeof Intl.RelativeTimeFormat !== 'undefined';
const format = supportsRTF
? relativeFormatNative // Intl.RTF
: relativeFormatTimeago; // timeago.js
| Количество языков | Решение |
|---|---|
| 1-2 | Хардкодить формы вручную или Intl.RTF |
| 3-10 | timeago.js или date-fns с импортом локалей |
| 10+ | Intl.RTF (100+ встроенных браузерных локалей) |
timeago.js поставляется с ~60 локалями, date-fns — с 100+, Intl.RTF использует встроенные данные браузера.
Нужно обновлять время в реальном времени (живая лента, чат)?
✓ → timeago.js (render/cancel) или самостоятельный setInterval
✗ → Любое решение, только format/formatDistanceToNow
timeago.js — единственная из рассмотренных библиотек, предоставляющая
встроенный render с таймерами.
| Решение | Добавляемый размер (gzip) |
|---|---|
| Intl.RTF | 0 KB — нативный |
| timeago.js | ~2 KB + ~0.5 KB/локаль |
| date-fns (RTF part) | ~5 KB + ~1 KB/локаль |
| Day.js + relativeTime | ~3.5 KB + ~0.5 KB/локаль |
| Moment.js | ~72 KB — не рекомендуется |
Нужны нестандартные словоформы, специфические для продукта или диалекта?
// Только timeago.js позволяет полный контроль
register('ru_custom', (n, i) => {
// Полная свобода в формулировках
return [customPast(n, i), customFuture(n, i)];
});
Intl.RTF и date-fns используют фиксированные системные формулировки.
Если date-fns используется для других операций, добавлять timeago.js
нет смысла — достаточно добавить функцию
formatDistanceToNow.
| Решение | TypeScript поддержка |
|---|---|
| timeago.js | Встроенные типы (.d.ts) |
| date-fns | Встроенные типы |
| Intl.RTF | Встроенные в TypeScript lib |
| Day.js | Встроенные типы |
Все современные решения имеют хорошую TypeScript поддержку.
Нужно рендерить на сервере?
✓ → format() от timeago.js, formatDistanceToNow от date-fns, Intl.RTF в Node 12+
✗ → render() от timeago.js — только браузер
Нужны автообновления в реальном времени?
├── Да → timeago.js
└── Нет
├── Нужны кастомные формы?
│ ├── Да → timeago.js
│ └── Нет
│ ├── Поддержка IE11/Safari 12?
│ │ ├── Да → timeago.js + полифилл
│ │ └── Нет → Intl.RelativeTimeFormat
│ ├── date-fns уже в проекте?
│ │ ├── Да → formatDistanceToNow из date-fns
│ │ └── Нет → Intl.RTF или timeago.js
│ └── 10+ языков?
│ ├── Да → Intl.RTF
│ └── Нет → timeago.js
| Критерий | timeago.js | Intl.RTF | date-fns | Day.js |
|---|---|---|---|---|
| Автообновление DOM | ✓ | ✗ | ✗ | ✗ |
| Кастомные локали | ✓ | ✗ | ✗ | ✗ |
| IE11 / Safari 12 | ✓ | ✗ | ✓ | ✓ |
| Размер бандла | Мал | 0 | Средний | Мал |
| Кол-во встроенных локалей | ~60 | 100+ | 100+ | 80+ |
| Без зависимостей | ✗ | ✓ | ✗ | ✗ |
| TypeScript | ✓ | ✓ | ✓ | ✓ |