Przepływy użytkowników w Lighthouse

Wypróbuj nowy interfejs Lighthouse API, aby mierzyć wydajność i sprawdzone metody na całej ścieżce użytkownika.

Brendan Kenny
Brendan Kenny

Lighthouse to świetne narzędzie do testowania wydajności i sprawdzonych metod podczas początkowego wczytywania strony. Jednak tradycyjnie trudno było używać Lighthouse do analizowania innych aspektów działania strony, takich jak:

  • Wczytywanie strony z ciepłej pamięci podręcznej
  • Strony z aktywowanym skryptem Service Worker
  • Uwzględnianie potencjalnych interakcji użytkowników

Oznacza to, że Lighthouse może pominąć ważne informacje. Podstawowe wskaźniki internetowe są obliczane na podstawie wszystkich załadowań stron, a nie tylko tych z pustą pamięcią podręczną. Dodatkowo dane takie jak skumulowane przesunięcie układu (CLS) można mierzyć przez cały czas, gdy strona jest otwarta.

Lighthouse ma nowy interfejs API przebiegu użytkownika, który umożliwia przeprowadzanie testów laboratoryjnych w dowolnym momencie cyklu życia strony. Puppeteer służy do skryptowego wczytywania stron i wywoływania syntetycznych interakcji użytkownika. Lighthouse można wywoływać na różne sposoby, aby podczas tych interakcji uzyskiwać najważniejsze statystyki. Oznacza to, że skuteczność może być mierzona podczas wczytywania strony oraz podczas interakcji z nią. Sprawdzanie ułatwień dostępu można przeprowadzać w ramach CI nie tylko w przypadku początkowego widoku, ale także w ramach całego procesu płatności, aby upewnić się, że nie nastąpiło cofnięcie zmian.

Prawie każdy skrypt Puppeteer napisany w celu zapewnienia działającego wzorca przeglądania, można teraz w każdej chwili wstawić Lighthouse w celu pomiaru wydajności i sprawdzonych metod. W tym samouczku omawiamy nowe tryby Lighthouse, które pozwalają mierzyć różne części wzorców zachowania użytkowników: nawigacji, migawki i przedziały czasu.

Konfiguracja

Interfejsy API dotyczące przepływu danych użytkownika są nadal w wersji wstępnej, ale są już dostępne w Lighthouse. Aby wypróbować poniższe wersje demonstracyjne, musisz mieć Node w wersji 14 lub nowszej. Utwórz pusty katalog i uruchom w nim:

# Default to ES modules.
echo '{"type": "module"}' > package.json

# Init npm project without the wizard.
npm init -y

# Dependencies for these examples.
npm install lighthouse puppeteer open

Nowy tryb „nawigacji” w Lighthouse nazywa (do tej pory) standardowe działanie narzędzia Lighthouse, czyli analizowanie wczytywania strony „na zimno”. Ten tryb służy do monitorowania szybkości wczytywania stron, ale ścieżki użytkownika dają też możliwość uzyskania nowych statystyk.

Aby skrypt Lighthouse rejestrował wczytywanie strony:

  1. Użyj puppeteer, aby otworzyć przeglądarkę.
  2. Rozpocznij przepływ użytkownika Lighthouse.
  3. Przejdź do docelowego adresu URL.
import fs from 'fs';
import open from 'open';
import puppeteer from 'puppeteer';
import {startFlow} from 'lighthouse/lighthouse-core/fraggle-rock/api.js';

async function captureReport() {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();

  const flow = await startFlow(page, {name: 'Single Navigation'});
  await flow.navigate('https://web.dev/performance-scoring/');

  await browser.close();

  const report = await flow.generateReport();
  fs.writeFileSync('flow.report.html', report);
  open('flow.report.html', {wait: false});
}

captureReport();

To najprostszy proces. Po otwarciu raport wyświetla podsumowanie z jednym krokiem. Kliknięcie tego kroku spowoduje wyświetlenie tradycyjnego raportu Lighthouse dotyczącego tej nawigacji.

Raport Lighthouse dotyczący procesu, który pokazuje pojedynczą nawigację
Wyświetl raport na żywo

