Fresh — фреймворк для JavaScript/TypeScript, построенный вокруг идеи островной архитектуры (island architecture). В отличие от классических SPA и даже большинства SSR-фреймворков, Fresh рассматривает интерактивность как точечное свойство страницы, а не как обязательное состояние всего приложения.
Ключевая установка: HTML по умолчанию статичен, JavaScript подключается только там, где он действительно нужен.
Традиционные подходы (SPA, hybrid SSR) имеют общие черты:
Это приводит к:
Островная архитектура решает эту проблему, разделяя страницу на статическое море HTML и интерактивные острова.
Страница состоит из двух типов компонентов:
1. Серверные компоненты (Server Components) Рендерятся исключительно на сервере. Не попадают в клиентский JavaScript. Не имеют состояния в браузере.
2. Острова (Islands) Изолированные интерактивные компоненты. Гидратируются отдельно. Загружают JavaScript только для себя.
Каждый остров — автономная единица, не зависящая от глобального состояния страницы.
Fresh использует строгую файловую конвенцию:
routes/
index.tsx
islands/
Counter.tsx
routes/, считается серверным.islands/, автоматически становится
интерактивным.При использовании island-компонента внутри server-компонента Fresh:
Обычный компонент маршрута:
export default function Home() {
return (
<main>
<h1>Статическая страница</h1>
<p>Этот HTML не требует JavaScript.</p>
</main>
);
}
Результат:
Это фундаментальное отличие Fresh от фреймворков, где даже «статическая» страница часто требует загрузки runtime.
Компонент в islands/Counter.tsx:
import { useState } from "preact/hooks";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onCl ick={() => setCount(count + 1)}>
{count}
</button>
);
}
Использование в маршруте:
import Counter from "../islands/Counter.tsx";
export default function Home() {
return (
<div>
<h1>Счётчик</h1>
<Counter />
</div>
);
}
Fresh автоматически:
Counter;Fresh применяет частичную гидратацию:
Это исключает типичные проблемы:
Одна из ключевых особенностей Fresh — полный отказ от сборки:
Для островной архитектуры это критично:
Каждый island:
Это приводит к:
Изоляция реализована не на уровне соглашений, а на уровне самой архитектуры фреймворка.
Fresh исходит из предположения, что:
Это меняет стиль проектирования интерфейсов:
В результате HTML снова становится первичным артефактом.
Fresh намеренно не предлагает:
Состояние либо:
Это устраняет целый класс ошибок, связанных с синхронизацией и повторной гидратацией.
Островная архитектура в Fresh даёт измеримые эффекты:
Оптимизация достигается не настройками, а самой моделью.
В отличие от гибридных решений:
client:load,
client:idle);Остров определяется строго местоположением файла, а не аннотациями.
Fresh намеренно ограничивает возможности:
Эти ограничения формируют дисциплину проектирования и упрощают поддержку кода.
В Fresh island architecture — не оптимизация и не паттерн, а базовая философия:
Фреймворк не навязывает сложность, а делает её осознанным выбором.