Fresh — это современный фреймворк для разработки веб-приложений на JavaScript и TypeScript, ориентированный на высокую производительность и минимизацию клиентской нагрузки. Основная идея Fresh заключается в использовании Edge Rendering и генерации HTML на сервере, без необходимости большого объема клиентского JavaScript.
Fresh строится вокруг следующих ключевых компонентов:
routes автоматически
становится маршрутом.API в Fresh организуется через файловую структуру в директории
routes. Каждый файл может экспортировать методы
HTTP, соответствующие действиям с ресурсами.
Пример структуры:
routes/
├── api/
│ ├── users.ts
│ ├── posts/
│ │ └── [id].ts
users.ts отвечает за коллекцию пользователей
(GET, POST и т.д.)[id].ts — динамический маршрут для конкретного
пользователя по идентификаторуВ файле API можно экспортировать функции для разных методов HTTP:
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
GET(req, ctx) {
return new Response(JSON.stringify({ message: "Список пользователей" }), {
headers: { "Content-Type": "application/json" },
});
},
POST(req, ctx) {
return new Response(JSON.stringify({ message: "Пользователь создан" }), {
headers: { "Content-Type": "application/json" },
});
},
};
Ключевые моменты:
Handlers — интерфейс для строгой типизации
методов.req содержит объект запроса, включая тело, заголовки и
параметры.ctx предоставляет контекст маршрута, включая
динамические параметры и состояние.Динамические маршруты создаются через квадратные скобки
[param]. Параметр автоматически доступен через
ctx.params:
export const handler: Handlers = {
GET(req, ctx) {
const userId = ctx.params.id;
return new Response(JSON.stringify({ id: userId, name: "Иван" }));
},
};
Особенности:
posts/[postId]/comments/[commentId].ts).Для чтения тела запроса используется метод
req.json():
export const handler: Handlers = {
POST: async (req) => {
const data = await req.json();
return new Response(JSON.stringify({ received: data }), {
headers: { "Content-Type": "application/json" },
});
},
};
Ключевые моменты:
json() возвращает объект, соответствующий
JSON-телу запроса.Можно управлять статусом и заголовками ответа:
return new Response(JSON.stringify({ error: "Не найдено" }), {
status: 404,
headers: { "Content-Type": "application/json" },
});
status определяет код HTTP-ответа.headers позволяет задавать тип контента, кэширование и
другие параметры.Middleware выполняются до основных обработчиков и позволяют:
Пример Middleware для проверки токена:
export const handler: Handlers = {
async GET(req, ctx) {
const token = req.headers.get("Authorization");
if (!token) {
return new Response("Unauthorized", { status: 401 });
}
return new Response("Доступ разрешен");
},
};
Fresh позволяет возвращать статический контент или генерировать страницы на сервере, используя Server-Side Rendering:
import { PageProps } from "$fresh/server.ts";
export default function UsersPage({ data }: PageProps) {
return (
<ul>
{data.users.map((user: any) => (
<li>{user.name}</li>
))}
</ul>
);
}
data передается из обработчика маршрута.API-эндпоинты легко подключаются к базе данных. Пример с PostgreSQL:
import { client } from "../db.ts";
export const handler: Handlers = {
async GET() {
const result = await client.queryArray("SELECT * FROM users");
return new Response(JSON.stringify(result.rows), {
headers: { "Content-Type": "application/json" },
});
},
};
Особенности:
Content-Type в JSON-ответах для
корректной обработки клиентом.Fresh сочетает простоту серверного рендеринга с современными практиками разработки, позволяя строить быстрые и безопасные веб-приложения с чистой архитектурой API.