Inferno поддерживает серверное рендеринг (SSR — Server-Side Rendering), что позволяет генерировать HTML на сервере и передавать его клиенту. Это ускоряет загрузку страниц и улучшает SEO. В контексте SSR критически важным становится управление кешем, поскольку повторное вычисление одинаковых компонентов может приводить к лишней нагрузке на сервер.
Кеширование на сервере позволяет сохранять результат рендеринга компонентов или целых страниц, чтобы при повторных запросах отдавать готовый HTML без повторного рендеринга.
Кеш компонентов Inferno позволяет создавать
обёртки для компонентов, результат которых можно кешировать. Например,
для статических блоков интерфейса (хедеры, футеры, меню) можно сохранять
результат renderToString и использовать его
повторно.
Кеш страниц На уровне маршрутизации возможно кешировать весь HTML страницы для конкретного URL. Это особенно эффективно для контента, который редко обновляется.
Кеш данных Перед рендерингом страницы часто загружаются данные из API или базы данных. Кеширование этих данных уменьшает задержку и снижает нагрузку на сервер. В сочетании с компонентным кешем это обеспечивает максимальную производительность.
Кеш компонентов можно реализовать с помощью обычного объекта или Map, где ключом является уникальный идентификатор компонента и его пропсов, а значением — результат рендеринга.
import { renderToString } from 'inferno-server';
import { createElement } from 'inferno';
const cache = new Map();
function cachedRender(Component, props) {
const key = JSON.stringify({ Component: Component.name, props });
if (cache.has(key)) {
return cache.get(key);
}
const html = renderToString(createElement(Component, props));
cache.set(key, html);
return html;
}
Особенности реализации:
Инвалидизация кеша необходима для предотвращения устаревших данных. В простейшем виде TTL задаётся в миллисекундах:
const cache = new Map();
function cachedRenderWithTTL(Component, props, ttl = 60000) {
const key = JSON.stringify({ Component: Component.name, props });
const cached = cache.get(key);
if (cached && (Date.now() - cached.timestamp < ttl)) {
return cached.html;
}
const html = renderToString(createElement(Component, props));
cache.set(key, { html, timestamp: Date.now() });
return html;
}
Подход с TTL позволяет автоматически сбрасывать устаревшие записи и поддерживать актуальность контента. В более сложных системах можно использовать события или сигналы изменения данных для явной инвалидизации.
На практике серверный рендеринг Inferno чаще всего используется с Node.js и Express. Кеширование страниц интегрируется на уровне middleware:
import express from 'express';
import { renderToString } from 'inferno-server';
import App from './App';
const app = express();
const pageCache = new Map();
app.get('*', (req, res) => {
const url = req.originalUrl;
if (pageCache.has(url)) {
return res.send(pageCache.get(url));
}
const html = renderToString(App({ url }));
pageCache.set(url, html);
res.send(html);
});
app.listen(3000);
Ключевые моменты:
Inferno поддерживает ленивую загрузку компонентов, аналогично React.lazy. Кеширование серверного рендеринга должно учитывать, что некоторые компоненты могут загружаться асинхронно. При этом кеширование можно производить только после завершения асинхронного рендеринга, используя промисы:
async function cachedAsyncRender(Component, props) {
const key = JSON.stringify({ Component: Component.name, props });
if (cache.has(key)) {
return cache.get(key);
}
const html = await renderToString(Component(props)); // компонент возвращает промис
cache.set(key, html);
return html;
}
Для более сложных решений используют готовые кеш-стратегии:
lru-cache) для ограничения
размера и автоматической очистки старых записей.Такой подход обеспечивает масштабируемость приложения и высокую производительность при большом количестве пользователей.
Эффективное серверное кеширование в Inferno значительно ускоряет время ответа и снижает нагрузку на сервер, сохраняя при этом актуальность и корректность отображаемого контента.