Фреймворк Fresh строится поверх Deno, используя его возможности для разработки веб-приложений без необходимости сборки. Начало работы требует установки Deno (версии 1.36 и выше) и инициализации проекта через команду:
deno run -A https://deno.land/x/fresh@latest/init.ts my-app
cd my-app
deno task start
Ключевой момент: Fresh использует систему модулей Deno напрямую, без необходимости package.json или npm, что упрощает управление зависимостями и повышает безопасность за счет встроенной проверки разрешений.
Проект Fresh имеет несколько важных директорий:
routes/ – маршруты приложения,
соответствующие URL. Файлы .tsx внутри этой директории
автоматически обрабатываются как страницы.components/ – React-подобные
компоненты, используемые на страницах.static/ – статические ресурсы,
доступные напрямую через URL.islands/ – интерактивные компоненты,
рендерящиеся на клиенте, но управляемые с сервера.Каждый файл в routes/ экспортирует функцию
handler, которая обрабатывает HTTP-запросы. Пример:
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
GET(req, ctx) {
return new Response("Hello Fresh", { status: 200 });
}
};
ctx предоставляет доступ к параметрам маршрута,
кэшированию и другим утилитам. Использование Handlers
позволяет определять отдельные методы для GET, POST и других
HTTP-запросов.
Fresh поддерживает концепцию islands, что позволяет
создавать интерактивные части страницы без полной загрузки SPA.
Компонент в 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>
);
}
На странице компонент подключается через
<Counter />, при этом основной HTML рендерится на
сервере, а JavaScript подгружается только для интерактивной части.
Fresh тесно интегрирован со стандартной библиотекой Deno, что обеспечивает использование готовых модулей без установки сторонних пакетов. Основные модули:
std/http – создание и управление
HTTP-серверами, маршрутизация.std/fs – работа с файловой системой:
чтение, запись, наблюдение за изменениями.std/path – манипуляции с путями файлов
и директорий.std/datetime – работа с датами и
временем.Пример чтения файла через стандартную библиотеку Deno:
import { readTextFile } from "https://deno.land/std@0.209.0/fs/mod.ts";
const data = await readTextFile("./static/data.txt");
console.log(data);
Использование стандартной библиотеки в Fresh позволяет строить серверную логику напрямую в маршрутах и обработчиках.
Доступ к статическим ресурсам осуществляется через папку
static/. Для более сложных сценариев можно использовать
модуль std/http/file_server.ts:
import { serveFile } from "https://deno.land/std@0.209.0/http/file_server.ts";
export const handler = {
GET(req: Request) {
return serveFile(req, "./static/logo.png");
}
};
Это обеспечивает точное управление отдачей файлов с кастомными заголовками и кэшированием.
Fresh поддерживает middleware для обработки запросов перед попаданием
в маршруты. Middleware подключается через
middleware.ts:
import type { MiddlewareHandlerContext } from "$fresh/server.ts";
export async function handler(req: Request, ctx: MiddlewareHandlerContext) {
console.log("Запрос:", req.url);
return await ctx.next();
}
Middleware позволяет реализовать авторизацию, логирование и глобальную обработку ошибок на уровне приложения.
Fresh полностью интегрирован с TypeScript, что обеспечивает строгую типизацию на сервере и клиенте. JSX/TSX используется для описания интерфейсов и компонентов. Ключевые особенности:
useState,
useEffect) для интерактивных islands.Fresh оптимизирован для работы с Deno Deploy, но может быть развернут на любом сервере, поддерживающем Deno. Оптимизация включает:
ctx.render() и
стандартную библиотеку Deno для управления ресурсами.Команда deno task start запускает локальный сервер с
поддержкой горячей перезагрузки. Изменения в routes/,
islands/ и components/ автоматически
отражаются в браузере. Для больших проектов это ускоряет цикл разработки
и позволяет тестировать серверную и клиентскую логику одновременно.
Fresh не накладывает ограничений на выбор базы данных. Благодаря встроенной поддержке TypeScript и модульной структуре Deno можно использовать:
fetch.Пример запроса к API в обработчике маршрута:
export const handler = {
async GET() {
const res = await fetch("https://api.example.com/data");
const json = await res.json();
return new Response(JSON.stringify(json), { status: 200 });
}
};
Это позволяет строить полноценные веб-приложения без сторонних инструментов сборки и сложной конфигурации.