Fresh — это современный подход к разработке веб-приложений на JavaScript, ориентированный на оптимизацию рендеринга страниц и работу с данными без лишней нагрузки на сервер и клиент. Основная идея Fresh заключается в том, чтобы минимизировать состояние приложения на сервере и использовать преимущества статической генерации и динамических обновлений на клиенте.
Fresh строится вокруг нескольких ключевых компонентов:
Рендеринг на сервере (SSR) Fresh применяет серверный рендеринг для генерации HTML до того, как он отправляется клиенту. Это позволяет ускорить загрузку страниц и улучшить SEO. Основной принцип SSR в Fresh — рендеринг минимального объема JavaScript, необходимого для корректного отображения страницы.
Ограничение клиентских состояний Fresh стремится к тому, чтобы клиент получал уже готовую HTML-структуру. Динамическое состояние и интерактивность добавляются только там, где это необходимо, через клиентские компоненты, что снижает нагрузку на браузер и уменьшает время до интерактивности.
Маршрутизация Маршруты в Fresh строятся на
основе файловой структуры проекта. Каждому файлу в директории
routes соответствует URL-адрес. Это позволяет автоматически
связывать URL с конкретной страницей или API-эндпоинтом без сложной
конфигурации.
1. Страницы Страница — это функция, которая возвращает JSX или HTML. Страницы в Fresh могут использовать как статические данные, так и данные, полученные с сервера. Пример функции страницы:
export default function Page({ data }) {
return (
<div>
<h1>{data.title}</h1>
<p>{data.content}</p>
</div>
);
}
2. Роуты и API API-роуты в Fresh обрабатывают запросы методом GET, POST и другими. Роуты возвращают JSON, который может использоваться для динамических обновлений на клиенте. Пример API-роута:
export async function GET() {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
return new Response(JSON.stringify(data), {
headers: { "Content-Type": "application/json" }
});
}
3. Клиентские компоненты Компоненты, которые требуют интерактивности, могут быть помечены как клиентские. Они загружаются только на клиенте и подключаются к уже отрендеренному HTML. Такой подход позволяет сохранять производительность страницы и минимизировать объем JavaScript.
Fresh использует несколько способов управления данными:
Статические данные (Static Props) Данные, известные на момент сборки проекта, могут быть встроены в HTML, что ускоряет загрузку и снижает количество запросов к серверу.
Динамические данные (Server-Side Props) Данные, которые нужно получать при каждом запросе, обрабатываются на сервере и интегрируются в страницу перед отправкой клиенту.
Клиентский запрос Для интерактивных компонентов данные могут запрашиваться на клиенте через API-роуты, что позволяет обновлять содержимое без перезагрузки страницы.
Fresh тесно интегрируется с современным JavaScript и JSX. Особенности работы:
Пример использования клиентского компонента с интерактивностью:
/** @jsx h */
import { useState } from "preact/hooks";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onCl ick={() => setCount(count + 1)}>
Счетчик: {count}
</button>
);
}
Fresh проектируется с упором на скорость и минимизацию ресурсов. Основные механизмы оптимизации:
Минимизация JavaScript на клиенте Только интерактивные компоненты требуют загрузки скриптов. Остальная часть страницы остается статической.
Адаптивная маршрутизация Обновления данных выполняются только для изменившихся частей страницы, что снижает нагрузку на сервер и сеть.
Предзагрузка данных Fresh поддерживает предварительную загрузку данных для страниц, которые могут понадобиться пользователю при навигации, ускоряя переход между ними.
В отличие от классических SPA, Fresh не требует большого JavaScript-бандла для работы интерфейса. В отличие от полностью статических сайтов, Fresh поддерживает динамические данные и интерактивность, сохраняя при этом высокую производительность и SEO-оптимизацию.
Fresh сочетает серверный рендеринг, статические страницы и клиентскую интерактивность, обеспечивая гибкость и высокую производительность. Такой подход позволяет создавать современные веб-приложения, минимизируя лишние ресурсы и улучшая пользовательский опыт.