Логирование и мониторинг играют ключевую роль в разработке производительных и устойчивых веб-приложений на Preact. Несмотря на легковесность фреймворка, архитектура компонентов и реактивный подход не мешают интеграции мощных инструментов для отслеживания состояния приложения и анализа поведения пользователей.
Логирование в Preact строится на базовых принципах JavaScript и веб-разработки: сохранение информации о событиях, ошибках и пользовательских действиях. Основные подходы:
Консольное логирование console.log,
console.error, console.warn остаются базовым
инструментом. В Preact удобно логировать внутри функций компонентов и
хуков:
import { useState } from 'preact/hooks';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(prev => {
console.log(`Счетчик изменен: ${prev + 1}`);
return prev + 1;
});
};
return <button onCl ick={increment}>Count: {count}</button>;
}
Ключевой момент: консольное логирование полезно на этапе разработки, но для продакшена его лучше заменять централизованными системами логирования.
Централизованное логирование через middleware
Для больших приложений Preact удобнее внедрять слой, который
перехватывает события и ошибки глобально. Например, создание утилиты
logger.js:
export const logger = {
info: (msg, data) => {
if (process.env.NODE_ENV !== 'production') {
console.info(msg, data);
}
},
warn: (msg, data) => {
console.warn(msg, data);
},
error: (msg, data) => {
console.error(msg, data);
}
};
Далее можно импортировать logger в компоненты и хуки,
обеспечивая единообразное логирование.
Ошибки в Preact-компонентах могут быть локализованы с помощью Error Boundaries, аналогично React. Пример реализации:
import { Component } from 'preact';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false, error: null };
}
componentDidCatch(error) {
this.setState({ hasError: true, error });
console.error('Произошла ошибка в компоненте:', error);
}
render() {
if (this.state.hasError) {
return <div>Произошла ошибка. Попробуйте позже.</div>;
}
return this.props.children;
}
}
Этот подход позволяет локализовать ошибки на уровне отдельных компонентов, предотвращая падение всего приложения.
Preact предоставляет инструменты для анализа производительности компонентов. Основные методы:
Использование requestAnimationFrame и
performance.now Позволяет измерять время рендера
отдельных компонентов:
import { useEffect } from 'preact/hooks';
function ExpensiveComponent() {
useEffect(() => {
const start = performance.now();
return () => {
const end = performance.now();
console.log(`Время жизни компонента: ${end - start} мс`);
};
}, []);
return <div>Тяжелый компонент</div>;
}Встраивание профайлера В Preact X и выше можно
использовать профайлер через preact/debug:
import { setupDevtools } from 'preact/debug';
setupDevtools(); // подключение инструментов Preact DevTools
Это позволяет отслеживать количество рендеров, обновления состояния и изменения пропсов, что важно для оптимизации производительности.
Для масштабных приложений логирование и мониторинг часто передаются в специализированные сервисы:
Пример интеграции Sentry:
import * as Sentry from '@sentry/browser';
Sentry.init({ dsn: 'ВАШ_DSN' });
function App() {
const handleClick = () => {
try {
throw new Error('Тестовая ошибка');
} catch (err) {
Sentry.captureException(err);
}
};
return <button onCl ick={handleClick}>Вызвать ошибку</button>;
}
Такой подход позволяет собирать ошибки пользователей в продакшн-среде и быстро реагировать на критические проблемы.
Отслеживание действий пользователя помогает анализировать UX и выявлять узкие места. В Preact это можно реализовать через кастомные хуки:
import { useEffect } from 'preact/hooks';
import { logger } from './logger';
function useUserAction(eventName, callback) {
useEffect(() => {
const handler = (event) => {
logger.info(`Событие: ${eventName}`, event);
if (callback) callback(event);
};
window.addEventListener(eventName, handler);
return () => window.removeEventListener(eventName, handler);
}, [eventName, callback]);
}
Пример использования:
function App() {
useUserAction('click', () => console.log('Пользователь кликнул по странице'));
return <div>Контент приложения</div>;
}
Такой подход позволяет централизованно логировать события и интегрировать их в аналитические платформы.
Эффективная система логирования и мониторинга повышает надежность приложения, упрощает поиск ошибок и позволяет анализировать поведение пользователей на всех этапах работы приложения.