Fresh — серверный web-фреймворк для JavaScript и
TypeScript, построенный вокруг Deno и ориентированный на максимальную
производительность за счёт минимального JavaScript на клиенте. Его
ключевая особенность — концепция islands architecture, где
интерактивность добавляется точечно, а не загружается целиком.
В основе Fresh лежит строгий принцип: по умолчанию на клиент
не отправляется ни байта JavaScript, если он не нужен. Это
радикально отличает его от традиционных SPA-фреймворков.
Islands Architecture
Islands — это изолированные интерактивные компоненты, которые
гидратируются независимо друг от друга. Всё остальное рендерится на
сервере как статический HTML.
Преимущества подхода:
- минимальный размер клиентского бандла;
- быстрая первая отрисовка (TTFB и LCP);
- отсутствие глобальной гидрации страницы;
- изоляция интерактивной логики.
Каждый island — обычный Preact-компонент, который:
- не влияет на остальной DOM;
- загружается только при необходимости;
- не требует клиентского роутера.
Серверный рендеринг без
компромиссов
Fresh использует SSR по умолчанию, без
опциональности и переключателей режимов. Это даёт:
- корректную работу SEO без дополнительной настройки;
- отсутствие “пустых” HTML-шаблонов;
- предсказуемое поведение страниц.
Рендеринг происходит на сервере при каждом запросе или через
edge-кэш, без необходимости сборки.
Отсутствие этапа сборки
Одно из самых радикальных преимуществ Fresh — нулевой build
step.
Код выполняется напрямую:
- без Webpack, Vite или Rollup;
- без предварительной компиляции;
- без генерации бандлов.
Это стало возможным благодаря:
- нативной поддержке ES-модулей в Deno;
- импорту модулей по URL;
- серверному выполнению TypeScript.
Преимущества отсутствия сборки:
- мгновенный запуск проекта;
- предельно быстрые итерации в разработке;
- отсутствие сложной конфигурации;
- минимизация инфраструктурных ошибок.
Интеграция с Deno
Fresh глубоко интегрирован с экосистемой Deno, что
формирует как сильные стороны, так и ограничения.
Плюсы Deno-окружения
- встроенный TypeScript без транспиляции;
- стандартная библиотека;
- строгая система разрешений;
- современный runtime без legacy-нагрузки;
- единый формат модулей.
Безопасность усиливается за счёт sandbox-подхода:
- доступ к файловой системе, сети и окружению ограничен флагами;
- код выполняется в предсказуемых условиях.
Минусы зависимости от Deno
- ограниченная совместимость с npm-пакетами;
- необходимость адаптации существующих библиотек;
- меньше готовых решений по сравнению с Node.js.
Несмотря на появление npm-совместимости в Deno, экосистема остаётся
менее зрелой.
Простота маршрутизации
Fresh использует файловую маршрутизацию, близкую к
концепции Next.js, но без клиентского роутера.
Характерные особенности:
- маршруты определяются структурой файлов;
- каждый маршрут — серверный обработчик;
- отсутствует client-side navigation по умолчанию.
Преимущества:
- прозрачность маршрутов;
- отсутствие магии в рантайме;
- предсказуемая логика запросов.
Ограничения:
- нет встроенных переходов без перезагрузки;
- SPA-поведение возможно только через islands;
- навигация остаётся серверо-центричной.
Минимальный JavaScript на
клиенте
Fresh принципиально отказывается от глобального клиентского
состояния.
Ключевые следствия:
- нет Redux, Zustand или аналогов на уровне приложения;
- состояние живёт либо на сервере, либо внутри island;
- отсутствует синхронизация состояния между страницами.
Это даёт:
- простоту мышления;
- отсутствие рассинхронизаций;
- высокую надёжность.
Но накладывает ограничения:
- сложные интерактивные приложения требуют нетипичной
архитектуры;
- перенос SPA-логики затруднён;
- глобальные UI-состояния требуют ручной реализации.
Производительность и
edge-ориентация
Fresh проектировался с прицелом на edge-деплой:
- минимальный размер ответа;
- быстрый cold start;
- отсутствие тяжёлых runtime-зависимостей.
Особенно эффективно Fresh работает:
- для контентных сайтов;
- для маркетинговых страниц;
- для админ-панелей с ограниченной интерактивностью;
- для сервисов с высокой нагрузкой на чтение.
Edge-ориентация становится ограничением, если:
- требуется долгоживущие соединения;
- используется WebSocket с сложным состоянием;
- необходимы фоновые задачи и очереди.
Ограничения экосистемы
Несмотря на концептуальную чистоту, Fresh имеет ряд практических
ограничений.
Малое количество готовых
решений
- ограниченный выбор UI-библиотек;
- отсутствие официальных интеграций с CMS;
- мало шаблонов и boilerplate-проектов.
Ограниченная
поддержка сложных SPA-сценариев
Fresh плохо подходит для:
- сложных дашбордов с интенсивной интерактивностью;
- приложений с постоянным клиентским состоянием;
- real-time интерфейсов с высокой частотой обновлений.
В таких случаях преимущества минимального JS превращаются в
архитектурные ограничения.
Предсказуемость против
гибкости
Fresh делает жёсткие архитектурные выборы:
- сервер важнее клиента;
- HTML важнее JavaScript;
- простота важнее универсальности.
Это создаёт:
- высокую предсказуемость поведения;
- низкую когнитивную нагрузку;
- стабильную производительность.
Но снижает:
- гибкость архитектуры;
- возможность адаптации под нетипичные требования;
- применимость для широкого спектра задач.
Итоговое
соотношение преимуществ и ограничений
Fresh предлагает:
- радикально быстрый рендеринг;
- минимальный JavaScript;
- простую и прозрачную архитектуру;
- тесную интеграцию с современным runtime.
Одновременно он ограничивает:
- сложную клиентскую логику;
- использование привычных npm-экосистем;
- перенос SPA-архитектур без переработки.
Фреймворк ориентирован на чётко определённый класс задач и выигрывает
там, где важны скорость, простота и контроль над тем, что реально
выполняется в браузере.