Mam kilka pytań o atrybutach async
i defer
dla <script>
tagu, który w moim rozumieniu tylko pracy w HTML5 przeglądarek.
Jedna z moich witryn ma dwa zewnętrzne pliki JavaScript, które obecnie znajdują się tuż nad </body>
tagiem; pierwszy tojquery pochodzi z Google, a drugi to lokalny skrypt zewnętrzny.
W odniesieniu do prędkości ładowania strony
Czy jest jakaś korzyść z dodania
async
do dwóch skryptów, które mam na dole strony?Czy byłoby jakąś zaletą dodanie
async
opcji do dwóch skryptów i umieszczenie ich na górze strony w<head>
?- Czy to znaczy, że pobierają się podczas ładowania strony?
- Zakładam, że spowodowałoby to opóźnienia w przeglądarkach HTML4, ale czy przyspieszyłoby to ładowanie strony w przeglądarkach HTML5?
Za pomocą <script defer src=...
- Czy załadowanie dwóch skryptów wewnątrz
<head>
z atrybutem miałobydefer
taki sam wpływ, jak posiadanie skryptów wcześniej</body>
? - Po raz kolejny zakładam, że spowolniłoby to przeglądarkę HTML4.
Za pomocą <script async src=...
Jeśli mam dwa skrypty z async
włączoną funkcją
- Czy będą pobierać w tym samym czasie?
- A może pojedynczo z resztą strony?
- Czy kolejność skryptów staje się wtedy problemem? Na przykład jeden skrypt zależy od drugiego, więc jeśli jeden pobierze szybciej, drugi może nie działać poprawnie itp.
Wreszcie, czy najlepiej zostawić rzeczy takimi, jakie są, dopóki HTML5 nie będzie częściej używany?
javascript
html
Adam
źródło
źródło
async
jest nowy (ish), aledefer
jest częścią IE od IE4.defer
został dodany do innych przeglądarek znacznie niedawno, ale starsze wersje tych przeglądarek mają tendencję do zawieszania się o wiele mniej.defer
to tak samo, jak umieszczanie skryptów na dole HTML, co jest powszechne od wielu lat.Odpowiedzi:
Zachowaj skrypty wcześniej
</body>
. Asynchronii można używać ze skryptami znajdującymi się tam w kilku okolicznościach (patrz dyskusja poniżej). Odroczenie nie zrobi dużej różnicy dla skryptów znajdujących się tam, ponieważ i tak parsowanie DOM zostało już wykonane.Oto artykuł wyjaśniający różnicę między asynchronizacją a odroczeniem: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ .
Twój HTML będzie wyświetlać się szybciej w starszych przeglądarkach, jeśli skrypty znajdują się na końcu treści tuż przed
</body>
. Aby zachować szybkość ładowania w starszych przeglądarkach, nie chcesz umieszczać ich nigdzie indziej.Jeśli drugi skrypt zależy od pierwszego skryptu (np. Drugi skrypt korzysta z jQuery załadowanego w pierwszym skrypcie), nie można ich asynchronizować bez dodatkowego kodu sterującego kolejnością wykonywania, ale można je odroczyć, ponieważ skrypty odroczone nadal będą wykonywane w kolejności, ale dopiero po przeanalizowaniu dokumentu. Jeśli masz ten kod i nie potrzebujesz skryptów do natychmiastowego uruchomienia, możesz ustawić je jako asynchroniczne lub odraczać.
Możesz umieścić skrypty w
<head>
tagu i ustawić je,defer
a ładowanie skryptów zostanie odroczone do momentu parsowania DOM, co zapewni szybkie wyświetlanie strony w nowych przeglądarkach, które obsługują odraczanie, ale to wcale ci nie pomoże w starszych przeglądarkach i nie jest tak naprawdę szybsze niż po prostu umieszczenie skryptów tuż przed tym,</body>
co działa we wszystkich przeglądarkach. Możesz więc zrozumieć, dlaczego najlepiej jest umieścić je wcześniej</body>
.Asynchronizacja jest bardziej przydatna, gdy naprawdę nie obchodzi Cię, kiedy skrypt się ładuje i nic innego, co jest zależne od użytkownika, nie zależy od ładowania skryptu. Najczęściej cytowanym przykładem użycia asynchronizacji jest skrypt analityczny, taki jak Google Analytics, na który nie chcesz czekać i nie trzeba go szybko uruchamiać, a działa on samodzielnie, więc nic innego od tego nie zależy.
Zwykle biblioteka jQuery nie jest dobrym kandydatem do asynchronizacji, ponieważ zależą od niej inne skrypty i chcesz zainstalować procedury obsługi zdarzeń, aby strona mogła zacząć reagować na zdarzenia użytkownika i może być konieczne uruchomienie kodu inicjującego opartego na jQuery w celu ustalenia stanu początkowego strony. Można go użyć asynchronicznie, ale inne skrypty będą musiały zostać zakodowane, aby nie zostały uruchomione do momentu załadowania jQuery.
źródło
head
i ustawianie ichdefer
nie będzie szybsze niż wstawianie ich wcześniej</body>
, ale z tego, co przeczytałem, jest to nieprawidłowe. Pomyśl o tym - jeśli włożysz skrypty<head>
, zaczną one natychmiast pobierać, a jeśli są w porządku,</body>
wszystkie pozostałe elementy zostaną pobrane jako pierwsze.Ten obraz wyjaśnia normalny tag skryptu, asynchronizację i odroczenie
Skrypty asynchroniczne są wykonywane natychmiast po załadowaniu skryptu, więc nie gwarantuje kolejności wykonywania (skrypt podany na końcu może zostać wykonany przed pierwszym plikiem skryptu)
Odroczone skrypty gwarantują kolejność wykonywania, w jakiej pojawiają się na stronie.
Zobacz ten link: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
źródło
async
że wygra. Zobacz stackoverflow.com/questions/13821151/…<script>
znacznika całkowita długość ładowania strony jest większa o czas potrzebny do pobrania pliku skryptu.HTML5:
async
,defer
W HTML5 możesz powiedzieć przeglądarce, kiedy uruchomić kod JavaScript. Istnieją 3 możliwości:
Bez
async
lubdefer
przeglądarka natychmiast uruchomi skrypt, zanim wyrenderuje elementy znajdujące się poniżej tagu skryptu.W przypadku
async
(asynchronicznego) przeglądarka będzie nadal ładować stronę HTML i renderować ją, jednocześnie ładując i wykonując skrypt.Dzięki
defer
przeglądarce przeglądarka uruchomi skrypt, gdy strona zakończy przetwarzanie. (nie trzeba kończyć pobierania wszystkich plików obrazów. To dobrze.)źródło
async=""
przed sprawdzeniem poprawności i zapisaniem zmian w szablonie.async
- Skrypty są wykonywane od momentu ich pobrania, bez względu na ich kolejność w pliku HTML.Oba
async
idefer
skrypty zaczynają się natychmiast pobierać bez wstrzymywania analizatora składni i oba obsługują opcjonalnyonload
moduł obsługi, aby zaspokoić powszechną potrzebę inicjalizacji, która zależy od skryptu.Różnica między
async
idefer
koncentruje się wokół wykonywania skryptu. Każdyasync
skrypt jest uruchamiany przy pierwszej okazji po zakończeniu pobierania i przed zdarzeniem ładowania okna. Oznacza to, że możliwe (i prawdopodobne), żeasync
skrypty nie są wykonywane w kolejności, w jakiej występują na stronie. Podczas gdydefer
skrypty z drugiej strony są gwarantowane w kolejności, w jakiej występują na stronie. Wykonanie rozpoczyna się po całkowitym zakończeniu analizy, ale przedDOMContentLoaded
zdarzeniem dokumentu .Źródło i dalsze szczegóły: tutaj .
źródło
W obliczu tego samego rodzaju problemu i teraz zrozumiałe, jak oba będą działać. Mam nadzieję, że ten link referencyjny będzie pomocny ...
Asynchronizacja
Po dodaniu atrybutu async do tagu skryptu wystąpią następujące zdarzenia.
Odraczać
Odroczenie jest bardzo podobne do asynchronicznego z jedną zasadniczą różnicą. Oto, co się dzieje, gdy przeglądarka napotka skrypt z atrybutem odroczenia.
Odniesienie: Różnica między Asyncem a odroczeniem
źródło
async
idefer
pobierze plik podczas analizy HTML. Oba nie przerywają analizatora składni.Skrypt z
async
atrybutem zostanie wykonany po pobraniu. Podczas gdy skrypt zdefer
atrybutem zostanie wykonany po zakończeniu analizy DOM.Załadowane skrypty
async
nie gwarantują żadnego zamówienia. Podczas gdy skrypty ładowane zdefer
atrybutem zachowują kolejność, w jakiej pojawiają się w DOM.Użyj,
<script async>
gdy skrypt nie polega na niczym. kiedy skrypt zależy od użycia.Najlepszym rozwiązaniem byłoby dodanie dolnej części ciała. Nie będzie problemu z blokowaniem lub renderowaniem.
źródło
Myślę, że Jake Archibald przedstawił nam pewne spostrzeżenia w 2013 roku, które mogą dodać jeszcze więcej pozytywności do tematu:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Mimo to może to nie być najszybszy sposób ładowania skryptów:
źródło
Wygląda na to, że zachowanie odroczenia i asynchronizacji zależy od przeglądarki, przynajmniej od fazy wykonania. UWAGA, odroczenie dotyczy tylko zewnętrznych skryptów. Zakładam, że asynchronizacja przebiega według tego samego wzorca.
W IE 11 i niższych kolejność wygląda następująco:
W Edge, Webkit itp. Atrybut asynchroniczny wydaje się być ignorowany lub umieszczony na końcu:
W nowszych przeglądarkach atrybut data-pagespeed-no-defer działa przed innymi zewnętrznymi skryptami. Dotyczy to skryptów, które nie zależą od DOM.
UWAGA: Użyj odroczenia, gdy potrzebujesz jawnej kolejności wykonywania zewnętrznych skryptów. Mówi to przeglądarce, aby wykonała wszystkie odroczone skrypty w kolejności umieszczenia w pliku.
NA BOK: Rozmiar zewnętrznych javascripts miał znaczenie podczas ładowania ... ale nie miał wpływu na kolejność wykonywania.
Jeśli martwisz się wydajnością swoich skryptów, możesz rozważyć miniaturyzację lub po prostu dynamicznie ładować je za pomocą XMLHttpRequest.
źródło
data-pagespeed-no-defer
jest atrybutem używanym przez moduł PageSpeed po stronie serwera . Sam atrybut nie działa w żadnej przeglądarce.data-pagespeed-no-defer