Text javascript async src načítaný. Asynchrónne načítanie JavaScriptu – zrýchlenie načítania stránky. Pridanie atribútov odložiť alebo async vo WordPress

  • 29.06.2020

Dobrý deň, priatelia! Vedeli ste, že načítanie JavaScriptu je jednou z najväčších prekážok výkonnosti webových stránok? Dnes je mojou hlavnou úlohou vysvetliť, čo je to skript a ako ovplyvňuje rýchlosť a výkon stránky.

Prehliadač načítajúci značku skriptu prestane vykresľovať stránku, kým sa skript nenačíta a nespustí. Stránka je zablokovaná a prehliadač niekoľko sekúnd nereaguje na akcie používateľa. Čas oneskorenia závisí od niekoľkých faktorov:

  • konfigurácia,
  • rýchlosť internetového pripojenia,
  • veľkosť súboru a iné...

Z tohto dôvodu Google PageSpeed ​​​​Insights odporúča odstrániť JavaScript z hornej časti stránky, ktorý blokuje zobrazenie. Je dobrým zvykom umiestňovať skripty na spodok stránky, napríklad pred uzatváraciu značku.

alebo nastavenie asynchrónneho načítania.

Ak kód skriptu ovplyvňuje zobrazenie hornej časti stránky, nevkladajte ho do samostatného súboru, ale vložte ho priamo do HTML.

JS môže zmeniť obsah stránky a dokonca presmerovať na inú adresu URL. V tomto prípade zahrnutie skriptu na koniec dokumentu povedie k efektu „šklbania“ stránky, načítavania nových alebo zmeny existujúcich prvkov v hornej časti.

Použitie atribútov async a defer na značku skriptu

Poďme sa pozrieť na to, čo je asynchrónna a odložená práca JavaScriptu a aký je zásadný rozdiel medzi atribútmi async a defer. Najprv sa však pozrime na postupnosť spracovania dokumentu s obvyklým pripojením značky skriptu.

< src = "example.js">

Pre názorný príklad použijem nasledujúce konvencie:

- spracovanie stránky
- načítanie skriptu
- vykonávanie skriptu

Postupnosť spracovania je teda nasledovná:

Analýza kódu HTML sa preruší počas načítavania a vykonávania skriptu a potom pokračuje. Pri zobrazovaní webovej stránky došlo k oneskoreniu.

Odložiť atribút

Atribút odložiť umožňuje prehliadaču spustiť paralelné načítanie súborov js bez zastavenia ďalšieho spracovania stránky. Spúšťajú sa po úplnom rozbore modelu objektu dokumentu (skrátene DOM), pričom prehliadač zaručuje konzistenciu na základe poradia, v ktorom sú súbory pripojené.

< defer src = "example.js">

Async atribút

Podpora atribútu async sa objavila v HTML5, umožňuje prehliadaču načítať súbory js paralelne a spustiť ich ihneď po načítaní, bez čakania na spracovanie zvyšku stránky.

< async src = "example.js">

Schéma poradia spracovania:

Toto je asynchrónne sťahovanie. Tento atribút sa odporúča pre skripty, ktoré výrazne neovplyvňujú zobrazenie dokumentu. Patria sem počítadlá zhromažďovania štatistík (Google Analytics, Yandex Metrica), kódy reklamných sietí (Reklamná sieť Yandex, Google AdSense), tlačidlá sociálnych médií atď.

Rýchlosť načítania webových stránok je jedným z hodnotiacich faktorov v Google.

Asynchrónne pripojenie JavaScript skracuje časy načítania stránky odstránením latencie. Spolu s tým odporúčam komprimovať a zlúčiť js súbory do jedného, ​​napríklad pomocou knižnice. Používatelia milujú rýchle stránky 😎

Async and Defer – stratégie načítania JavaScriptu


JavaScript je nevyhnutnou súčasťou každej modernej webovej aplikácie a stratégie, ktoré sa rozhodneme použiť na načítanie, priamo ovplyvňujú výkon tejto aplikácie. V tomto článku sa pokúsime pochopiť dôležité rozdiely medzi jednotlivými prístupmi, výhody a nevýhody spolu s dôsledkami na výkon a ako optimalizovať interakciu so stránkou a časy načítania.

