Fresh — современный веб-фреймворк для JavaScript и TypeScript, ориентированный на производительность и простоту разработки. Его ключевой особенностью является работа на основе рендеринга на стороне сервера (SSR) с возможностью частичной гидратации клиентского кода, что позволяет создавать быстрые и интерактивные приложения без излишней нагрузки на браузер.
В Fresh проект строится вокруг routes, islands и components.
routes/, которые автоматически становятся URL-путями
приложения. Например, файл routes/about.tsx будет доступен
по адресу /about. Каждый route представляет собой серверный
обработчик, который возвращает HTML.Fresh поддерживает как JavaScript, так и TypeScript. При использовании TypeScript проект получает строгую типизацию на уровне компонентов, props и состояния.
Файл компонента обычно имеет расширение .tsx для
поддержки JSX/TSX. Статические маршруты могут быть написаны в
.ts или .tsx, если требуется использование
JSX.
Пример простого компонента на TypeScript:
import { Handlers, PageProps } from "$fresh/server.ts";
export const handler: Handlers = {
GET(req, ctx) {
return ctx.render({ title: "Пример страницы" });
},
};
export default function Home({ data }: PageProps<{ title: string }>) {
return (
{data.title}
Это простая страница, рендерящаяся на сервере.
);
}
Ключевые моменты:
PageProps позволяет точно типизировать данные,
передаваемые в компонент..tsx автоматически преобразуется в HTML на
сервере.Fresh предоставляет строгую типизацию для props в компонентах. Использование TypeScript позволяет предотвратить ошибки ещё на этапе компиляции.
Пример типизированного интерактивного компонента (island):
/** @jsx h */
import { h } from "preact";
import { useState } from "preact/hooks";
interface CounterProps {
initialCount: number;
}
export default function Counter({ initialCount }: CounterProps) {
const [count, setCount] = useState(initialCount);
return (
);
}
Особенности:
useState для управления состоянием.Fresh поддерживает модульную структуру ES Modules. Импорт
осуществляется через относительные пути или специальные алиасы,
предоставляемые фреймворком ($fresh/server.ts,
$fresh/runtime.ts, $std/... для стандартной
библиотеки Deno).
Пример импорта утилит:
import { Handlers } from "$fresh/server.ts";
import { serveStatic } from "$fresh/utils.ts";
Экспорт может быть как именованным, так и по умолчанию, что упрощает организацию больших проектов.
Fresh автоматически поддерживает TypeScript, достаточно иметь
tsconfig.json в корне проекта. Рекомендуется включать
строгий режим ("strict": true) для предотвращения ошибок
типизации.
Пример базового tsconfig.json:
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"jsx": "react-jsx",
"strict": true,
"moduleResolution": "node",
"esModuleInterop": true
},
"include": ["routes/**/*", "components/**/*"]
}
Выводы по языковому определению: