Fresh — это подход к созданию веб-приложений, ориентированный на серверный рендеринг с использованием современного JavaScript и возможностей платформы Deno. Основная идея заключается в минимизации клиентской нагрузки и упрощении потоков данных, обеспечивая быстрый отклик страниц за счет генерации HTML на сервере и передачи его напрямую пользователю. Fresh работает без сложных сборщиков и виртуальных DOM, используя нативные возможности браузеров и сервера для обработки маршрутов, стилей и скриптов.
Архитектура Fresh строится вокруг нескольких ключевых компонентов:
routes. Файлы
обрабатываются сервером и возвращают готовый HTML.Серверные компоненты в Fresh — это функции, возвращающие разметку с данными. Основной синтаксис:
export default function Page({ params }) {
return (
<main>
<h1>Привет, {params.name}!</h1>
<p>Серверный рендеринг обеспечивает мгновенную загрузку страницы.</p>
</main>
);
}
params — объект с параметрами
маршрута, доступный внутри компонента.Асинхронность в серверных компонентах реализуется с помощью
стандартных JavaScript-промисов и async/await. Пример
загрузки данных с внешнего API:
export default async function Page() {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
return (
<section>
<h1>Данные с API</h1>
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
</section>
);
}
Ключевые моменты:
Связка Fresh с базой данных позволяет строить динамические страницы без клиентских промежуточных шагов. Пример работы с PostgreSQL:
import { Client } from "https://deno.land/x/postgres/mod.ts";
const client = new Client({
user: "user",
password: "password",
database: "testdb",
hostname: "localhost",
port: 5432,
});
await client.connect();
export default async function Page() {
const result = await client.queryArray("SELECT id, name FROM users");
return (
<ul>
{result.rows.map(([id, name]) => (
<li key={id}>{name}</li>
))}
</ul>
);
}
Особенности работы:
Fresh использует файловую систему как основу маршрутизации:
routes/index.tsx → маршрут /.routes/users/[id].tsx → динамический маршрут
/users/:id.Маршруты могут содержать серверные компоненты, функции для загрузки
данных (load), а также отдельные клиентские компоненты для
интерактивных элементов.
Хотя основной рендеринг происходит на сервере, Fresh поддерживает добавление интерактивных элементов:
/** @jsx h */
import { h } from "preact";
import { useState } from "preact/hooks";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onCl ick={() => setCount(count + 1)}>
Нажато {count} раз
</button>
);
}
client:load или client:idle.Fresh автоматически внедряет следующие механизмы оптимизации:
Эти меры позволяют снижать время загрузки страниц и уменьшать нагрузку на клиентские устройства.
В серверных компонентах состояние хранится только на сервере в пределах запроса. Для многозадачных приложений можно комбинировать серверное состояние с локальным клиентским:
Fresh подходит для построения современных веб-приложений с быстрым откликом, масштабируемой архитектурой и простой поддержкой асинхронных операций.