Приложение на Electron — не веб-страница, хотя и собрано из неё, поэтому тега скрипта здесь нет: есть пакет и один вызов на процесс. Что это вам даёт, смотрите в измерении приложения. Пакет Skomi для Electron не зависит ни от чего, кроме самого Electron.
Исходники и демонстрационное приложение, отчитывающееся само о себе, лежат в skomi-sdk-electron.
Три процесса, три строки
// main.js — запустите один раз
const skomi = require('@skomi/electron').init({
appId: 'your-app-id',
});
skomi.screen('launch');
// preload.js — отдайте его окну
require('@skomi/electron/preload');
// renderer — там, где живёт ваша маршрутизация
window.skomi.screen('checkout/review', { tier: 'gold' });
Это вся интеграция. Идентификатор приложения берётся в разделе Мои приложения в Skomi. Он не секрет и место ему в вашем исходном коде: он опознаёт приложение, а не удостоверяет его, так же, как идентификатор сайта.
⚠ Не тянитесь за веб-сниппетом в своём renderer. Он измеряет сайт: ему нужно имя хоста, документ, за которым можно следить, и сеть, на которую можно положиться, а у окна Electron нет ничего из этого в том виде, в каком он ожидает. SDK существует потому, что у настольного приложения проблемы другие.
Назовите экраны
Автоматического захвата нет, и это намеренно: путь маршрута — то, как экран называет ваш код, а не то, как вы назвали бы его в отчёте. До 20 свойств на экран: строки, числа или логические значения.
Что SDK берёт на себя, а иначе писали бы вы
Он работает без сети. Экраны ставятся в очередь на диске в собственном каталоге данных приложения и переживают выход, падение и две недели без сети. Настольное приложение, отчитывающееся только в сети, теряло бы ровно те сессии, которые важны.
Он не считает дважды. Каждый экран несёт идентификатор, выданный один раз и пересылаемый без изменений, так что повторно отправленная пачка опознаётся, а не считается снова. Очередь без этого превращает то, что спасает ваши данные, в то, что их выдумывает.
Он переживает неверные часы. Каждая пачка записывает, когда её отправили, так что сервер может понять, насколько врут часы машины, и поправить пачку. Ноутбук, на котором стоит следующий вторник, иначе отчитается следующим вторником.
Он никогда не бросает исключение в ваш код. Плохие аргументы, недоступный сервер, каталог профиля, куда нельзя писать; всё обрабатывается внутри и сообщается через onError, если вы хотите знать. Аналитика — наименее важное из того, что делает ваше приложение.
Ожидание согласия
const skomi = require('@skomi/electron').init({ appId: '…', enabled: false });
// позже, когда пользователь согласился
skomi.setEnabled(true);
Пока выключено, ничего не записывается, и в очередь на потом тоже. Экран, просмотренный до того, как человек согласился, не тот экран, который стоит слать после.
Ошибки и падения
skomi.captureError(err, { screenName: 'checkout', fatal: false });
Ставятся в очередь, сохраняются и переотправляются как экран и дедуплицируются по тому же правилу, а здесь это важнее, потому что падение обычно уходит из очереди при следующем запуске.
⚠ captureUncaught выключен по умолчанию, и подумайте, прежде чем включать. Подписка на uncaughtException — это то, что не даёт Node завершиться, поэтому включённая по умолчанию отчётность о падениях превратила бы фатальное падение в процесс, продолжающий работать на испорченном состоянии. С включённым флагом семантика возвращается на место: отчёт синхронно пишется на диск, слушатель снимается, а ошибка бросается заново.
Настройки
init({
appId: '…', // обязательно
appVersion: app.getVersion(), // по умолчанию: спрашивается у Electron
origin: 'https://t.skomi.com', // переопределение для своего размещения
enabled: true, // начните с false, включите после согласия
flushIntervalMs: 10000,
onError(error, context) { }, // 'screen' | 'flush' | 'transport' | 'rejected' | 'queue'
});
init подключает канал к renderer и отправляет накопленное при выходе. Если вам нужен клиент, чьим временем жизни управляете вы (без IPC и без перехвата выхода), берите вместо этого createClient.
Чего приложение не получает
⚠ Приложение читает только аналитика. Тепловые карты, записи сессий и виджет отзывов — продукты для сайтов: им нужна страница в браузере, а в окне настольного приложения им не к чему прицепиться. Приложение сообщает экраны, сессии, версии, платформы и ошибки, и это всё.
Что панель с ними делает, смотрите в измерении приложения, а установку на MAUI или Flutter, если вы выпускаете тот же продукт и там.