Критерии выбора решения

Выбор между timeago.js, Intl.RelativeTimeFormat, date-fns и другими инструментами зависит от конкретных требований проекта. Принятие обоснованного решения упрощается при наличии чётких критериев.


Критерий 1: Поддержка браузеров

Требование Решение
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

Критерий 2: Количество языков

Количество языков Решение
1-2 Хардкодить формы вручную или Intl.RTF
3-10 timeago.js или date-fns с импортом локалей
10+ Intl.RTF (100+ встроенных браузерных локалей)

timeago.js поставляется с ~60 локалями, date-fns — с 100+, Intl.RTF использует встроенные данные браузера.


Критерий 3: Нужны ли автоматические DOM-обновления

Нужно обновлять время в реальном времени (живая лента, чат)?
  ✓ → timeago.js (render/cancel) или самостоятельный setInterval
  ✗ → Любое решение, только format/formatDistanceToNow

timeago.js — единственная из рассмотренных библиотек, предоставляющая встроенный render с таймерами.


Критерий 4: Размер бандла

Решение Добавляемый размер (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 — не рекомендуется

Критерий 5: Кастомные формы

Нужны нестандартные словоформы, специфические для продукта или диалекта?

// Только timeago.js позволяет полный контроль
register('ru_custom', (n, i) => {
  // Полная свобода в формулировках
  return [customPast(n, i), customFuture(n, i)];
});

Intl.RTF и date-fns используют фиксированные системные формулировки.


Критерий 6: date-fns уже в проекте

Если date-fns используется для других операций, добавлять timeago.js нет смысла — достаточно добавить функцию formatDistanceToNow.


Критерий 7: TypeScript

Решение TypeScript поддержка
timeago.js Встроенные типы (.d.ts)
date-fns Встроенные типы
Intl.RTF Встроенные в TypeScript lib
Day.js Встроенные типы

Все современные решения имеют хорошую TypeScript поддержку.


Критерий 8: SSR / Node.js

Нужно рендерить на сервере?
  ✓ → 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