Fresh — современный фреймворк для разработки веб-приложений на JavaScript и TypeScript, построенный поверх Deno. Он ориентирован на минимальную конфигурацию, скорость и интеграцию с современными возможностями Deno.
Для начала необходимо убедиться, что установлен Deno. Проверка версии производится командой:
deno --version
Установка Fresh осуществляется через встроенный скрипт Deno:
deno run -A --unstable https://deno.land/x/fresh/install.ts
После установки доступна команда fresh, позволяющая
создавать новые проекты и управлять сервером разработки.
Создание нового проекта:
fresh init my-app
Команда создаёт структуру каталогов с базовыми файлами, включая
routes, islands и static.
Запуск локального сервера осуществляется командой:
deno task start
По умолчанию сервер работает на
http://localhost:8000.
Основные каталоги:
routes/ — директория для маршрутов. Каждый файл
.tsx в routes соответствует URL-адресу.islands/ — интерактивные компоненты, которые рендерятся
на клиенте, сохраняя серверный рендеринг для основной страницы.static/ — статические файлы, доступные напрямую по
URL.main.ts — точка входа приложения.Особенности маршрутов:
routes/index.tsx соответствует /.[param].tsx.handler,
определяющую поведение на серверной стороне.Fresh позволяет создавать полноценные серверные маршруты. Пример базового обработчика:
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
GET(req, ctx) {
return new Response("Hello Fresh!", { status: 200 });
},
};
Ключевые моменты:
Handlers упрощает обработку
разных HTTP-методов.ctx содержит параметры маршрута и информацию о
запросе.Response полностью совместим с
Fetch API.Fresh поддерживает серверный рендеринг (SSR) с возможностью использования интерактивных компонент. Основной компонент страницы выглядит так:
export default function Home() {
return (
<div>
<h1>Привет, Fresh!</h1>
</div>
);
}
Для добавления интерактивности используются islands:
// 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>
);
}
Каждый компонент в islands рендерится на сервере с
последующей гидратацией на клиенте.
Fresh поддерживает серверный рендеринг данных через функции
handler или getStaticProps. Пример передачи
данных на страницу:
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
async GET(req, ctx) {
const data = { message: "Привет из сервера!" };
return ctx.render(data);
},
};
На компоненте страницы данные доступны через пропсы:
export default function Home({ data }: { data: { message: string } }) {
return <div>{data.message}</div>;
}
Файлы в каталоге static/ доступны напрямую через URL.
Fresh автоматически оптимизирует их использование и кэширование. Для
изображений и других медиа рекомендуется использовать подкаталоги для
логической структуры.
Подключение CSS и других ресурсов осуществляется через стандартные теги:
<link rel="stylesheet" href="/static/styles.css" />
fresh dev — запуск сервера разработки с горячей
перезагрузкой.fresh build — сборка проекта для продакшена.fresh check — проверка проекта на ошибки.fresh routes — вывод всех зарегистрированных
маршрутов.Команды можно выполнять напрямую через Deno:
deno run -A --unstable main.ts
или через созданный скрипт deno task.
Fresh полностью поддерживает TypeScript. Файлы .ts и
.tsx автоматически компилируются Deno при запуске.
Встроенная поддержка типов позволяет избежать ошибок на этапе разработки
и использовать современные возможности языка без дополнительных
сборщиков.
Fresh позволяет подключать middleware для маршрутов. Пример middleware для логирования запросов:
import { MiddlewareHandlerContext } from "$fresh/server.ts";
export async function logger(req: Request, ctx: MiddlewareHandlerContext) {
console.log(`${req.method} ${req.url}`);
return ctx.next();
}
Middleware подключается на уровне отдельных маршрутов или глобально
через main.ts.
Переменные окружения можно использовать через
Deno.env.get("VAR_NAME"). Для разных окружений создаются
отдельные файлы .env и подключаются через сторонние
библиотеки или встроенные механизмы Deno.
Fresh совместим с Deno Test для модульного тестирования:
import { assertEquals } from "std/testing/asserts.ts";
Deno.test("пример теста", () => {
assertEquals(1 + 1, 2);
});
Отладка осуществляется через встроенные инструменты Deno:
deno run -A --inspect-brk main.ts
Это позволяет подключаться к DevTools и пошагово анализировать выполнение приложения.