Fresh — современный фреймворк для создания высокопроизводительных веб-приложений на JavaScript и Deno. Он сочетает преимущества реактивного рендеринга с минимальным размером клиентского кода, обеспечивая мгновенную загрузку страниц и низкую задержку взаимодействия. Основной принцип Fresh заключается в серверной генерации страниц (SSR) с возможностью гидратации отдельных компонентов на клиенте только при необходимости.
Приложения Fresh строятся вокруг концепции routes и islands.
routes/
автоматически становится маршрутом. Например, файл
routes/about.tsx соответствует пути
/about.Ключевой момент: Fresh использует стратегию islands architecture, при которой большая часть страницы статична и создается на сервере, а динамические элементы становятся интерактивными без полной гидратации всей страницы.
Компоненты в Fresh пишутся на JSX/TSX и могут быть как полностью
статическими, так и интерактивными. Для интерактивности используется
директива client:load или client:visible:
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onCl ick={() => setCount(count + 1)}>
Счетчик: {count}
</button>
);
}
client:load — компонент загружается сразу после
загрузки страницы.client:visible — компонент загружается только когда
становится видимым в области просмотра (lazy loading).Использование этих директив позволяет оптимизировать производительность, снижая количество JavaScript, передаваемого клиенту.
Fresh имеет встроенные возможности для работы с множественными языками и локалями, что особенно важно для глобальных приложений.
i18n, который
содержит ключи перевода.Пример структуры локализации:
const messages = {
en: { greeting: "Hello" },
ru: { greeting: "Привет" },
};
function Greeting({ locale }: { locale: "en" | "ru" }) {
return <h1>{messages[locale].greeting}</h1>;
}
Fresh поддерживает динамическую смену языка через маршруты, например
/ru/about или /en/about, что позволяет
легко масштабировать приложения на международный
рынок.
В Fresh серверная логика отделена от клиентской, что упрощает работу с данными и API.
export const handler = {
GET: async (_req, _ctx) => {
const data = await fetchSomeData();
return new Response(JSON.stringify(data), {
headers: { "Content-Type": "application/json" },
});
},
};
Использование server-first подхода позволяет уменьшить объем фронтенд-кода, ускорить рендеринг страниц и обеспечить лучшую SEO-оптимизацию.
Fresh встроенно поддерживает кэширование и оптимизацию загрузки:
Fresh позволяет использовать любые библиотеки на Deno или через CDN. Для этого достаточно импортировать модуль напрямую в код компонента:
import { format } from "https://deno.land/std/datetime/mod.ts";
export default function Time() {
const now = format(new Date(), "yyyy-MM-dd HH:mm:ss");
return <p>Текущее время: {now}</p>;
}
Ключевое преимущество — отсутствие необходимости в сборщике вроде Webpack, что упрощает разработку и снижает время сборки проекта.
Fresh поддерживает динамические маршруты через квадратные скобки:
routes/
blog/
[id].tsx
В компоненте [id].tsx доступен параметр
id:
export default function BlogPost({ params }: { params: { id: string } }) {
return <h1>Пост #{params.id}</h1>;
}
Динамический роутинг вместе с серверными обработчиками обеспечивает гибкость при работе с REST API и SEO-оптимизированными страницами.
Fresh упрощает работу с формами через стандартные HTML-формы и серверные обработчики:
export const handler = {
POST: async (req: Request) => {
const formData = await req.formData();
const name = formData.get("name");
return new Response(`Привет, ${name}`);
},
};
export default function Form() {
return (
<form method="POST">
<input name="name" />
<button type="submit">Отправить</button>
</form>
);
}
Fresh сочетает минимализм клиентского кода, мощный серверный рендеринг, гибкий роутинг и встроенную поддержку локализации, что делает его идеальным инструментом для современных веб-приложений с высокой производительностью и масштабируемостью.