Бизнес-метрики отражают ценность пользовательских действий для продукта: конверсия, удержание, доход, вовлечённость, скорость достижения цели. Во фронтенде на Lit эти показатели формируются на уровне компонентов и потоков событий, где каждое взаимодействие может быть измерено, агрегировано и передано в аналитические системы. Архитектура Lit — декларативный рендеринг, реактивные свойства и жизненный цикл Web Components — позволяет встроить измерения без нарушения изоляции и повторного использования компонентов.
Событийные метрики
Состояний и атрибутов
Агрегированные показатели
Во фронтенде метрика — это структурированное событие с контекстом: кто, где, что и при каких условиях. Lit-компонент — оптимальное место для формирования контекста.
Lit строится вокруг реактивных свойств и шаблонов. Метрики следует привязывать к:
Выделение абстракции трекера позволяет исключить жёсткую привязку к конкретной аналитике.
export const track = (event, payload = {}) => {
window.dispatchEvent(new CustomEvent('metric', {
detail: { event, payload, ts: Date.now() }
}));
};
Компоненты используют трекер, не зная о конечном получателе данных.
connectedCallback / disconnectedCallback Фиксируется факт появления или исчезновения бизнес-блока (например, показ платного оффера).
connectedCallback() {
super.connectedCallback();
track('offer_view', { offerId: this.offerId });
}
firstUpdated Подходит для измерения времени до готовности критичного UI.
firstUpdated() {
track('checkout_ready', {
renderTime: performance.now()
});
}
updated(changedProperties) Используется для метрик перехода состояний.
updated(changed) {
if (changed.has('status') && this.status === 'paid') {
track('payment_success', { orderId: this.orderId });
}
}
Каждое реактивное свойство Lit — потенциальный сигнал бизнес-логики. При проектировании компонентов свойства делятся на:
Явное документирование бизнес-значимых свойств снижает риск потери данных при рефакторинге.
static properties = {
status: { type: String }, // бизнес-состояние
loading: { type: Boolean } // техническое
};
Lit активно использует CustomEvent. Это естественный
механизм построения воронок на уровне UI.
this.dispatchEvent(new CustomEvent('step-complete', {
detail: { step: 'address' },
bubbles: true,
composed: true
}));
Контейнерные компоненты или роутер перехватывают события и формируют последовательность шагов, не внедряя аналитику в каждый атомарный элемент.
Компоненты Lit часто вложены и переиспользуются. Для бизнес-метрик важен контекст:
Контекст передаётся:
@lit/context);track('cta_click', {
screen: this.screen,
experiment: this.experimentId
});
Композиция контекста происходит на уровне родительских компонентов, атомарные элементы остаются универсальными.
Lit-компоненты хорошо подходят для экспериментов за счёт инкапсуляции.
Подход:
render() {
return this.variant === 'B'
? html`<new-offer @click=${this._onClick}></new-offer>`
: html`<old-offer @click=${this._onClick}></old-offer>`;
}
_onClick() {
track('offer_click', { variant: this.variant });
}
Метрики производительности напрямую связаны с доходом и удержанием:
Lit минимизирует лишние перерисовки, но измерения необходимы.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach(entry => {
track('web_vital', {
name: entry.name,
value: entry.startTime
});
});
});
observer.observe({ type: 'largest-contentful-paint', buffered: true });
Ошибки UI — это потерянные конверсии. Lit позволяет централизовать обработку.
window.addEventListener('error', (e) => {
track('ui_error', {
message: e.message,
stack: e.error?.stack
});
});
На уровне компонентов фиксируются:
Фронтенд-метрики должны коррелировать с серверными:
Lit-компоненты получают идентификаторы через свойства или контекст и обязаны передавать их в каждом бизнес-событии.
Юнит-тесты Lit проверяют не только DOM, но и факт отправки метрик.
it('tracks success event', async () => {
const el = await fixture(html`<pay-button></pay-button>`);
el.click();
expect(track).toHaveBeenCalledWith(
'payment_attempt',
expect.any(Object)
);
});
Метрика становится частью контракта компонента, а не побочным эффектом.
Такое разделение сохраняет чистоту компонентов и обеспечивает масштабируемость метрик при росте продукта.