В фреймворке Stencil логирование играет ключевую роль при разработке компонентов и отладке приложений. Stencil предоставляет встроенные механизмы для ведения журналов, которые позволяют отслеживать жизненный цикл компонентов, ошибки и пользовательские события.
Для базового логирования в Stencil используются стандартные методы
console:
console.log('Информация о компоненте', this);
console.warn('Предупреждение о потенциальной ошибке');
console.error('Ошибка при обработке данных');
console.info('Дополнительная информация');
Использование этих методов позволяет быстро отслеживать состояние компонентов и поток данных. Однако для крупных приложений этот подход может быть недостаточно гибким, особенно при необходимости фильтрации и структурирования сообщений.
Stencil предоставляет @Logger() декоратор и встроенный
объект Build для логирования. Он позволяет выводить
сообщения в зависимости от режима сборки (dev или
prod) и уровня важности.
Пример использования Build:
import { Build } from '@stencil/core';
if (Build.isDev) {
console.log('Компонент инициализирован в режиме разработки');
}
Здесь Build.isDev гарантирует, что логирование
выполняется только в режиме разработки, предотвращая попадание служебной
информации в продакшн.
Stencil использует методы жизненного цикла, в которых удобно размещать логи для отслеживания состояния:
componentWillLoad() — вызывается перед монтированием
компонента.componentDidLoad() — вызывается после монтирования
компонента в DOM.componentShouldUpdate() — проверка необходимости
обновления.componentWillUpdate() — перед обновлением
компонента.componentDidUpdate() — после обновления
компонента.componentDidUnload() — после удаления компонента.Пример логирования в жизненном цикле:
import { Component, h } from '@stencil/core';
@Component({
tag: 'example-component',
styleUrl: 'example-component.css',
shadow: true
})
export class ExampleComponent {
componentWillLoad() {
console.log('componentWillLoad: подготовка к монтированию');
}
componentDidLoad() {
console.log('componentDidLoad: компонент смонтирован');
}
componentWillUpdate() {
console.log('componentWillUpdate: компонент обновляется');
}
componentDidUpdate() {
console.log('componentDidUpdate: компонент обновлен');
}
componentDidUnload() {
console.log('componentDidUnload: компонент удален');
}
render() {
return <div>Пример компонента</div>;
}
}
Для организации структурированного логирования можно реализовать
собственный логгер с уровнями debug, info,
warn, error:
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
class Logger {
static log(message: string, level: LogLevel = 'info') {
const prefix = `[${level.toUpperCase()}]`;
switch(level) {
case 'debug':
console.debug(prefix, message);
break;
case 'info':
console.info(prefix, message);
break;
case 'warn':
console.warn(prefix, message);
break;
case 'error':
console.error(prefix, message);
break;
}
}
}
Logger.log('Инициализация компонента', 'debug');
Logger.log('Компонент успешно загружен', 'info');
Logger.log('Предупреждение о производительности', 'warn');
Logger.log('Ошибка загрузки данных', 'error');
Такой подход позволяет централизовать все сообщения, добавлять фильтры по уровню важности и легко отключать определённые типы логов для продакшн-сборки.
Stencil поддерживает пользовательские события (@Event),
которые также можно логировать:
import { Component, Event, EventEmitter, h } from '@stencil/core';
@Component({
tag: 'event-logger',
shadow: true
})
export class EventLogger {
@Event() actionOccurred: EventEmitter<string>;
triggerAction() {
const message = 'Действие выполнено';
this.actionOccurred.emit(message);
console.log('Event emitted:', message);
}
render() {
return <button onCl ick={() => this.triggerAction()}>Сделать действие</button>;
}
}
Логирование событий позволяет отслеживать взаимодействие компонентов и пользовательские действия, что особенно важно для комплексных приложений.
При активном логировании в Stencil необходимо учитывать влияние на производительность. В продакшн-сборке рекомендуется:
Build.isDev перед выводом
логов.if (Build.isDev) {
console.log('Детальная информация о состоянии компонента:', JSON.stringify(this.data));
}
Stencil легко интегрируется с внешними библиотеками логирования,
такими как Sentry, LogRocket или
Winston. Это позволяет сохранять ошибки и события в
централизованное хранилище, получать отчеты о сбоях и аналитике
пользовательского поведения.
Пример интеграции с Sentry:
import * as Sentry from '@sentry/browser';
Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0' });
try {
// потенциально проблемный код
} catch (error) {
Sentry.captureException(error);
console.error('Ошибка отправлена в Sentry', error);
}
Логирование с помощью внешних сервисов особенно важно для отслеживания проблем в продакшн-среде, когда доступ к консоли ограничен.