1

Výkonnost webu

s Nuxt frameworkem a jemu podobnými



Lukáš Trumm

Quanti

No notes for this slide

2

Oťukávačka

  1. Víš co jsou Core Web Vitals?
  2. Víš co je hydratace (v kontextu webových frameworků)?

No notes for this slide

3

Proč?

  • Je to složitý!
  • Proč je web pomalý? Milion důvodů…
    • hodně JavaScriptu
    • komplexita vývoje
  • Proč to řešit?
    • abychom nemuseli čekat
    • aby se lidi vůbec dostali k tomu, co potřebují
  • Proč stále vznikají nové frameworky?
    • vývojáři to chtějí mít dokonalé a nikdo
      to nechce staré
    • jeden jazyk pro vývoj na serveru i v prohlížečích
10
0
1
2
3
4
5
6
7
8
9
10

No notes for this slide

4

Výkonnost webu

  • Čas do prvního načtení stránky (TTFB, FCP, LCP)
  • Svižnost přechodu mezi stránkami (SPA)
  • Rychlost reakce na kliknutí (FID, INP)
  • Plynulost skrolování (Scroll-driven animations API)
  • Poskakování stránky během načítání (LCP)


  • Konverze
  • Umístění ve vyhledávačích
  • Nároky na hardware
1
0
1

No notes for this slide

5

Moderní meta-frameworky

React→   Next
Vue→   Nuxt
Angular→   Analog
Svelte→   SvelteKit
Solid→   SolidStart
Qwik→   QwikCity
  Laravel   Phoenix   Blazor …
2
0
1
2

No notes for this slide

6

Měření výkonnosti

  • Lighthouse – Synthetic monitoring (v prohlížeči, CI nebo cli)
  • WebPageTest – reálná zařízení po světě
  • Page Speed Insights – Google data z Chromu
  • Vlastní měření (např. Newrelic, Sentry, …) – Real User Monitoring


Lighthouse

Lighthouse

No notes for this slide

7

Core Web Vitals

No notes for this slide

8

Core Web Vitals (12. 3. 2024 !)

No notes for this slide

9

Largest Contentful Paint (LCP)


Zdroj: web.dev/lcp

No notes for this slide

10

Cumulative Layout Shift (CLS)

Zdroj: web.dev/cls

No notes for this slide

11

Interaction to Next Paint (INP)

& First Input Delay (FID)


Příklad: V baru – čekání na objednaný drink

  • FID: čas do začátku přípravy prvního drinku
    • ale limonáda se připravuje rychleji než koktejl
  • INP: čas na přípravu samotnou všech drinků po dobu návštěvy baru

Zdroj: Harry Roberts

No notes for this slide

12

Demo Lighthouse

Zběžná analýza dvou e-shopů


  • czc.cz (LCP s Cookie modálem a bez něj)
  • rohlik.cz (Nevyužitý JavaScript)

Postup

  1. Google Chrome
  2. Incognito mode (bez doplňků)
  3. DevTools, záložka Lighthouse
  4. Mode: Navigation, Device: Mobile, click Analyze

No notes for this slide

13

Page Speed Insights (RUM data, 75. percentil)

Page Speed Insights

No notes for this slide

14

Newrelic - příklad 1

Newrelic example

No notes for this slide

15

Newrelic - příklad 2

Newrelic example

No notes for this slide

16

Měření výkonnosti – shrnutí

  • Syntetické měření během vývoje, kontrola chyb (podobně jako linting)
  • RUM během provozu
  • Vybrat jen některé metriky (Google udělal za nás: Core Web Vitals)

No notes for this slide

17

Demo CrUX data

Zdroj: cwvtech.report

No notes for this slide

18

Specifika JavaScriptových frameworků

  • velká míra kontroly nad chováním v prohlížeči = příliš mnoho možností
  • každých pár měsíců nebo let změna
  • příliš snadné přidat mnoho nepotřebných závislostí
3
0
1
2
3

No notes for this slide

19

Kontrola nad způsobem renderování HTML

Zdroj: Nuxt documentation

1
0
1

No notes for this slide

20

Zrychlujeme (nezpomalujeme)

Takový metaframework už za nás dělá řadu věcí…


  • Route/component based code splitting
  • Code minification
  • File name hashing for long-term caching
  • CSS inlining
  • Less transpilation for modern browsers
  • Tree shaking
  • Prefetching
  • Image/Picture component

No notes for this slide

21

Zrychlujeme - redukce množství JavaScriptu 1

  • využít code splitting a lazy loading (Nuxt docs)
<LazyReviewsComponent />

const lazyDependency = await import("./lazy-loaded-code.js")

<LazyHydrationWrapper :when-visible="{ rootMargin: '50px' }">
  <!-- content -->
</LazyHydrationWrapper>

No notes for this slide

22

Zrychlujeme - redukce množství JavaScriptu 2

- ReviewsComponent.vue
- NonInterativeComponent.server.vue
- BrowserOnlyComponent.client.vue

  • omezit použití externích knihoven
  • izolovat skripty třetích stran
  • omezit množství globálních skriptů (např. Nuxt plugins)

No notes for this slide

23

Zrychlujeme - redukce množství JavaScriptu 3

export default defineCachedEventHandler(
  async (event) => {
    const urls = [
      /* some urls */
    ]
    return Promise.all(
      urls.map(
        /* several expensive requests */
        (url) => fetch(url).then((r) => r.json()),
        /* error handling etc. */
      ),
    )
  },
  { maxAge: 300 },
)

No notes for this slide

24

Zrychlujeme - typ renderování

  • CSR, SSR, SSG, ISR, SWR, PPR

Zdroj: Vercel engineering blog

No notes for this slide

25

Zrychlujeme - obrázky a fonty


Příklad NuxtImg s CMS Storyblok

<NuxtImg
  width="200"
  format="webp"
  provider="storyblok"
  src="https://a.storyblok.com/f/39898/3310x2192/e4ec08624e/demo-image.jpeg"
/>

No notes for this slide

26

Zrychlujeme - zdánlivě

  • vhodný efekt při načítání dat

No notes for this slide

27

Shrnutí

  • trpělivost, je to spousta malých kroků, ne jedna výhra
  • řeš hned od začátku
  • měř
  • omez JavaScript v prohlížeči
  • zvol framework uvážlivě
  • drž složitost na uzdě

No notes for this slide

28

Otázky?

No notes for this slide

29

No notes for this slide

29 slides · 45 clicks · 0 words