• Na pozici záleží
  • Async a defer
  • Porovnání výkonu
    • Není defer ani async, v hlavě
    • Žádný defer ani async, v těle
    • S async, v hlavě
    • S defer, v hlavičce
  • Blokování parsování
  • Blokování vykreslování
  • domInteractive
  • Udržování pořádku
  • Jen mi řekněte, jak je to nejlepší

Při načítání skriptu na stránce HTML musíte být opatrní, abyste nepoškodili výkon načítání stránky.

Skript se do stránky tradičně začleňuje tímto způsobem:

<script src="https://flaviocopes.com/javascript-async-defer/script.js"></script>

kdykoli analyzátor HTML najde tento řádek, provede se požadavek na načtení skriptu a skript se spustí.

Jakmile je tento proces dokončen, může parsování pokračovat a zbytek HTML může být analyzován.

Jak si dokážete představit, tato operace může mít velký vliv na dobu načítání stránky.

Pokud načítání skriptu trvá o něco déle, než se očekává, například pokud je síť trochu pomalá nebo pokud jste na mobilním zařízení a připojení je trochu nedbalé, návštěvník pravděpodobně uvidí prázdnou stránku, dokud se skript nenačte a nevykoná.

Záleží na pozici

Když se poprvé učíte jazyk HTML, dozvíte se, že značky skriptů se nacházejí v tagu <head>:

<html> <head> <title>Title</title> <script src="https://flaviocopes.com/javascript-async-defer/script.js"></script> </head> <body> ... </body></html>

Jak jsem vám již řekl, když analyzátor najde tento řádek, jde načíst skript a spustí ho. Poté, co je s tímto úkolem hotov, přejde k parsování těla.

To je špatně, protože se tím zavádí velké zpoždění. Velmi častým řešením tohoto problému je umístit značku script na konec stránky, těsně před uzavírací značku </body>.

Při tom se skript načte a provede až poté, co je celá stránka již rozebrána a načtena, což je obrovské zlepšení oproti alternativě head.

To je to nejlepší, co můžete udělat, pokud potřebujete podporovat starší prohlížeče, které nepodporují dvě relativně nové vlastnosti jazyka HTML: async a defer.

Asynchronizace a odložení

Jak asynchronizace, tak odložení jsou logické atributy. Jejich použití je podobné:

<script async src="https://flaviocopes.com/javascript-async-defer/script.js"></script>
<script defer src="https://flaviocopes.com/javascript-async-defer/script.js"></script>

při zadání obou má async v moderních prohlížečích přednost, zatímco starší prohlížeče, které podporují defer, ale ne async, se vrátí k defer.

Tyto atributy mají smysl pouze při použití skriptu v části stránky head a jsou zbytečné, pokud skript umístíte do patičky body, jak jsme viděli výše.

Srovnání výkonu

Bez defer nebo async, v hlavičce

Takto se načítá skript bez defer nebo async, umístěný v head části stránky:

Parsování je pozastaveno, dokud není skript načten a proveden. Jakmile je to provedeno, parsování se obnoví.

Bez defer nebo async, v těle stránky

Takto se načítá skript bez defer nebo async, vložený na konec značky body, těsně před jejím uzavřením:

Parsování se provádí bez pauz, a když skončí, skript se načte a provede. Parsování se provede ještě před stažením skriptu, takže se stránka uživateli zobrazí mnohem dříve než v předchozím příkladu.

S asynchronně, v hlavičce

Takto se načítá stránka se skriptem async, vloženým do značky head:

Skript se načte asynchronně, a když je hotový, parsování HTML se pozastaví, aby se skript provedl, a pak se v něm pokračuje.

S defer, v hlavičce

Takto stránka načte skript s defer, vložený do značky head:

Skript je načten asynchronně a provede se až poté, co je hotové parsování HTML.

Parsování skončí stejně, jako když umístíme skript na konec tagu body, ale celkově skončí provádění skriptu mnohem dříve, protože skript byl stažen souběžně s parsováním HTML.

Takže toto je vítězné řešení z hlediska rychlosti 🏆

Blokování parsování

async blokuje parsování stránky, zatímco defer nikoliv.

Blokování vykreslování

Na blokování vykreslování nezaručuje nic ani async ani defer. To záleží na vás a vašem skriptu (například na tom, aby se vaše skripty spouštěly až po události onLoad).

domInteractive

Skripty označené defer se spustí hned po události domInteractive, která nastane po načtení HTML, jeho parsování a sestavení DOM.

CSS a obrázky se v tomto okamžiku ještě musí analyzovat a načíst.