Pre ukážku vytvorím webovú stránku pozostávajúcu z nasledujúcich externých závislostí. Venujte zvláštnu pozornosť príslušným veľkostiam súborov, pretože časy sťahovania súborov sú tomu priamo úmerné.

  • HTML - stránka ~ 1 MB. Obsahuje skutočné označenie / obsah na zobrazenie dynamického výstupu z JavaScriptu.
  • Obrázok - image1.png ~ 5 Mb
  • JavaScript - file1.JS ~ 3 MB je jadro (hlavný súbor) javascript a závisí od analýzy HTML. Je potrebné zobraziť nejaký dynamický obsah alebo na stránku namontovať reakčný / uhlový komponent.
  • JavaScript - file2.js ~ 460B je malý, nezávislý súbor javascript, ktorý interaguje s domom.
  • JavaScript – file3.js ~ 1,5 MB je sekundárny súbor js a závisí od súboru 1.js, aby mohol spustiť nejaký kód s nižšou prioritou. Tento kód sa nevyžaduje okamžite na vykresľovanie stránky a interakciu používateľa; zobrazuje ikony sociálnych médií, komentáre, online pomoc, spúšťanie niektorých analytických úloh atď.
Teraz je čas analyzovať rôzne prístupy

Prístup 1 [skripty v hlavnej časti]

V prvom prípade načítame všetky značky skriptov do sekcie head nášho HTML. Nižšie je snímka obrazovky analýzy karty siete na stránke Chrome, ktorá je pripravená na interakciu používateľa.

Výhody:

Postupnosť vykonávania kódu rôznych súborov JS sa uloží v poradí, v akom boli súbory zahrnuté v HTML. V aktuálnom príklade, aj keď boli súbor2 a súbor3 načítané pred súborom1, poradie vykonávania bude správne.

mínusy:

V tomto scenári bude analýza HTML pozastavená, kým sa nenačítajú, analyzujú a nespustia všetky 3 skripty v sekcii head. Používateľovi sa zobrazí prázdna biela obrazovka, aj keď už bol súbor HTML načítaný [ale neanalyzovaný]. To rozhodne nie je dobré pre použiteľnosť.

Žiadny z vyššie uvedených skriptov nebude môcť pristupovať a manipulovať s HTML stránkou, pretože DOM ešte nie je pripravený. Jedným z možných riešení na zvládnutie tohto problému je počúvať udalosť DOMContentLoaded a potom spustiť kód. DOMContentLoaded Táto udalosť sa spustí, keď sa pôvodný dokument HTML úplne načíta a analyzuje bez čakania na dokončenie načítania šablón so štýlmi, obrázkov.

Prístup 2 [skript na konci]

Aby sme prekonali 2 problémy, ktorým čelíme pri prvom prístupe, načítajme všetky 3 skripty do spodnej časti značky body.

Výhody: HTML sa analyzuje pred načítaním skriptov, takže používateľ bude môcť okamžite vidieť skutočný obsah namiesto čakania na skripty.

Keďže všetky skripty sú spustené po analýze HTML, všetky môžu pristupovať k DOM pre akúkoľvek manipuláciu. Postupnosť vykonávania skriptu je zachovaná.

mínusy:

Neexistuje žiadny nárast výkonu ako taký.

Prístup 3 [pomocou atribútu Async]

HTML5 zaviedlo atribút async script, ktorý pomáha pri načítavaní vhodných súborov skriptov paralelne s iným streamom bez ovplyvnenia analýzy HTML.

Zodpovedajúci skript sa však analyzuje a spustí hneď po dokončení načítania, či už je analýza HTML dokončená alebo nie, a bude odkazovať na prvok DOM až do tohto špecifického bodu.

Tu môžete jasne vidieť, že súbor2.js bol načítaný pred súborom HTML. Kým však prehliadač načítal súbor 2, nepozastavil analýzu HTML, a preto v čase, keď bola vykonaná, mal odkaz na zástupný znak html na vloženie dynamického obsahu.

Výhody: Keďže skripty sú načítané v inom vlákne, analýza HTML nebude pozastavená a používateľ bude môcť vidieť okamžitý obsah namiesto bielej prázdnej obrazovky. Hlavné zvýšenie výkonu, t. j. čas DOMContentLoaded sa znížil zo 47,68 sekundy na iba 21,12 sekundy a predstavuje ~ 55 % zisku.

mínusy:

Sekvencia vykonávania JS nie je zachovaná. Vykoná sa v správnom poradí načítania, nie podľa sekvencie skriptov zahrnutej v HTML. Podpora prehliadača – nie je podporovaná v starších webových prehliadačoch, napr. IE 9 a nižších.

Čo sa stane, ak sa JS načíta skôr, ako bude k dispozícii prvok DOM? Vyvolá sa chyba.

Poznámka: Umiestňovanie skriptov s atribútom async na spodok časti tela by bolo zbytočné a ekvivalentné prístupu-2.

Prístup 4 [pomocou atribútu Odložiť]

Atribút Defer spôsobí, že skript sa vykoná až po dokončení analýzy HTML. Jeden veľmi dôležitý bod, ktorý treba mať na pamäti, je, že Chrome zatiaľ nepodporuje odklad a nemá žiadny vplyv na trvanie DOMContentLoaded. Spúšťa však skripty na konci analýzy HTML.

