Gdzie jest właściwe miejsce do umieszczenia <script>
tagów i dołączonego kodu JavaScript podczas osadzania kodu JavaScript w dokumencie HTML ? Wydaje mi się, że nie należy umieszczać ich w <head>
sekcji, ale umieszczanie jej na początku <body>
jest również złe, ponieważ JavaScript musi zostać przeanalizowany, zanim strona zostanie całkowicie zrenderowana (lub coś w tym rodzaju). To wydaje się opuścić koniec tego <body>
odcinka jako logiczny miejsce dla <script>
tagów.
Więc gdzie jest właściwe miejsce na umieszczenie <script>
tagów?
(To pytanie odnosi się do tego pytania , w którym zasugerowano, że wywołania funkcji JavaScript powinny być przenoszone z <a>
tagów do <script>
tagów. Używam jQuery, ale bardziej ogólne odpowiedzi są również odpowiednie.)
javascript
jquery
html
mipadi
źródło
źródło
Odpowiedzi:
Oto, co się dzieje, gdy przeglądarka ładuje witrynę z
<script>
tagiem:<script>
znacznik odwołujący się do zewnętrznego pliku skryptu.Krok # 4 powoduje złe wrażenia użytkownika. Twoja witryna zasadniczo przestaje się ładować, dopóki nie pobierzesz wszystkich skryptów. Jeśli coś nienawidzi użytkowników, czeka na załadowanie strony internetowej.
Dlaczego tak się dzieje?
Każdy skrypt może wstawiać własny kod HTML za pośrednictwem
document.write()
lub innych manipulacji DOM. Oznacza to, że analizator składni musi poczekać, aż skrypt zostanie pobrany i wykonany, aby mógł bezpiecznie przeanalizować resztę dokumentu. W końcu skrypt mógł wstawić własny dokument HTML do dokumentu.Jednak większość programistów JavaScript nie manipuluje już DOM podczas ładowania dokumentu. Zamiast tego czekają na załadowanie dokumentu, zanim go zmodyfikują. Na przykład:
JavaScript:
Ponieważ twoja przeglądarka nie wie, że my-script.js nie zmodyfikuje dokumentu, dopóki nie zostanie pobrany i wykonany, analizator przestaje analizować.
Zalecenia przestarzałe
Stare podejście do rozwiązania tego problemu polegało na umieszczaniu
<script>
tagów na spodzie twojego<body>
, ponieważ zapewnia to, że parser nie zostanie zablokowany do samego końca.Takie podejście ma swój własny problem: przeglądarka nie może rozpocząć pobierania skryptów, dopóki cały dokument nie zostanie przeanalizowany. W przypadku większych witryn z dużymi skryptami i arkuszami stylów możliwość jak najszybszego pobrania skryptu jest bardzo ważna dla wydajności. Jeśli witryna nie załaduje się w ciągu 2 sekund, ludzie przejdą do innej witryny.
W optymalnym rozwiązaniu przeglądarka zacznie pobierać skrypty tak szybko, jak to możliwe, jednocześnie analizując resztę dokumentu.
Nowoczesne podejście
Obecnie przeglądarki obsługują skrypty
async
idefer
atrybuty. Te atrybuty mówią przeglądarce, że parsowanie skryptów jest bezpieczne.asynchronizacja
Skrypty z atrybutem asynchronicznym są wykonywane asynchronicznie. Oznacza to, że skrypt jest wykonywany natychmiast po pobraniu, bez blokowania przeglądarki w międzyczasie.
Oznacza to, że możliwe jest pobranie i wykonanie skryptu 2 przed skryptem 1.
Według http://caniuse.com/#feat=script-async , 97,78% wszystkich przeglądarek obsługuje to.
odraczać
Skrypty z atrybutem odroczenia są wykonywane w kolejności (tj. Najpierw skrypt 1, a następnie skrypt 2). To również nie blokuje przeglądarki.
W przeciwieństwie do skryptów asynchronicznych, odroczone skrypty są wykonywane dopiero po załadowaniu całego dokumentu.
Według http://caniuse.com/#feat=script-defer 97,79% wszystkich przeglądarek obsługuje to. 98,06% popiera to co najmniej częściowo.
Ważna uwaga na temat kompatybilności przeglądarki: w niektórych przypadkach IE <= 9 może wykonywać odroczone skrypty w kolejności. Jeśli potrzebujesz obsługi tych przeglądarek, przeczytaj to najpierw!
Wniosek
Obecnym stanem techniki jest umieszczanie skryptów w
<head>
tagu i używanie atrybutówasync
lubdefer
. Pozwala to na szybkie pobieranie skryptów bez blokowania przeglądarki.Dobrą rzeczą jest to, że witryna powinna nadal poprawnie ładować się w 2% przeglądarek, które nie obsługują tych atrybutów, przy jednoczesnym przyspieszeniu pozostałych 98%.
źródło
document.write
działa na dom. Pytanie nie dotyczy tego, czy skrypt manipuluje domem, ale kiedy to robi. Tak długo, jak wszystkie manipulacje domem mają miejsce podomready
uruchomieniu zdarzenia, wszystko jest w porządku. jQuery jest biblioteką i jako taka nie - lub nie powinna - sama manipulować domeną.async
idefer
atrybuty nie są nigdzie używane? Mam na myśli, że przeglądałem wiele źródeł HTML z Internetuasync
idefer
nigdzie nie widzę atrybutów. ...Tuż przed zamykającym znacznikiem body, jak podano na
http://developer.yahoo.com/performance/rules.html#js_bottom
źródło
Nieblokujące tagi skryptowe można umieszczać niemal wszędzie:
async
skrypt zostanie wykonany asynchronicznie, gdy tylko będzie dostępnydefer
skrypt jest wykonywany po zakończeniu analizy dokumentuasync defer
skrypt wraca do zachowania odroczenia, jeśli asynchronizacja nie jest obsługiwanaTakie skrypty będą wykonywane asynchronicznie / po przygotowaniu dokumentu, co oznacza, że nie możesz tego zrobić:
Albo to:
Albo to:
Albo to:
Mimo to skrypty asynchroniczne mają następujące zalety:
przeglądarka może pobierać arkusze stylów, obrazy i inne skrypty równolegle bez oczekiwania na pobranie i uruchomienie skryptu.
możesz umieścić skrypty w głowie lub ciele bez obawy o blokowanie (przydatne, jeśli korzystasz z CMS). Kolejność wykonania wciąż ma jednak znaczenie.
Możliwe jest obejście problemów z kolejnością wykonywania za pomocą zewnętrznych skryptów obsługujących wywołania zwrotne. Wiele zewnętrznych interfejsów API JavaScript obsługuje teraz nieblokujące wykonywanie. Oto przykład asynchronicznego ładowania interfejsu API Map Google .
źródło
<head>
logiki.async
lubdefer
gdy w tym jQuery, jak można określić w swoim drugim bloku:<script src="jquery.js" async></script>
. Czy potrafisz wyjaśnić, dlaczego? Pomyślałem, że muszę mieć tag asynchroniczny dla wydajności - zgodnie z przyjętą odpowiedzią - aby moja strona mogła się załadować, nawet gdy jQuery wciąż się ładuje]. Dzięki!<script src=jquery.js>
następuje$(function(){ ... })
gdzieś na stronie blok. Ładowanie asynchroniczne nie gwarantuje, że jQuery zostanie załadowane, gdy przeglądarka spróbuje parsować te bloki, dlatego podniesie $ nie zdefiniowany błąd (możesz nie otrzymać błędu, jeśli jQuery został załadowany z pamięci podręcznej). Odpowiedziałem na pytanie dotyczące asynchronicznego ładowania jQuery i zachowania$(function(){ ... })
. Zobaczę, czy mogę to znaleźć, lub możesz spojrzeć na to pytanie: stackoverflow.com/q/14811471/87015jquery
załadować bibliotekę, a potem pozostałe.js
skrypty. Kiedy deklarujęasync
lubdefer
najquery
znaczniku skryptowym lib, moje.js
skrypty nie działają. Myślałem, że$(function(){ ... })
to chronię - nie sądzę. Aktualny rozwiązanie: Nie dodawaćdefer
lubasync
najquery
lib skrypcie, ale nie dodaćasync
na mojej Kontynuacja.js
skryptów. Uwaga: powodem robię każdy tego jest, aby Google Page Speed szczęśliwy. Jeszcze raz dziękuję za pomoc! Wszelkie inne porady są mile widziane. (Lub link do Twojej poprzedniej odpowiedzi). :)Standardowa rada promowana przez Yahoo! Zespół
<script>
ds. Wyjątkowej wydajności umieszcza tagi na końcu treści dokumentu, aby nie blokowały renderowania strony.Istnieją jednak nowsze podejścia, które oferują lepszą wydajność, jak opisano w tej odpowiedzi na temat czasu ładowania pliku JavaScript Google Analytics:
źródło
Jeśli używasz JQuery, umieść javascript tam, gdzie znajdziesz go najlepiej i użyj
$(document).ready()
aby upewnić się, że wszystko zostało poprawnie załadowane przed uruchomieniem jakichkolwiek funkcji.Na marginesie: podoba mi się wszystkie moje tagi skryptu w
<head>
sekcji, ponieważ wydaje się to najczystsze miejsce.źródło
<header>
?$(document).ready()
nie oznacza, że możesz umieścić JavaScript w dowolnym miejscu - nadal musisz go umieścić po miejscu, w<script src=".../jquery.min.js">
którym umieścisz jQuery, więc$
istnieje.header
element jest częścią zawartości dokumentu HTML i powinien wystąpić raz lub więcej razy w obrębiebody
elementu. The
head` tag dla danych metadanych i danych innych niż treść dokumentu. Jest to, w tych dniach, zedefer
iasync
to idealne miejsce dla tagów skryptu.header
elementy powinny zawierać tylko informacje opisujące następującą sekcję dokumentu.Nowoczesne podejście w 2019 roku wykorzystuje skrypty typu modułu ES6 .
Domyślnie moduły są ładowane asynchronicznie i odraczane. tzn. możesz umieścić je w dowolnym miejscu, a będą one ładowane równolegle i wykonywane po zakończeniu ładowania strony.
Różnice między skryptem a modułem opisano tutaj:
https://stackoverflow.com/a/53821485/731548
Wykonanie modułu w porównaniu ze skryptem opisano tutaj:
https://developers.google.com/web/fundamentals/primers/modules#defer
Wsparcie pokazano tutaj:
https://caniuse.com/#feat=es6-module
źródło
XHTML nie będzie sprawdzany, jeśli skrypt znajduje się w innym miejscu niż element head.okazuje się, że może być wszędzie.Możesz odroczyć wykonanie za pomocą czegoś takiego jak jQuery, aby nie miało znaczenia, gdzie jest umieszczone (z wyjątkiem niewielkiego spadku wydajności podczas analizowania).
źródło
Znacznika skryptu należy używać zawsze przed zamknięciem treści lub na dole pliku HTML .
wtedy możesz najpierw zobaczyć zawartość strony przed załadowaniem pliku js .
zaznacz to, jeśli to konieczne: http://stevesouders.com/hpws/rule-js-bottom.php
źródło
Konwencjonalna (i powszechnie akceptowana) odpowiedź brzmi „na dole”, ponieważ wtedy cały DOM zostanie załadowany, zanim cokolwiek zacznie działać.
Z różnych powodów istnieją dysydenci, zaczynając od dostępnej praktyki, aby celowo rozpocząć wykonywanie zdarzenia zdarzenia onload strony.
źródło
Najlepsze miejsce, aby umieścić
<script>
znacznik jest przed zamknięciem</body>
tagu , więc pobieranie i wykonywanie nie blokuje przeglądarkę do analizowania HTML w dokumencie,Również ładowanie plików js na zewnątrz ma swoje zalety, ponieważ będzie buforowane przez przeglądarki i może przyspieszyć ładowanie strony , oddziela kod HTML i JavaScript i pomaga lepiej zarządzać bazą kodu .
ale nowoczesne przeglądarki obsługują też kilka innych sposobów optymalnych jak
async
idefer
do ładowania zewnętrznychjavascript
plików.Asynchronizacja i odraczanie
Zwykle wykonywanie strony HTML rozpoczyna się linia po linii. Po napotkaniu zewnętrznego elementu JavaScript, parsowanie HTML jest zatrzymywane, dopóki JavaScript nie zostanie pobrany i gotowy do wykonania. To normalne wykonanie strony można zmienić za pomocą
defer
iasync
atrybutu.Defer
Gdy używany jest atrybut odroczenia, JavaScript jest pobierany równolegle z analizą HTML, ale zostanie wykonany dopiero po zakończeniu pełnej analizy HTML.
Async
Gdy używany jest atrybut asynchroniczny, JavaScript jest pobierany, gdy tylko skrypt zostanie napotkany, a po pobraniu zostanie wykonany asynchronicznie (równolegle) wraz z analizą HTML.
Kiedy stosować które atrybuty
async
.async
, oba będą działaćrównolegle wraz z analizą HTML, gdy tylko zostaną pobrane
i będą dostępne.
defer
obu:defer
, skrypt 1 ma zagwarantowane wykonanie w pierwszej kolejności,async
użyj skryptu bez atrybutów i umieść go ponad wszystkimiasync
skryptami.referencja: Knowledgehills.com
źródło
Zależy, jeśli ładujesz skrypt, który jest niezbędny do stylizacji strony / używasz akcji na stronie (jak kliknięcie przycisku), lepiej umieść go na górze. Jeśli Twoja stylizacja jest w 100% CSS i masz wszystkie opcje zastępcze dla akcji przycisków, możesz umieścić ją na dole.
Lub najlepszą rzeczą (jeśli to nie dotyczy) jest to, że możesz zrobić modalne pole ładowania, umieścić javascript na dole strony i sprawić, aby zniknął, gdy ładuje się ostatni wiersz skryptu. W ten sposób można uniknąć używania przez użytkowników akcji na stronie przed załadowaniem skryptów. A także unikaj niewłaściwej stylizacji.
źródło
Dołączanie skryptów na końcu jest używane głównie tam, gdzie najpierw ma zostać wyświetlona treść / style witryny.
Umieszczenie skryptów w głowie ładuje skrypty wcześnie i można z nich korzystać przed załadowaniem całej witryny.
jeśli skrypty zostaną wprowadzone w końcu, sprawdzanie poprawności nastąpi dopiero po załadowaniu całego stylu i projektu, co nie jest doceniane w przypadku szybko reagujących stron internetowych.
źródło
W zależności od skryptu i jego użycia najlepszym możliwym (pod względem obciążenia strony i czasu renderowania) może nie być użycie zwykłego znacznika <script> jako takiego, ale dynamiczne wyzwalanie ładowania skryptu asynchronicznie.
Istnieje kilka różnych technik, ale najprostszym z nich jest użycie document.createElement („skrypt”) po uruchomieniu zdarzenia window.onload. Następnie skrypt jest ładowany jako pierwszy, gdy sama strona została zrenderowana, co nie wpływa na czas oczekiwania użytkownika na wyświetlenie strony.
To oczywiście wymaga, aby sam skrypt nie był potrzebny do renderowania strony.
Więcej informacji można znaleźć w poście Skrypty asynchroniczne Steve'a Soudersa (twórcy YSlow, ale teraz w Google).
źródło
Jeśli nadal dbasz o wsparcie i wydajność w IE <10, najlepiej ZAWSZE spraw, aby tagi skryptów były ostatnimi tagami treści HTML. W ten sposób masz pewność, że reszta DOM została załadowana i nie będziesz blokować i renderować.
Jeśli nie przejmujesz się zbytnio IE <10, możesz umieścić swoje skrypty w nagłówku dokumentu i użyć
defer
ich, aby działały dopiero po załadowaniu DOM (<script type="text/javascript" src="path/to/script1.js" defer></script>
). Jeśli nadal chcesz, aby Twój kod działał w IE <10, nie zapomnij jednak owinąć koduwindow.onload
nawet parzystym!źródło
Skrypty blokują ładowanie DOM, dopóki nie zostanie załadowane i wykonane.
Jeśli umieścisz skrypty na końcu
<body>
całego DOM, ma szansę załadować i wyrenderować (strona „wyświetli” się szybciej).<script>
będzie miał dostęp do wszystkich tych elementów DOM.Z drugiej strony umieszczenie go po
<body>
starcie lub powyżej spowoduje wykonanie skryptu (gdzie nadal nie ma elementów DOM).Dołączasz jQuery, co oznacza, że możesz go umieścić gdziekolwiek zechcesz i użyj .ready ()
źródło
Myślę, że to zależy od wykonania strony. Jeśli strona, którą chcesz wyświetlić, nie może zostać poprawnie wyświetlona bez uprzedniego załadowania JavaScript, najpierw musisz dołączyć plik JavaScript. Ale jeśli możesz wyświetlić / wyrenderować stronę internetową bez początkowego pobrania pliku JavaScript, powinieneś umieścić kod JavaScript na dole strony. Ponieważ będzie emulować szybkie ładowanie strony, a z punktu widzenia użytkownika wygląda na to, że strona ładuje się szybciej.
źródło
Możesz umieścić większość
<script>
odniesień na końcu<body>
,ale jeśli na twojej stronie znajdują się aktywne komponenty, które używają zewnętrznych skryptów,
to ich zależność (pliki js) powinna być wcześniejsza (najlepiej w tagu head).
źródło
Przed końcem tagu body w celu zapobiegania i blokowania interfejsu użytkownika.
źródło
Na końcu dokumentu HTML
Aby nie wpłynęło to na ładowanie dokumentu HTML w przeglądarce podczas wykonywania.
źródło
Najlepszym miejscem do napisania
JavaScript
kodu jest koniec dokumentu za</body>
znacznikiem lub bezpośrednio przed nim, aby najpierw załadować dokument, a następnie wykonać kod js.A jeśli napiszesz, w
JQuery
dokumencie głównym może znajdować się następujący tekst, który zostanie wykonany po załadowaniu dokumentu:źródło
SyntaxError
Bardziej sensowne jest dla mnie dołączenie skryptu po kodzie HTML. Ponieważ przez większość czasu potrzebuję Dom do załadowania przed wykonaniem skryptu. Mógłbym umieścić go w tagu head, ale nie podoba mi się cały moduł nasłuchujący ładowania dokumentu. Chcę, aby mój kod był krótki, słodki i łatwy do odczytania.
Słyszałem, że stare wersje safari były dziwne, gdy dodawałeś skrypt poza tag tagu head, ale mówię, kogo to obchodzi. Nie znam nikogo, kto używa tego starego badziewia, prawda?
Przy okazji, dobre pytanie.
źródło
Możesz umieścić tam, gdzie chcesz skrypty, a jeden nie jest lepszy od innej praktyki.
sytuacja wygląda następująco:
Strona ładuje się liniowo, „z góry na dół”, więc jeśli umieścisz skrypt w nagłówku, upewni się, że zacznie się ładować przed wszystkim, teraz, jeśli umieścisz go w treści zmieszanej z kodem, może to spowodować nieładne ładowanie strony.
określenie dobrej praktyki nie zależy od tego, gdzie.
aby cię wesprzeć, wspomnę o następujących rzeczach:
możesz umieścić:
a strona załaduje się liniowo
strona jest ładowana asynchronicznie z inną zawartością
zawartość strony zostanie załadowana przed i po zakończeniu ładowania skrypty są ładowane
Dobrą praktyką byłoby, kiedy wdroży każdą z nich?
Mam nadzieję, że byłem pomocny, cokolwiek, tylko odpowiedz mi na ten problem.
źródło