Функция render предназначена для работы с DOM: она
считывает атрибут datetime у переданных элементов,
вычисляет относительное время и записывает строку в
textContent. В отличие от format,
render создаёт внутренние таймеры и автоматически обновляет
элементы.
render(
nodes: Element | NodeList | Element[] | HTMLCollectionOf<Element>,
locale?: string
): void
nodes — один или несколько
DOM-элементов. Принимает:
Element — один элементNodeList — результат querySelectorAllHTMLCollection — результат
getElementsByClassNameArray<Element> — массив элементовlocale — необязательная строка локали.
По умолчанию — 'en_US'.
Функция render работает только с атрибутом
datetime. Рекомендуется использовать тег
<time>:
<time datetime="2025-05-26T10:00:00Z"></time>
Значение datetime должно быть ISO 8601 или другим
форматом, который корректно парсится new Date().
import { render } from 'timeago.js';
const nodes = document.querySelectorAll('time[datetime]');
render(nodes, 'ru');
После вызова все элементы получат текст вида “4 часа назад” и будут автоматически обновляться.
import { render } from 'timeago.js';
const el = document.getElementById('post-time');
render(el, 'ru');
import { render } from 'timeago.js';
render(document.querySelectorAll('.ru-time'), 'ru');
render(document.querySelectorAll('.en-time'), 'en_US');
render(document.querySelectorAll('.de-time'), 'de');
render немедленно обновляет textContent при
первом вызове. Это синхронная операция — изменения видны сразу.
После первичного обновления render планирует последующие
через адаптивные интервалы:
Это оптимизирует нагрузку: элемент “3 года назад” не обновляется каждые 10 секунд.
При вызове render(node, locale):
node.getAttribute('datetime').format.node.textContent.setTimeout.Таймер хранится в WeakMap, привязанной к DOM-элементу. Это предотвращает утечки памяти при удалении элемента.
import { render } from 'timeago.js';
function addPost(post) {
const li = document.createElement('li');
li.innerHTML = `<time datetime="${post.createdAt}"></time>`;
document.getElementById('list').appendChild(li);
render(li.querySelector('time'), 'ru');
}
Новый элемент подключается к системе автообновления сразу.
В среде без DOM (Node.js, Deno) вызов render вызовет
ошибку, так как функция работает с Element. Для SSR
использовать только format.
После завершения работы с элементами нужно вызвать
cancel:
import { render, cancel } from 'timeago.js';
const nodes = document.querySelectorAll('.time');
render(nodes, 'ru');
// При уничтожении компонента
cancel(nodes);
Без cancel таймеры продолжают работать даже после
удаления элементов.
React:
import { useEffect, useRef } from 'react';
import { render, cancel } from 'timeago.js';
function TimeLabel({ date }: { date: string }) {
const ref = useRef<HTMLTimeElement>(null);
useEffect(() => {
if (!ref.current) return;
render(ref.current, 'ru');
return () => cancel(ref.current!);
}, [date]);
return <time ref={ref} dateTime={date} />;
}
Vue:
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { render, cancel } from 'timeago.js';
const props = defineProps({ date: String });
const el = ref(null);
onMounted(() => render(el.value, 'ru'));
onBeforeUnmount(() => cancel(el.value));
</script>
<template><time ref="el" :datetime="date" /></template>
const nodes = document.querySelectorAll('.nonexistent-class');
render(nodes, 'ru'); // ничего не происходит — пустая коллекция
render безопасно обрабатывает пустые коллекции.
| Сценарий | Метод |
|---|---|
| Разовое форматирование | format |
| Статичный шаблон / SSR | format |
| Автообновление в браузере | render |
| Компонент с lifecycle-управлением | render |
| Большой список без автообновления | format |