Fresh — это современный фреймворк для разработки веб-приложений на основе Deno, ориентированный на максимальную производительность и минимизацию фронтенд-зависимостей. Основной принцип Fresh заключается в рендеринге страниц на сервере при каждом запросе с автоматическим обновлением только изменённых частей интерфейса. Это обеспечивает почти мгновенную загрузку страниц без необходимости в обширном клиентском JavaScript.
Fresh полностью использует островную архитектуру (islands architecture), где интерактивные элементы страницы обрабатываются отдельными “островами”, а остальная часть страницы остаётся статической. Такой подход снижает нагрузку на клиент и улучшает скорость первого отображения контента (Time to First Paint).
Островная архитектура разделяет страницу на статические и интерактивные компоненты. Основные характеристики:
Пример: кнопка лайка, форма комментариев или слайдер могут быть отдельными островами. Всё остальное — текст, изображения, статические блоки — остаются чистым HTML.
Компоненты в Fresh пишутся с использованием JSX и TypeScript. Каждый
компонент может быть либо статическим, либо
интерактивным. Интерактивный компонент помечается директивой
is:client, указывающей фреймворку, что его нужно загрузить
на клиенте.
/** @jsx h */
import { h } from "preact";
export default function LikeButton() {
let count = 0;
const handleClick = () => {
count += 1;
console.log("Likes:", count);
};
return (
<button onCl ick={handleClick}>
Поставить лайк
</button>
);
}
Для интеграции этого компонента в страницу используется следующая запись:
<LikeButton is:client />
Система автоматически разбивает код и загружает JS только для этого острова.
Fresh применяет несколько ключевых техник для ускорения рендеринга и уменьшения нагрузки:
Для островов критически важно минимизировать пересчёт состояний и повторные рендеры. В Fresh рекомендуется:
export default function Counter({ initialCount }: { initialCount: number }) {
let count = initialCount;
const increment = () => count += 1;
return (
<div>
<p>Счётчик: {count}</p>
<button onCl ick={increment}>+1</button>
</div>
);
}
Такой подход обеспечивает быстрый отклик и минимальное количество JS на клиенте.
Fresh позволяет безопасно работать с API без утяжеления клиентского кода. Любые запросы выполняются на сервере, а клиент получает уже готовый результат. Это снижает задержки и защищает ключи доступа.
export const handler = async (_req, _ctx) => {
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" } });
};
Динамические острова могут обращаться к этим endpoint’ам через props
или через fetch на клиенте, если необходимо живое
обновление данных.
Fresh сочетает принципы современных фреймворков с минимализмом и эффективной оптимизацией. Это делает его идеальным выбором для проектов, где критичны скорость загрузки и интерактивность без лишнего JS.