Zgodnie z zasadami Lighthouse ta strona jest wczytywana po wyczyszczeniu pamięci podręcznej i lokalnej, ale w przypadku prawdziwych użytkowników wizyty będą się różniły pod względem wczytywania z zimnej i ciepłej pamięci podręcznej. Może to powodować dużą różnicę w wydajności między wczytywaniem z zimnej a powrotem na stronę z ciepłej pamięci podręcznej.

Rejestrowanie wczytywania „na ciepło”

Możesz też dodać do tego skryptu drugą nawigację, tym razem wyłączając czyszczenie pamięci podręcznej i miejsca na dane, które Lighthouse domyślnie wykonuje w przypadku nawigacji. W tym przykładzie wczytujemy artykuł na stronie web.dev, aby sprawdzić, jak bardzo korzysta on z buforowania:

async function captureReport() {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();

  const testUrl = 'https://web.dev/performance-scoring/';
  const flow = await startFlow(page, {name: 'Cold and warm navigations'});
  await flow.navigate(testUrl, {
    stepName: 'Cold navigation'
  });
  await flow.navigate(testUrl, {
    stepName: 'Warm navigation',
    configContext: {
      settingsOverrides: {disableStorageReset: true},
    },
  });

  await browser.close();

  const report = await flow.generateReport();
  fs.writeFileSync('flow.report.html', report);
  open('flow.report.html', {wait: false});
}

captureReport();

Wygenerowany raport przepływu wygląda mniej więcej tak:

Raport o przebiegu testu Lighthouse, który pokazuje 2 nawigacje: jedną z zimnym, a drugą z ciepłym uruchomieniem, która ma wyższy wynik wydajności
Zobacz raport na żywo

Połączenie testów z zimnym i ciepłym obciążeniem daje pełniejszy obraz wrażeń rzeczywistych użytkowników. Jeśli masz witrynę, w której użytkownicy wczytują wiele stron podczas jednej wizyty, możesz uzyskać bardziej realistyczny obraz tego, jak się czują w danym obszarze.

Zrzuty

Momentalne skanowanie to nowy tryb, w którym przeprowadzane są audyty Lighthouse w pojedynczym punkcie w czasie. W przeciwieństwie do zwykłego uruchomienia Lighthouse strona nie jest ponownie wczytywana. Dzięki temu możesz skonfigurować stronę i przetestować ją w dokładnym stanie, np. z otwartym menu lub częściowo wypełnionym formularzem.

Na potrzeby tego przykładu załóżmy, że chcesz sprawdzić, czy nowy interfejs Ustawień zaawansowanych w Squoosh przejdzie automatyczne testy Lighthouse. Te ustawienia są widoczne tylko wtedy, gdy obraz został załadowany, a menu opcji jest rozwinięte, aby wyświetlić ustawienia zaawansowane.

Zaawansowane menu Squoosh
Menu ustawień zaawansowanych Squoosh

Ten proces można zaprogramować za pomocą Puppeteer i można robić migawki Lighthouse na każdym etapie:

async function captureReport() {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();

  const flow = await startFlow(page, {name: 'Squoosh snapshots'});

  await page.goto('https://squoosh.app/', {waitUntil: 'networkidle0'});

  // Wait for first demo-image button, then open it.
  const demoImageSelector = 'ul[class*="demos"] button';
  await page.waitForSelector(demoImageSelector);
  await flow.snapshot({stepName: 'Page loaded'});
  await page.click(demoImageSelector);

  // Wait for advanced settings button in UI, then open them.
  const advancedSettingsSelector = 'form label[class*="option-reveal"]';
  await page.waitForSelector(advancedSettingsSelector);
  await flow.snapshot({stepName: 'Demo loaded'});
  await page.click(advancedSettingsSelector);

  await flow.snapshot({stepName: 'Advanced settings opened'});

  browser.close();

  const report = await flow.generateReport();
  fs.writeFileSync('flow.report.html', report);
  open('flow.report.html', {wait: false});
}

captureReport();

Wynikowy raport pokazuje, że wyniki są zwykle zadowalające, ale niektóre kryteria ułatwień dostępu trzeba sprawdzić ręcznie:

Raport procesu Lighthouse zawierający zestaw wykonanych zrzutów ekranu
Zobacz raport na żywo

Okresy

Jedną z największych różnic między wynikami wydajności w praktyce (np. w CrUX) i w module (np. w Lighthouse) jest brak danych wejściowych użytkownika. Z pomocą przydaje się zakres czasu – ostatni tryb przepływu użytkownika.

