Современные веб-приложения должны не просто работать — они должны летать. И речь идёт не только о скорости загрузки, но и о том, насколько быстро пользователь может начать взаимодействовать с сайтом. Именно поэтому метрики Core Web Vitals стали настолько важными для разработчиков.

В этой статье мы разберём, как внедрить мониторинг LCP (Largest Contentful Paint) и FID (First Input Delay) в процесс непрерывной интеграции и развёртывания GatsbyJS-приложения. Да, звучит немного пугающе, но давайте разбираться постепенно.

Почему это важно?

Представьте, что вы заходите в кафе. Что вас больше порадует — мгновенно получить меню и возможность сделать заказ или долго ждать, пока официант соизволит подойти? То же самое и с сайтами: пользователи хотят видеть контент быстро и иметь возможность взаимодействовать с ним без задержек.

LCP показывает, как быстро загружается самый большой элемент на странице, видимый пользователю. FID измеряет время между первым взаимодействием пользователя с сайтом и моментом, когда браузер может начать обрабатывать это взаимодействие.

Подготовка к внедрению

Прежде всего нам понадобится настроенный проект на GatsbyJS и система CI/CD. Давайте начнём с базовой конфигурации:


// gatsby-config.js
module.exports = {
  plugins: [
    'gatsby-plugin-perf-metrics',
    // другие плагины
  ]
}

Настройка измерения метрик

Для измерения LCP и FID мы можем использовать web-vitals — библиотеку от Google:


import {getLCP, getFID} from 'web-vitals';

getLCP(metric => {
  // Отправляем данные в систему мониторинга
  console.log('LCP:', metric.value);
});

getFID(metric => {
  console.log('FID:', metric.value);
});

Интеграция с CI/CD

А теперь самое интересное! Давайте создадим скрипт, который будет проверять метрики во время сборки:


// performance-check.js
const puppeteer = require('puppeteer');

async function checkMetrics() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  // Внедряем код для измерения метрик
  await page.evaluateOnNewDocument(() => {
    window.performanceMetrics = {};
    // Код измерения LCP и FID
  });

  await page.goto('http://localhost:8000');
  
  // Ждём сбора метрик
  await page.waitForFunction(() => 
    window.performanceMetrics.lcp && 
    window.performanceMetrics.fid
  );

  const metrics = await page.evaluate(() => 
    window.performanceMetrics
  );

  await browser.close();
  return metrics;
}

Автоматизация проверок

Теперь добавим этот скрипт в наш CI/CD пайплайн. Например, для GitHub Actions:

yaml
name: Performance Check
on: [push]
jobs:
  perf-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install dependencies
        run: npm install
      - name: Build site
        run: npm run build
      - name: Check performance
        run: node performance-check.js

Анализ результатов

Как понять, что наши метрики в норме? Google рекомендует следующие значения:

- LCP: меньше 2.5 секунд
- FID: меньше 100 миллисекунд

В нашем CI/CD процессе мы можем установить эти значения как пороговые:


const THRESHOLD_LCP = 2500;
const THRESHOLD_FID = 100;

if (metrics.lcp > THRESHOLD_LCP || metrics.fid > THRESHOLD_FID) {
  process.exit(1); // Прерываем процесс сборки
}

Оптимизация и улучшение

Сбор метрик — это только начало. Что делать, если показатели не радуют? Вот несколько советов:

1. Оптимизируйте изображения и шрифты
2. Минимизируйте JavaScript
3. Используйте кэширование
4. Внедрите ленивую загрузку
5. Оптимизируйте критический путь рендеринга

Мониторинг в production

Важно следить за метриками не только при разработке, но и в боевом окружении. Можно использовать сервисы вроде Google Analytics или создать собственную систему мониторинга:


function sendToAnalytics(metric) {
  const body = JSON.stringify({
    name: metric.name,
    value: metric.value,
    page: window.location.pathname
  });
  
  navigator.sendBeacon('/analytics', body);
}

Работа с регрессиями

Иногда новые фичи могут ухудшить производительность. Поэтому важно настроить систему оповещений:


// alert-system.js
function checkRegression(currentMetrics, previousMetrics) {
  const regressionThreshold = 0.1; // 10%
  
  if (currentMetrics.lcp > previousMetrics.lcp * (1 + regressionThreshold)) {
    notify('LCP regression detected!');
  }
}

Заключение

Внедрение мониторинга LCP и FID в CI/CD пайплайн — это инвестиция в качество вашего приложения. Конечно, настройка может занять время, но результат того стоит: довольные пользователи, лучшие позиции в поиске и меньше головной боли при запуске новых фич.

Помните, что это не разовая задача, а постоянный процесс улучшения. Регулярно проверяйте метрики, анализируйте тренды и оптимизируйте там, где это необходимо. И да, иногда даже небольшие изменения могут дать заметный результат!

А вы уже следите за Core Web Vitals в своих проектах?