Výhody:

Postupnosť importovania skriptov je zachovaná. Súbor 3.js sa teda spustí až po dokončení sťahovania a spustení súboru 1, aj keď bol súbor 3 načítaný skôr.

Podpora prehliadača - má lepšiu podporu prehliadača v porovnaní s atribútom async, t.j. čiastočne podporovaný v IE v6-9

Skripty môžu pristupovať k modelu DOM, pretože sa spustí až po analýze úplného kódu HTML.

mínusy:

Pôvodne som si myslel, že odklad bude lepšou voľbou ako async, ale neskôr som zistil, že Chrome ho zatiaľ nepodporuje [verzia 71.0.3578.98] a nemá žiadny vplyv na trvanie DOMContentLoaded.

Vo Firefoxe však funguje podľa očakávania s výraznými vylepšeniami výkonu.

závery

Pre knižnice tretích strán, ktoré závisia od Google Analytics, Google reCAPTCHA alebo čohokoľvek iného, ​​čo nevyžaduje prístup DOM, je vhodnejšie umiestniť značky skriptu do sekcie head s atribútom async, pretože zodpovedajúce skripty sa načítavajú paralelne, ale spúšťajú sa okamžite. .

Odložiť použite pre všetky ostatné skripty načítané v sekcii head, pretože sa tiež načítajú paralelne, ale vykonajú sa až po dokončení analýzy HTML a pripravenosti na prístup / manipuláciu s DOM.

Môžete tiež použiť kombináciu poslucháča DOMContentLoaded v asynchrónnych skriptoch na neskoršie spustenie funkcií. Svoje názory a závery prosím zanechajte v komentároch, rád ich s vami prediskutujem.


Autorom tohto materiálu som ja - Jurij Pakholkov. Poskytujem služby v oblasti písania programov v Jave, C++, C# (ako aj poradenstvo k nim) a tvorby webových stránok. Pracujem so stránkami na CMS OpenCart, WordPress, ModX a self-write. Okrem toho pracujem priamo s JavaScriptom, PHP, CSS, HTML - teda viem upraviť vašu stránku alebo pomôcť s programovaním webu.

Plug-in skripty (JavaScript) blokujú načítanie HTML kódu. Keď prehliadač (analyzátor) dosiahne značku

Атрибут async



, использовать async или defer не имеет смысла поскольку к этому моменту парсер уже проанализировал весь HTML код.

Является ли скрипт самодостаточным?

Для файлов (скриптов), которые не нужны для работы других скриптов и сами не имеют зависимостей от других скриптов, атрибут async особенно полезен. Поскольку в этом случае все равно, в какой именно момент выполняется скрипт, асинхронная загрузка является наиболее подходящим вариантом.

Нужен ли полностью загруженный DOM для работы скрипта?

Если это необходимо, то использование async уместно только в случае если скрипт рассчитан на асинхронную загрузку - т.е. он ждет события пока загрузиться DOM и только потом начинает свою работу.

Или можно использовать атрибут defer . В этом случае размещать вызов script можно в любом месте HTML.

Маленький ли скрипт?

Если скрипт относительно мал и от него зависят или он зависит от других скриптов, то его можно встроить прямо в HTML (подключить inline).

Поддержка браузерами 97%

Добавление атрибутов defer или async в WordPress

Штатных способов сделать это нет, поэтому будем пользоваться хуком script_loader_tag :

Add_action("wp_enqueue_scripts", "my_scripts_method"); function my_scripts_method(){ // подключаем скрипт wp_enqueue_script("my-script", get_template_directory_uri() . "/js/my-script.js"); // Добавляем атрибут defer к скрипту с id `my-script` add_filter("script_loader_tag", "change_my_script", 10, 3); function change_my_script($tag, $handle, $src){ if("my-script" === $handle){ // return str_replace(" src", " async src", $tag); return str_replace(" src", " defer src", $tag); } return $tag; } }

The HTML

A nasledujúce príklady ukazujú, ako vložiť (vložený) skript do

Záložný modul

Prehliadače, ktoré podporujú hodnotu modulu pre atribút type, ignorujú akýkoľvek skript s atribútom nomodule. To vám umožňuje používať skripty modulov a zároveň poskytovať záložné skripty označené ako nomodule pre nepodporujúce prehliadače.

technické údaje

Špecifikácia Postavenie Komentáre
Životný štandard HTML
Definícia "


Stránky pomocníka pre počítače

© Copyright 2021,
rzdoro.ru – stránka počítačovej pomoci

  • Kategórie
  • Železo
  • Windows 10
  • Skenovanie
  • Windows 7
  • Železo
  • Windows 10
  • Skenovanie
  • Windows 7