Przedział czasu przeprowadza audyty Lighthouse na pewien czas, który może obejmować nawigację, ale nie musi. To świetny sposób na rejestrowanie tego, co dzieje się na stronie podczas interakcji. Na przykład domyślnie Lighthouse mierzy CLS podczas wczytywania strony, ale w tym polu CLS jest mierzony od początkowej nawigacji do zamknięcia strony. Jeśli przyczyną CLS są interakcje użytkownika, Lighthouse nie byłby w stanie wykryć problemu i pomóc w jego rozwiązaniu.

Aby to zademonstrować, przedstawiamy witrynę testową, która symuluje reklamy wstrzykiwane do artykułu podczas przewijania bez przydzielonego miejsca. W długiej serii kart co jakiś czas pojawia się czerwony kwadrat, gdy slot znajdzie się w widocznym obszarze. Ponieważ nie zarezerwowano miejsca na te czerwone kwadraty, karty pod nimi zostały przesunięte, co spowodowało zmiany w układzie.

Zwykła nawigacja w Lighthouse ma wartość CLS równą 0. Jednak po przewinięciu strony mogą wystąpić problemy z przesunięciami układu, a wartość CLS będzie rosnąć.

Wypróbuj witrynę demonstracyjną

Ten skrypt wygeneruje raport o ścieżce użytkownika z obamia działaniami, aby pokazać różnicę.

async function captureReport() {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  // Get a session handle to be able to send protocol commands to the page.
  const session = await page.target().createCDPSession();

  const testUrl = 'https://pie-charmed-treatment.glitch.me/';
  const flow = await startFlow(page, {name: 'CLS during navigation and on scroll'});

  // Regular Lighthouse navigation.
  await flow.navigate(testUrl, {stepName: 'Navigate only'});

  // Navigate and scroll timespan.
  await flow.startTimespan({stepName: 'Navigate and scroll'});
  await page.goto(testUrl, {waitUntil: 'networkidle0'});
  // We need the ability to scroll like a user. There's not a direct puppeteer function for this, but we can use the DevTools Protocol and issue a Input.synthesizeScrollGesture event, which has convenient parameters like repetitions and delay to somewhat simulate a more natural scrolling gesture.
  // https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-synthesizeScrollGesture
  await session.send('Input.synthesizeScrollGesture', {
    x: 100,
    y: 600,
    yDistance: -2500,
    speed: 1000,
    repeatCount: 2,
    repeatDelayMs: 250,
  });
  await flow.endTimespan();

  await browser.close();

  const report = await flow.generateReport();
  fs.writeFileSync('flow.report.html', report);
  open('flow.report.html', {wait: false});
}

captureReport();

Spowoduje to wygenerowanie raportu porównującego zwykłą nawigację z przedziałem czasu, który obejmuje zarówno nawigację, jak i przewijanie po niej:

Raport procesu Lighthouse zawierający zestaw wykonanych zrzutów ekranu
Wyświetl raport na żywo

Po analizie każdego kroku CLS wyświetla się w kroku tylko do nawigacji. Świetna strona.

Raport Lighthouse obejmujący tylko nawigację po stronie ze wszystkimi zielonymi danymi

Krok „Przewijanie i przesuwanie” mówi jednak coś innego. Obecnie w zakresie czasowym dostępne są tylko łączny czas blokowania i skumulowane przesunięcie układu, ale wczytywane zwłoką zawartość na tej stronie wyraźnie obniża CLS witryny.

Raport Lighthouse dotyczący nawigacji i przewijania strony z niewłaściwym CLS

Wcześniej Lighthouse nie był w stanie wykryć tego problemowego zachowania CLS, choć prawie na pewno pojawiało się ono w przypadku rzeczywistych użytkowników. Testy wydajności w ramach skryptowanych interakcji znacznie zwiększają zgodność z testami laboratoryjnymi.

Prośba o opinię

Nowe interfejsy API przepływu użytkownika w Lighthouse mogą wykonywać wiele nowych zadań, ale pomiar rodzaju scenariuszy, z którymi spotykają się użytkownicy, może być skomplikowany.

Jeśli masz pytania, zadawaj je na forach dyskusyjnych Lighthouse, a w razie znalezienia błędów lub sugestii zgłaszaj je na stronie śledzenia problemów.