Fresh — современный фреймворк для разработки веб-приложений на JavaScript и TypeScript, построенный на базе Deno. Он обеспечивает нативную поддержку серверного рендеринга и оптимизированную работу с фронтендом. Одним из ключевых аспектов создания интерфейсов в Fresh является интеграция CSS. В отличие от традиционных SPA-фреймворков, Fresh использует подход, ориентированный на модульность и минимизацию клиентской нагрузки.
Для добавления CSS в проект Fresh можно использовать локальные файлы.
Структура проекта обычно предполагает папку static для
статических ресурсов, включая CSS:
project/
├─ static/
│ ├─ styles/
│ │ └─ main.css
├─ routes/
│ └─ index.tsx
В файле компонента или страницы подключение осуществляется через тег
<link>:
export default function Home() {
return (
<>
<head>
<link rel="stylesheet" href="/styles/main.css" />
</head>
<body>
<h1>Пример страницы с CSS</h1>
</body>
</>
);
}
Важный момент: все файлы из папки static становятся
доступными по прямому URL, что упрощает организацию статики.
Fresh поддерживает добавление CSS непосредственно в компоненты с использованием JSX:
export default function Button() {
return (
<button style={{ backgroundColor: 'blue', color: 'white', padding: '10px 20px' }}>
Нажми меня
</button>
);
}
Inline-стили удобны для быстрых изменений, но менее эффективны при масштабировании приложения.
Для крупных приложений рекомендуется использовать модульный CSS. Fresh позволяет импортировать CSS как модуль, обеспечивая локальную область видимости классов:
/* styles/button.module.css */
.button {
background-color: green;
color: white;
border-radius: 5px;
padding: 8px 16px;
}
import styles from "../styles/button.module.css";
export default function Button() {
return <button className={styles.button}>Нажми меня</button>;
}
Ключевое преимущество модульного CSS — исключение коллизий имен классов и упрощение поддержки компонентов.
Fresh хорошо интегрируется с TailwindCSS, позволяя писать утилитарные классы прямо в JSX. Tailwind ускоряет разработку и уменьшает количество кастомного CSS:
export default function Card() {
return (
<div className="max-w-sm mx-auto bg-white shadow-lg rounded-lg p-6">
<h2 className="text-xl font-bold mb-4">Карточка</h2>
<p className="text-gray-700">Содержимое карточки с TailwindCSS</p>
</div>
);
}
Конфигурация Tailwind в Fresh обычно происходит через
tailwind.config.js, а обработка стилей осуществляется при
сборке проекта с помощью deno task.
Fresh не использует виртуальный DOM, что позволяет применять Scoped CSS — стили, ограниченные конкретным компонентом. Такой подход снижает влияние стилей на соседние элементы и повышает предсказуемость рендеринга:
/** @jsx h */
import { h } from "preact";
import { useState } from "preact/hooks";
export default function Toggle() {
const [active, setActive] = useState(false);
return (
<div>
<style>
{`
.toggle { padding: 10px; border: 1px solid #333; cursor: pointer; }
.active { background-color: #333; color: #fff; }
`}
</style>
<div
className={`toggle ${active ? "active" : ""}`}
onCl ick={() => setActive(!active)}
>
Переключить
</div>
</div>
);
}
Fresh полностью поддерживает CSS-анимации и переходы. Использование ключевых кадров позволяет создавать динамичные эффекты без Jav * aScript:
/* styles/animations.css */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fadeIn 0.5s ease-in-out forwards;
}
export default function Alert() {
return <div className="fade-in">Сообщение об ошибке</div>;
}
Fresh поддерживает tree-shaking и минимизацию CSS при сборке, что снижает размер финального пакета. Рекомендуется:
Fresh совместим с PostCSS и SCSS через стандартные сборочные задачи Deno. Пример конфигурации PostCSS:
// postcss.config.js
module.exports = {
plugins: {
autoprefixer: {},
cssnano: {}
}
};
Подключение SCSS аналогично:
/* styles/main.scss */
$primary-color: #3490dc;
body {
background-color: $primary-color;
font-family: Arial, sans-serif;
}
Компиляция происходит на этапе сборки с помощью
deno task build.
Работа с CSS в Fresh строится вокруг модульности и прямого управления стилями компонентов. Комбинация локальных файлов, модульного CSS, TailwindCSS и препроцессоров позволяет создавать производительные и легко поддерживаемые интерфейсы. Подход Fresh обеспечивает минимальную нагрузку на клиент и высокую предсказуемость стилей при рендеринге.