Wydajność
Wydajność to ostatnio dość popularny temat w środowisku webdevowym. Z jakiegoś powodu (ekhm, Google, ekhem) nagle wszyscy chcą, żeby ich strony WWW były jak najbardziej wydajne. Ale czy faktycznie wydajność jest aż tak istotna?
Można na problem spojrzeć z szerszej perspektywy. Bo wydajność nie dotyka jedynie kwestii tego, jak szybko strona się wczytuje. Wydajna strona jest bardziej dostępna. Strona, która zużywa tylko tyle zasobów, ile potrzebuje, jest także przyjaźniejsza środowisku, ponieważ powoduje mniejszą emisję dwutlenku węgla. Wydajność dotyka też kwestii urządzeń. Nigdy nie wiadomo, z jakiego urządzenia korzysta osoba użytkownicza. Co więcej, nierówności ekonomicznie mogą powodować spore różnice między możliwościami poszczególnych urządzeń. Do tego dochodzi jeszcze kwestia tego, że ludzie niekoniecznie często kupują nowe urządzenia. Odpowiednie podejście do wydajności pozwoli nam się jednak nie martwić nawet o te słabsze i starsze. Może także przedłużyć czas pracy na baterii. Wreszcie, wydajna strona zdecydowanie polepsza doświadczenie osoby użytkowniczej (bo nikt nie lubi czekać minutę na wczytanie się artykułu w Sieci). W takim ujęciu wydajność okazuje się tak naprawdę kwestią etyczną i jednym z fundamentów dobrze działającej strony WWW.
No i wreszcie - wydajność jest dobra także dla biznesu. Na web.dev można znaleźć sporo studiów przypadków, pokazujących, jak poprawa wydajności wpłynęła pozytywnie na zyski stron WWW. Innymi słowy: wydajność jest dobra na wszystko!
Sieć
Istnieje pewien paradoks: im większe prędkości jest w stanie osiągać Internet, tym mniej wydajny ostatecznie jest (jeśli nikt jeszcze tego paradoksu nie nazwał, zaklepuję go sobie jako Paradoks Comandeera!). Choć brzmi to całkowicie absurdalnie, to powód jest dość prosty: rosnąca prędkość Internetu sprawia, że przesyłane są większe ilości danych. Jako osoby webdeveloperskie mamy poczucie, że możemy sobie pozwolić na więcej.
Co niekoniecznie jest prawdą. Prędkość to nie wszystko. Bardzo ważnym czynnikiem jest choćby koszt połączenia. Im wyższy, tym większa szansa, że osoba użytkownicza nie będzie chciała odwiedzać strony WWW, która wymaga zaciągnięcia połowy biblioteki Kongresu. Do tego dochodzi kwestia stabilności połączenia. Tak, 5G jest niezwykle szybkie na papierze. W praktyce prędkość może być niższa. Albo osoba użytkownicza właśnie jedzie pociągiem i ma dostęp jedynie do rwącego się połączenia 3G. W takim wypadku nasza strona zaciągająca 20 MB niekoniecznie będzie dla niej pozytywnym doświadczeniem.
Dlatego warto ograniczać ilość przesyłanych danych. W idealnym wypadku – do 14 KB. Ale to raczej utopijna wizja. Wszystko zależy od konkretnego przypadku. Wbrew pozorom często można wyciąć sporo, nie zmieniając wyglądu strony w żaden dostrzegalny sposób. A czasami wycięcie kilku obrazków może wręcz podnieść czytelność.
Vitals
Istnieje spora liczba wskaźników, których zadaniem jest określanie wydajności stron WWW. Jednak najpopularniejszymi obecnie są prawdopodobnie Web Vitals. To zestaw kilku metryk, opracowanych przez Google i używanych m.in. w Lighthouse’ie. Są wykorzystywane także jako jeden z czynników rankingowych w wyszukiwarce Google. To sprawiło, że – chcąc, nie chcąc – więcej osób zainteresowało się wydajnością i zaczęło optymalizować strony WWW.
Metryki wchodząc w skład Web Vitals ciągle ewoluują, żeby jak najlepiej mierzyć wydajność strony WWW. Na chwilę obecną istnieją trzy podstawowe wskaźniki:
- Largest Contentful Paint (LCP) – do mierzenia wydajności wczytywania strony; wskaźnik mierzy czas wyrenderowania największego elementu (obrazka, bloku tekstu, itd.) w viewporcie widocznym po wejściu na stronę,
- Interaction to Next Paint (INP) – do mierzenia wydajności w trakcie interakcji ze stroną; oblicza czas potrzebny stronie na odpowiedź na każdą interakcję ze strony osoby użytkowniczej (kliknięcia, naciśnięcia klawiszy itd.),
- First Input Delay (FID) – do mierzenia wydajności w trakcie interakcji ze stroną; mierzy czas od pierwszej interakcji ze strony osoby użytkowniczej (np. kliknięcia) do reakcji ze strony przeglądarki; od 12 marca 2024 ta metryka jest zastąpiona przez INP,
- Cumulative Layout Shift (CLS) – do mierzenia "stabilności layoutu); mierzy, o ile przesuwają się elementy widoczne na stronie w trakcie renderowania.
I choć takie metryki są pomocne w określeniu, nad czym wypada popracować, nie można zapominać, że wciąż to są wyłącznie syntetyczne wskaźniki. Nawet jeśli się osiągnie perfekcyjne wyniki w Core Web Vitals, niekoniecznie oznacza to, że strona jest wydajna. Ot, podobnie do zgodności ze standardem WCAG – to jeszcze nie oznacza, że strona jest dostępna. Wskaźniki i standardy to tylko wskazówki. Stosowanie się do nich zdecydowanie pomaga w osiągnięciu konkretnego celu (np. bycia wydajnym lub dostępnym), ale nie powinno stanowić celu samo w sobie. Ostatecznie to, ile zdobędziemy punkcików, absolutnie nie obchodzi naszej osoby użytkowniczej. Ją obchodzi wyłącznie dobrze działająca strona WWW.
Niemniej Chrome Team chwali się, że Web Vitals zaoszczędziło osobom użytkowniczym ponad 10 tysięcy lat, przyśpieszając wczytywanie się stron WWW. Rick Viscomi dodaje, że Sieć jest szybsza z roku na rok. Tylko że wszystkie te wyliczenia oparte są na syntetycznych wskaźnikach – więc warto je brać z lekką poprawką. Aczkolwiek ogólny trend jest dość optymistyczny.
Techniki
Na sam koniec warto przyjrzeć się kilku technikom, które pozwolą podnieść wydajność naszej strony WWW. Dobre podsumowanie podstawowych można znaleźć w kursie wydajności na web.dev. Wśród nich wymienić można:
- minimalizację liczby zasobów blokujących renderowanie i parsowanie strony,
- optymalizację obrazków (używanie rozmiaru dopasowanego do wielkości viewportu, stosowanie nowoczesnych formatów, takich jak WebP i AVIF, leniwe wczytywanie…),
- dzielenie kodu JS na mniejsze porcje i wczytywanie ich dopiero w razie potrzeby.
Inną optymalizacją może być upewnienie się, że stosujemy najnowsze technologie. Przykładem może być protokół HTTP/3, który w niektórych przypadkach pozwoli przyśpieszyć prędkość pobierania zasobów przez przeglądarkę osoby użytkowniczej. Jednak najszybsze są te zasoby, których nie trzeba pobierać. Dlatego warto używać zarówno inline’owanie zasobów, jak i agresywne cache’owanie. To, które z nich będzie lepsze w naszym przypadku, zależy już od… naszego przypadku. Więc zawsze należy sprawdzić to empirycznie.
Ale samo wczytywanie strony to przecież dopiero początek. Równie ważne jest to, aby strona działała wydajnie i płynnie, bez “chrupnięć”. Celem powinno być renderowanie w 60 klatkach lub więcej. To oznacza, że kod JS nie może blokować głównego wątku przeglądarki (czyli tego odpowiedzialnego za renderowanie strony) na dłużej niż 16 ms (albo 8 ms, jeśli celujemy w 120 fps-ów). Jeśli musimy wykonać jakieś dłuższe zadanie, to należy je albo podzielić, albo przerzucić do workera.
Źródła
- Jeremy Keith, The intersectionality of web performance, (data dostępu: ), w: Jeremy Keith, Adactio, (data dostępu: ).
- Marcy Sutton, Accessibility and Performance, (data dostępu: ), w: Marcy Sutton, Marcy Sutton, (data dostępu: ).
- Alex Russell, The Performance Inequality Gap, 2024, (data dostępu: ), w: Alex Russell, Infrequently Noted, (data dostępu: ).
- Addy Osmani, Loading web pages fast on a $20 feature phone, (data dostępu: ), w: DEV Community, (data dostępu: ).
- Benjamin Poulain, Simon Fraser, How Web Content Can Affect Power Usage, (data dostępu: ), w: WebKit, (data dostępu: ).
- Aaron Gustafson, Performance as User Experience, (data dostępu: ), w: Aaron Gustafson, Aaron Gustafson, (data dostępu: ).
- Tim Kadlec, The Ethics of Web Performance, (data dostępu: ), w: Tim Kadlec, Tim Kadlec, (data dostępu: ).
- Robin Rendle, Accessibility and web performance are not features, they’re the baseline, (data dostępu: ), w: CSS Tricks, (data dostępu: ).
- How Website Performance Affects Conversion Rates, (data dostępu: ), w: Cloudflare, (data dostępu: ).
- Scott Jehl, 5G Will Definitely Make the Web Slower, Maybe | Filament Group, Inc., (data dostępu: ), w: Filament Group, (data dostępu: ).
- Niki Tonsky, JavaScript Bloat in 2024, (data dostępu: ), w: Niki Tonsky, tonsky.me, (data dostępu: ).
- Raul, How Much Does Mobile Data Cost Around the World?, (data dostępu: ), w: howmuch.net, (data dostępu: ).
- Tim Kadlec, New Network Fallacies, (data dostępu: ), w: Tim Kadlec, Tim Kadlec, (data dostępu: ).
- Tim Kadlec, Less Data Doesn't Mean a Lesser Experience - Web Performance Consulting, (data dostępu: ), w: Tim Kadlec, Tim Kadlec, (data dostępu: ).
- Optimizing Core Web Vitals Without Improving Site Performance, (data dostępu: ), w: DebugBear, (data dostępu: ).
- Addy Osmani, Annie Sullivan, Kouhei Ueno, How Core Web Vitals saved users 10,000 years of waiting for web pages to load, (data dostępu: ), w: Chromium Blog, (data dostępu: ).
- Rick Viscomi, A faster web in 2024, (data dostępu: ), w: Rick Viscomi, rviscomi.dev, (data dostępu: ).
- Learn Performance, (data dostępu: ), w: web.dev, (data dostępu: ).
- Robin Marx, Why HTTP/3 is eating the world, (data dostępu: ), w: APNIC Blog, (data dostępu: ).
- Scott Jehl, Inlining or Caching? Both Please!, (data dostępu: ), w: Filament Group, (data dostępu: ).
- Surma, 2018: 120fps and no jank, (data dostępu: ), w: Surma, DasSur.ma, (data dostępu: ).
- Jeremy Wagner, Optimize long tasks, (data dostępu: ), w: web.dev, (data dostępu: ).
- Using Web Workers, (data dostępu: ), w: MDN, (data dostępu: ).
Dodatkowe materiały
- Alex Russell, Wątek Alexa Russella z 15.06.2019, (data dostępu: ), w: Twitter, (data dostępu: ).
- Surma, Techniques to make a web app load fast, even on a feature phone, (data dostępu: ), w: web.dev, (data dostępu: ).
- Jeff Huang, This Page is Designed to Last: A Manifesto for Preserving Content on the Web, (data dostępu: ), w: Jeff Huang, Jeff Huang, (data dostępu: ).
- Jank Free: Let's Make the Web Silky Smooth!, (data dostępu: ).
- Deloitte, Milliseconds Make Millions, (data dostępu: ), w: Deloitte, (data dostępu: ).
- Gerry McGovern, Webwaste, (data dostępu: ), w: A List Apart, (data dostępu: ).
- Maciej Cegłowski, The Website Obesity Crisis, (data dostępu: ), w: Maciej Cegłowski, Idle Words, (data dostępu: ).
- Tim Vereecke, FRUSTRATIONindex | #WebPerf, (data dostępu: ).
- Alex Russell, Towards a Unified Theory of Web Performance, (data dostępu: ), w: Alex Russell, Infrequently Noted, (data dostępu: ).
- Michael Donohoe, Article Performance Leaderboard, (data dostępu: ).
- Paul Bakaus, The Illusion of Speed, (data dostępu: ), w: Paul Bakaus, Renaissance Geek, (data dostępu: ).
- Matt West, An Introduction to Perceived Performance, (data dostępu: ), w: Treehouse Blog, (data dostępu: ).
- Mustafa Kurtuldu, Hacking user perception to make your websites and apps feel faster, (data dostępu: ), w: Medium, (data dostępu: ).
- beyond tellerand, Tammy Everts – The Psychology of Web Performance - btconf Berlin 2023, (data uploadu: , data dostępu: ), w: YouTube, (data dostępu: ).
- Karolina Szczur, Psychology of Speed: A Guide to Perceived Performance, (data dostępu: ), w: Calibre, (data dostępu: ).
- Simon Hearne, An Inclusive Web is Fast by Default, (data dostępu: ), w: Simon Hearne, Simon Hearne, (data dostępu: ).
- Andy Bell, This is why performance matters, (data dostępu: ), w: Andy Bell, Andy Bell, (data dostępu: ).
- Eric Bailey, The intersection of performance and accessibility, (data dostępu: ), w: Notist, (data dostępu: ).
- Tim Kadlec, Performance Budgets That Stick, (data dostępu: ), w: Tim Kadlec, Tim Kadlec, (data dostępu: ).
- Chris Ashton, I Used The Web For A Day On A 50 MB Budget, (data dostępu: ), w: Smashing Magazine, (data dostępu: ).
- Dominic Tarr, your web app is bloated, (data dostępu: ), w: GitHub, (data dostępu: ).
- Alex Russell, Can You Afford It?: Real-world Web Performance Budgets, (data dostępu: ), w: Alex Russell, Infrequently Noted, (data dostępu: ).
- Philip Walton, Web Vitals, (data dostępu: ), w: web.dev, (data dostępu: ).
- Amar Sagoo, Annie Sullivan, Vivek Sekhar, The Science Behind Web Vitals, (data dostępu: ), w: Chromium Blog, (data dostępu: ).
- Nic Jansma, Cumulative Layout Shift in the Real World, (data dostępu: ), w: Nic Jansma, Nic Jansma, (data dostępu: ).
- Nicolás Peña Moreno, Annie Sullivan, Hongbo Song, Towards a better responsiveness metric, (data dostępu: ), w: web.dev, (data dostępu: ).
- Barry Pollard, Have Core Web Vitals made the web faster?, (data dostępu: ), w: Web Performance Calendar, (data dostępu: ).
- Gerardo Rodriguez, Removing layout shift from a progressively enhanced burger menu, (data dostępu: ), w: Cloud Four, (data dostępu: ).
- Jeremy Keith, The Weight of the WWWorld is Up to Us by Patty Toland, (data dostępu: ), w: Jeremy Keith, Adactio, (data dostępu: ).
- Dan Luu, The modern web on a slow connection, (data dostępu: ), w: Dan Luu, Dan Luu, (data dostępu: ).
- Nathaniel, Why your website should be under 14kB in size, (data dostępu: ), w: Nathaniel, endtimes.dev, (data dostępu: ).
- Addy Osmani, Mathias Bynens, The cost of JavaScript in 2019, (data dostępu: ), w: V8, (data dostępu: ).
- How regularly do people upgrade their smartphones?, (data dostępu: ), w: DeviceAtlas, (data dostępu: ).
- Kelvin Omereshone, The State Of Mobile And Why Mobile Web Testing Matters, (data dostępu: ), w: Smashing Magazine, (data dostępu: ).
- Alex Russell, The Mobile Performance Inequality Gap, 2021, (data dostępu: ), w: Alex Russell, Infrequently Noted, (data dostępu: ).
- Addy Osmani, The Cost Of JavaScript - 2023, (data uploadu: , data dostępu: ), w: YouTube, (data dostępu: ).