Jakmile je toto provedeno, prohlížeč vydá událost domComplete a poté onLoad.

domInteractive je důležitá, protože její načasování je uznáváno jako měřítko vnímané rychlosti načítání. Více viz MDN.

Udržování pořádku

Další případ pro defer: skripty označené async se spouštějí v náhodném pořadí, jakmile jsou k dispozici. Skripty označené defer se provádějí (po dokončení parsování) v pořadí, v jakém jsou definovány ve značce.

Jenom mi řekněte, jak to nejlépe udělat

Pro zrychlení načítání stránky při použití skriptů je nejlepší umístit je do head a přidat atribut defer do značky script:

<script defer src="https://flaviocopes.com/javascript-async-defer/script.js"></script>

Tento scénář vyvolá rychlejší událost domInteractive.

Vzhledem k výhodám defer se zdá, že je v řadě scénářů lepší volbou než async.

Pokud vám nevadí zpoždění prvního vykreslení stránky, ujistěte se, že při parsování stránky je již spuštěn požadovaný JavaScript.

Stáhněte si zdarma mou Příručku JavaScriptu pro začátečníky

Další návody pro prohlížeče:

  • Několik užitečných triků dostupných v HTML5
  • Jak jsem vytvořil CMS-založený na webových stránkách fungovat offline
  • Kompletní průvodce progresivními webovými aplikacemi
  • Průvodce rozhraním Fetch API
  • Průvodce rozhraním Push API
  • Kanál pro zasílání zpráv API
  • Service Workers Tutorial
  • The Cache API Guide
  • The Notification API Guide
  • Dive into IndexedDB
  • The Selectors API: QuerySelector a QuerySelectorAll
  • Efektivní načítání JavaScriptu pomocí defer a async
  • Objektový model dokumentu (DOM)
  • Webové úložiště API:
  • Zjistěte, jak fungují soubory cookie HTTP
  • Historie API
  • Obrázkový formát WebP
  • XMLHttpRequest (XHR)
  • Důkladný výukový kurz SVG
  • Co jsou to datové adresy URL
  • Mapa pro studium webové platformy
  • CORS, Cross-Origin Resource Sharing
  • Web Workers
  • Průvodce requestAnimationFrame()
  • Co je to Doctype
  • Práce s DevTools Console a rozhraním API Console
  • Rozhraní API syntézy řeči
  • Jak čekat na událost DOM ready v jednoduchém jazyce JavaScript
  • Jak přidat třídu do DOM prvku
  • Jak procházet smyčkou prvky DOM z querySelectorAll
  • Jak odebrat třídu z prvku DOM
  • Jak zkontrolovat, zda má prvek DOM třídu
  • Jak změnit hodnotu uzlu DOM
  • Jak přidat událost kliknutí do seznamu prvků DOM vrácených z querySelectorAll
  • WebRTC, Real Time Web API
  • Jak získat pozici posouvání prvku v jazyce JavaScript
  • Jak nahradit prvek DOM
  • Jak přijímat pouze obrázky v poli vstupního souboru
  • Proč používat náhledovou verzi prohlížeče?
  • Objekt Blob
  • Objekt File
  • Objekt FileReader
  • Objekt FileList
  • Objekt ArrayBuffer
  • Objekt ArrayBufferView
  • Objekt URL
  • Typy Pole
  • Objekt DataView
  • Api rozhraní BroadcastChannel
  • Api rozhraní Streams
  • Objekt FormData
  • Objekt Navigator
  • Jak používat API Geolocation
  • .

  • Jak používat funkci getUserMedia()
  • Jak používat rozhraní API Drag and Drop
  • Jak pracovat s rolováním na webových stránkách
  • Obsluha formulářů v jazyce JavaScript
  • Události klávesnice
  • Myška události
  • Dotykové události
  • Jak odstranit všechny děti z prvku DOM
  • Jak vytvořit atribut HTML pomocí vanilla Javascriptu
  • Jak pomocí JavaScriptu zkontrolovat, zda je zaškrtávací políčko zaškrtnuté?
  • Jak zkopírovat do schránky pomocí JavaScriptu
  • Jak zakázat tlačítko pomocí JavaScriptu
  • Jak zajistit, aby byla stránka v prohlížeči upravitelná
  • Jak na to? získat hodnoty dotazovacího řetězce v JavaScriptu pomocí URLSearchParams
  • Jak odstranit ze stránky všechny CSS najednou
  • Jak použít insertAdjacentHTML
  • Safari, varování před ukončením
  • Jak přidat obrázek do DOM pomocí JavaScriptu
  • Jak obnovit formulář
  • Jak používat písma Google

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.