Stencil — это современный веб-фреймворк для создания повторно используемых веб-компонентов с поддержкой TypeScript и Shadow DOM. Для аналитических платформ важна возможность отслеживания пользовательских событий, состояния компонентов и взаимодействия с DOM, что требует особого подхода к внедрению кода аналитики.
Stencil предоставляет жизненный цикл компонентов, который позволяет внедрять аналитические вызовы в наиболее подходящие моменты:
componentWillLoad() — вызывается до монтирования
компонента. Используется для инициализации аналитических библиотек и
предварительной подготовки данных.componentDidLoad() — вызывается после монтирования
компонента. Подходит для отправки событий первого рендера или просмотра
страницы.componentShouldUpdate() и
componentWillUpdate() — позволяют отслеживать изменения
входных свойств и состояния для динамического анализа.componentDidUpdate() — идеальное место для отправки
событий об изменениях состояния или взаимодействий пользователя.disconnectedCallback() — вызывается при удалении
компонента. Используется для очистки подписок и остановки сбора
аналитики.Google Analytics (GA) требует передачи данных через глобальный объект
gtag или ga. В Stencil интеграция выполняется
через методы жизненного цикла:
import { Component, h } from '@stencil/core';
@Component({
tag: 'analytics-button',
styleUrl: 'analytics-button.css',
shadow: true,
})
export class AnalyticsButton {
handleClick() {
if (window.gtag) {
window.gtag('event', 'button_click', {
button_name: 'analytics-button',
timestamp: new Date().toISOString()
});
}
}
render() {
return <button onCl ick={() => this.handleClick()}>Нажать</button>;
}
}
Особенности интеграции:
h() и JSX позволяет динамически собирать
атрибуты элементов для аналитики.page_view при смене
маршрутов внутри компонента.Segment является платформой для объединения данных с разных
источников. В Stencil подключение Segment осуществляется через
инициализацию клиента в componentWillLoad():
import { Component, h } from '@stencil/core';
@Component({
tag: 'segment-tracker',
shadow: true
})
export class SegmentTracker {
componentWillLoad() {
if (!window.analytics) {
// Инициализация Segment
const script = document.createElement('script');
script.src = 'https://cdn.segment.com/analytics.js/v1/YOUR_WRITE_KEY/analytics.min.js';
document.head.appendChild(script);
}
}
trackEvent(eventName: string, properties?: Record<string, any>) {
if (window.analytics) {
window.analytics.track(eventName, properties);
}
}
render() {
return <button onCl ick={() => this.trackEvent('Button Clicked', { component: 'segment-tracker' })}>Click</button>;
}
}
Рекомендации:
Mixpanel предоставляет расширенные возможности аналитики
пользовательских действий. Интеграция с Stencil требует вызова методов
mixpanel.track и mixpanel.people.set:
import { Component, h } from '@stencil/core';
@Component({
tag: 'mixpanel-widget',
shadow: true
})
export class MixpanelWidget {
componentDidLoad() {
if (window.mixpanel) {
window.mixpanel.track('Component Loaded', { component: 'mixpanel-widget' });
}
}
trackInteraction() {
if (window.mixpanel) {
window.mixpanel.track('Button Interaction', { component: 'mixpanel-widget' });
}
}
render() {
return <button onCl ick={() => this.trackInteraction()}>Interact</button>;
}
}
Особенности работы с Mixpanel:
Stencil поддерживает кастомные события через
декоратор @Event. Это особенно полезно для аналитики при
взаимодействии между компонентами:
import { Component, Event, EventEmitter, h } from '@stencil/core';
@Component({
tag: 'event-tracker',
shadow: true
})
export class EventTracker {
@Event() trackEvent: EventEmitter;
handleClick() {
this.trackEvent.emit({ action: 'click', timestamp: new Date().toISOString() });
}
render() {
return <button onCl ick={() => this.handleClick()}>Emit Event</button>;
}
}
Использование кастомных событий позволяет:
Интеграция Stencil с аналитическими платформами обеспечивает гибкость в отслеживании пользовательского поведения, поддерживает работу с Shadow DOM и упрощает масштабирование веб-приложений за счет использования компонентов и событийной модели.