Live updates

Фреймворк Fresh для JavaScript предлагает уникальный подход к обновлению данных в реальном времени без необходимости полной перезагрузки страницы. Механизм Live Updates позволяет поддерживать синхронизацию состояния интерфейса с сервером, сохраняя при этом производительность и простоту разработки.

Основные принципы Live Updates

  1. Серверная инициатива Обновления исходят с сервера в ответ на изменения данных или внешние события. В отличие от традиционного клиентского опроса (polling), Fresh использует EventSource для поддержания постоянного соединения и передачи событий по мере их возникновения.

  2. Обновление DOM без перезагрузки Fresh применяет инкрементное обновление: изменяется только та часть DOM, которая требует обновления. Это достигается за счёт компиляции компонентов в чистый HTML и минимальной дифференциации на клиенте.

  3. Состояние и реактивность Компоненты Fresh могут быть реактивными. Любое изменение данных на сервере автоматически отражается на клиенте, если компонент подписан на соответствующие события. Это обеспечивает согласованность интерфейса и данных без дополнительного кода для синхронизации.

Настройка Live Updates

Для использования Live Updates необходимо:

  1. Определить события сервера, которые будут триггерить обновления. Например, добавление нового элемента в базу данных:
import { sendEvent } from "fresh/live.ts";

export async function addMessage(message) {
  // сохранение в БД
  await db.insert("messages", message);
  // уведомление подписчиков
  sendEvent("messages:update", { newMessage: message });
}
  1. Подписать компонент на событие через useLive:
import { useLive } from "fresh/live.tsx";

export default function Messages() {
  const messages = useLive("messages:update", []);
  
  return (
    <ul>
      {messages.map(msg => <li>{msg.text}</li>)}
    </ul>
  );
}

В этом примере массив messages автоматически обновляется при получении события messages:update, и компонент перерисовывается только с новым элементом.

Работа с несколькими подписками

Live Updates поддерживает множественные подписки на разные каналы событий. Это особенно важно для приложений с динамическими данными:

const chatMessages = useLive("chat:update", []);
const notifications = useLive("notifications:update", []);

Каждая подписка работает независимо и инициирует перерисовку только своей области DOM, что минимизирует нагрузку на клиент.

Оптимизация производительности

  • Фильтрация событий на сервере: перед отправкой данных клиенту рекомендуется фильтровать только те события, которые действительно необходимы для обновления интерфейса.
  • Дедупликация обновлений: если несколько событий приходят одновременно, Fresh может объединять их, предотвращая лишние рендеры.
  • Подписка на части состояния: для крупных компонентов можно подписывать отдельные дочерние элементы на конкретные события, а не весь компонент целиком.

Примеры применения

  1. Чат в реальном времени Все новые сообщения отправляются через серверное событие, клиент автоматически добавляет их в список.

  2. Дашборд с метриками Графики и таблицы обновляются по мере поступления новых данных с сервера без перезагрузки страницы.

  3. Система уведомлений Уведомления отображаются мгновенно при их генерации на сервере.

Поддержка масштабирования

Fresh Live Updates подходит для масштабных приложений благодаря лёгкой интеграции с серверными событиями, горизонтальному масштабированию и минимальной нагрузке на сеть. Каждое событие передаётся клиенту в виде JSON-пакета, что позволяет легко обрабатывать сложные структуры данных.


Live Updates в Fresh объединяет реактивность, минимальную нагрузку и простоту архитектуры, обеспечивая быстрые и согласованные обновления интерфейса без лишнего кода на стороне клиента.