Fresh — это современный фреймворк для разработки веб-приложений на базе Deno, ориентированный на скорость и минимальное использование ресурсов. Одной из ключевых задач в реальных проектах является интеграция аналитики для отслеживания поведения пользователей, производительности и событий на сайте.
В Fresh возможны два подхода к подключению аналитических инструментов:
Каждый из подходов имеет свои преимущества и ограничения. Клиентская интеграция проще в реализации и подходит для сторонних сервисов вроде Google Analytics, но увеличивает время загрузки страницы. Серверная интеграция более эффективна с точки зрения производительности и конфиденциальности данных, так как исключает зависимость от сторонних скриптов на клиенте.
В Fresh клиентский код можно добавлять через встроенные компоненты или прямую вставку скриптов в шаблон.
// components/Analytics.tsx
export default function Analytics() {
return (
<>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXX-X"></script>
<script dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-XXXXXX-X');
`
}} />
</>
);
}
Такой компонент можно вставлять в корневой layout приложения, чтобы аналитика подключалась на всех страницах.
Ключевой момент: использование
dangerouslySetInnerHTML позволяет вставлять скрипты
напрямую, но требует внимательности к безопасности, чтобы избежать
XSS-уязвимостей.
Fresh поддерживает серверные функции через обработчики запросов. Серверная аналитика подходит для отправки событий, которые не должны зависеть от клиента, например, регистрация посещений или действий пользователей в API.
// routes/api/track.ts
import { HandlerContext } from "$fresh/server.ts";
export const handler = async (_req: Request, _ctx: HandlerContext) => {
const data = await _req.json();
await fetch("https://analytics.example.com/collect", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
event: data.event,
timestamp: new Date().toISOString(),
userAgent: _req.headers.get("user-agent"),
}),
});
return new Response(JSON.stringify({ status: "ok" }), { status: 200 });
};
Этот подход позволяет собирать события напрямую с сервера, не раскрывая идентификаторы трекинга пользователям.
В Fresh каждая страница является серверным обработчиком, что
облегчает сбор статистики. Для отслеживания переходов можно использовать
хуки жизненного цикла страниц или клиентские скрипты с
onMount.
import { useEffect } from "preact/hooks";
export default function PageTracker() {
useEffect(() => {
fetch("/api/track", {
method: "POST",
body: JSON.stringify({ event: "page_view", path: window.location.pathname }),
headers: { "Content-Type": "application/json" },
});
}, []);
return null;
}
Такой подход обеспечивает универсальное отслеживание всех переходов между страницами без зависимости от сторонних библиотек.
Для соблюдения GDPR и других норм конфиденциальности необходимо управлять сбором аналитики через согласие пользователя. В Fresh это реализуется условной отрисовкой компонентов аналитики:
{consentGiven && <Analytics />}
Где consentGiven хранится в состоянии или cookie,
отражая выбор пользователя.
async или defer минимизирует
блокировку рендеринга.Fresh позволяет работать с любыми аналитическими сервисами, поддерживающими HTTP API:
Интеграция аналитики в Fresh позволяет создавать легкие и быстрые приложения с детальным сбором данных, обеспечивая контроль над безопасностью и производительностью.