Chciałbym wiedzieć, kiedy powinienem dołączyć zewnętrzne skrypty lub napisać je w kodzie html, jeśli chodzi o wydajność i łatwość obsługi.
Jaka jest ogólna praktyka w tym zakresie?
Scenariusz w świecie rzeczywistym - mam kilka stron html, które wymagają weryfikacji formularza po stronie klienta. W tym celu używam wtyczki jQuery, którą umieszczam na wszystkich tych stronach. Ale pytanie brzmi, czy ja:
- napisać fragmenty kodu, które konfigurują ten skrypt w tekście?
- zawrzeć wszystkie bity w jednym pliku, który jest wspólny dla wszystkich tych stron HTML?
- umieścić każdy bit w osobnym pliku zewnętrznym, po jednym dla każdej strony html?
Dzięki.
źródło
Łatwość utrzymania jest zdecydowanie powodem, aby trzymać je na zewnątrz, ale jeśli konfiguracja jest jednowierszowa (lub ogólnie krótsza niż obciążenie HTTP, które można uzyskać za uczynienie tych plików zewnętrznymi), z punktu widzenia wydajności lepiej jest trzymać je w linii. Zawsze pamiętaj, że każde żądanie HTTP generuje pewne obciążenie w zakresie czasu wykonania i ruchu.
Oczywiście to wszystko staje się nieistotne w momencie, gdy twój kod jest dłuższy niż kilka linii i nie jest tak naprawdę specyficzny dla jednej strony. W momencie, gdy chcesz móc ponownie użyć tego kodu, uczyń go zewnętrznym. Jeśli nie, spójrz na jego rozmiar i zdecyduj.
źródło
Eksternalizacja javascript jest jedną z reguł wydajności Yahoo: http://developer.yahoo.com/performance/rules.html#external
Chociaż twarda i szybka reguła, że zawsze powinieneś udostępniać skrypty na zewnątrz, będzie ogólnie dobrym rozwiązaniem, w niektórych przypadkach możesz chcieć dodać niektóre skrypty i style. Powinieneś jednak wbudować tylko te rzeczy, o których wiesz, że poprawią wydajność (ponieważ to zmierzyłeś).
źródło
Jeśli zależy Ci tylko na wydajności, większość porad w tym wątku jest błędna i staje się coraz bardziej błędna w erze SPA, gdzie możemy założyć, że strona bez kodu JS jest bezużyteczna. Spędziłem niezliczone godziny optymalizując czasy ładowania strony SPA i weryfikując te wyniki w różnych przeglądarkach. Ogólnie wzrost wydajności poprzez zmianę orkiestracji kodu HTML może być dość dramatyczny.
Aby uzyskać najlepszą wydajność, musisz myśleć o stronach jak o dwuetapowych rakietach. Te dwa etapy z grubsza odpowiadają fazom
<head>
i<body>
, ale myśl o nich jako o<static>
i<dynamic>
. Część statyczna jest w zasadzie stałą struną, którą wpychasz w dół rury odpowiedzi tak szybko, jak to tylko możliwe. Może to być trochę trudne, jeśli używasz wielu programów pośredniczących, które ustawiają pliki cookie (należy je ustawić przed wysłaniem zawartości http), ale w zasadzie jest to po prostu opróżnienie buforu odpowiedzi, miejmy nadzieję, że przed wskoczeniem do jakiegoś kodu szablonu (brzytwa, php, etc) na serwerze. Może się to wydawać trudne, ale po prostu wyjaśniam to źle, ponieważ jest prawie trywialne. Jak można się domyślić, ta statyczna część powinna zawierać wszystkie elementy javascript wbudowane i zminimalizowane. Wyglądałoby to jakośPonieważ wysłanie tej części przez kabel nic Cię nie kosztuje, możesz spodziewać się, że klient zacznie to odbierać gdzieś około 5 ms + opóźnienie po połączeniu z serwerem. Zakładając, że serwer jest dość blisko, opóźnienie może wynosić od 20 ms do 60 ms. Przeglądarki zaczną przetwarzać tę sekcję, gdy tylko ją otrzymają, a czas przetwarzania zwykle zdominuje czas przesyłania 20-krotnie lub więcej, co jest teraz zamortyzowanym oknem na przetwarzanie części po stronie serwera
<dynamic>
.Przetwarzanie inline jquery + signalr + angular + ng animate + ng touch + ng Routes + lodash zajmuje około 50 ms (chrome, reszta może być o 20% wolniejsza). To niesamowite samo w sobie. Większość aplikacji internetowych ma mniej kodu niż wszystkie te popularne biblioteki razem wzięte, ale powiedzmy, że masz tyle samo, więc wygralibyśmy opóźnienie + 100 ms przetwarzania na kliencie (ta wygrana pochodzi z drugiej części transferu). Zanim nadejdzie druga porcja, przetworzyliśmy cały kod js i szablony i możemy rozpocząć wykonywanie transformacji dom.
Możesz sprzeciwić się temu, że ta metoda jest ortogonalna w stosunku do koncepcji wstawiania, ale tak nie jest. Jeśli zamiast wstawiać link do cdns lub własnych serwerów, przeglądarka musiałaby otworzyć inne połączenie (a) i opóźnić wykonanie. Ponieważ to wykonanie jest w zasadzie bezpłatne (ponieważ serwer rozmawia z bazą danych), musi być jasne, że wszystkie te skoki będą kosztować więcej niż ich całkowity brak. Gdyby istniało dziwactwo przeglądarki, które mówi, że zewnętrzny js wykonuje się szybciej, moglibyśmy zmierzyć, który czynnik dominuje. Moje pomiary wskazują, że dodatkowe żądania obniżają wydajność na tym etapie.
Dużo pracuję nad optymalizacją aplikacji SPA. Ludzie często myślą, że ilość danych to wielka sprawa, podczas gdy w rzeczywistości często dominują opóźnienia i wykonanie. Zminifikowane biblioteki, które wymieniłem, dodają do 300 kb danych, a to tylko 68 kb zgzip lub 200 ms do pobrania na telefonie 2 mbit 3g / 4g, co jest dokładnie takim opóźnieniem, jakie zajęłoby ten sam telefon, aby sprawdzić, czy ma te same dane w swojej pamięci podręcznej, nawet jeśli był buforowany przez proxy, ponieważ podatek od opóźnienia telefonu komórkowego (opóźnienie telefonu do wieży) nadal obowiązuje. Tymczasem połączenia z komputerami stacjonarnymi, które mają mniejsze opóźnienie pierwszego przeskoku, i tak zazwyczaj mają większą przepustowość.
Krótko mówiąc, teraz (2014) najlepiej jest wstawić wszystkie skrypty, style i szablony.
EDYCJA (MAJ 2016)
Ponieważ aplikacje JS stale się rozwijają, a niektóre z moich ładunków składają się teraz na ponad 3 megabajty zminimalizowanego kodu, staje się oczywiste, że przynajmniej popularne biblioteki nie powinny już być wbudowane.
źródło
Myślę, że specyficzny dla jednej strony, krótki przypadek skryptu jest (tylko) uzasadniony dla skryptu wbudowanego
źródło
W rzeczywistości istnieje całkiem solidna podstawa do używania wbudowanego javascript. Jeśli js jest wystarczająco mały (jednolinijkowy), wolę javascript w tekście z dwóch powodów:
jQuery
możesz użyć metodlive
lubdelegate
, aby to obejść, ale uważam, że jeśli js jest wystarczająco mały, lepiej jest po prostu wstawić go w tekście.źródło
Innym powodem, dla którego zawsze powinieneś używać zewnętrznych skryptów, jest łatwiejsze przejście do polityki bezpieczeństwa treści (CSP) . CSP domyślnie zabrania wszystkich skryptów wbudowanych, dzięki czemu Twoja witryna jest bardziej odporna na ataki XSS.
źródło
Spojrzałbym na wymagany kod i podzieliłbym go na tyle oddzielnych plików, ile potrzeba. Każdy plik js zawierałby tylko jeden „logiczny zestaw” funkcji itp. Np. jeden plik dla wszystkich funkcji związanych z logowaniem.
Następnie podczas tworzenia serwisu na każdej stronie HTML umieszczasz tylko te, które są potrzebne. Gdy zaczynasz korzystać ze swojej witryny, możesz ją zoptymalizować, łącząc każdy plik js potrzebny stronie w jeden plik.
źródło
Jedyną obroną, jaką mogę zaoferować dla wbudowanego javascipt, jest to, że używając silnie wpisanych widoków z .net MVC, możesz odwołać się do zmiennych c # w środku javascript, które uznałem za przydatne.
źródło
Trzy kwestie:
źródło
Skrypty zewnętrzne są również łatwiejsze do debugowania za pomocą Firebug. Lubię testować jednostkowo mój JavaScript i mieć to wszystko z zewnątrz. Nienawidzę widzieć JavaScript w kodzie PHP, a HTML wygląda to na wielki bałagan.
źródło
Jeśli chodzi o utrzymywanie JavaScript na zewnątrz:
ASP.NET 3.5SP1 niedawno wprowadził funkcję tworzenia zasobu skryptu złożonego (scalanie kilku plików js w jeden). Inną korzyścią jest to, że gdy włączona jest kompresja serwera WWW, pobieranie jednego nieco większego pliku będzie miało lepszy współczynnik kompresji niż wiele mniejszych plików (również mniej narzutu http, transferu w obie strony itp.). Wydaje mi się, że zapisuje to przy początkowym ładowaniu strony, a następnie uruchamia się buforowanie przeglądarki, jak wspomniano powyżej.
Pomijając ASP.NET, ten screencast wyjaśnia korzyści bardziej szczegółowo: http://www.asp.net/learn/3.5-SP1/video-296.aspx
źródło
Inną ukrytą zaletą zewnętrznych skryptów jest to, że można je łatwo uruchomić za pomocą narzędzia do sprawdzania składni, takiego jak jslint . To może uchronić Cię przed wieloma rozdzierającymi serce, trudnymi do znalezienia błędami IE6.
źródło
W twoim scenariuszu brzmi to tak, jakby pisanie zewnętrznych rzeczy w jednym pliku współdzielonym między stronami byłoby dla ciebie dobre. Zgadzam się ze wszystkim, co zostało powiedziane powyżej.
źródło
Podczas wczesnego tworzenia prototypów trzymaj kod w linii, aby uzyskać szybką iterację, ale upewnij się, że zanim dotrzesz do produkcji, wszystko będzie na zewnątrz.
Odważyłbym się nawet powiedzieć, że jeśli nie możesz umieścić całego kodu Javascript na zewnątrz, masz w rękach zły projekt i powinieneś refaktoryzować swoje dane i skrypty
źródło
Google uwzględnił czasy wczytywania w pomiarach rankingu stron, jeśli często korzystasz z inline, zajmie to więcej czasu, zanim pająki zaindeksują twoją stronę, może to wpłynąć na ranking strony, jeśli musisz uwzględnić dużo. w każdym razie różne strategie mogą mieć wpływ na Twój ranking.
źródło
Cóż, myślę, że podczas tworzenia witryn zawierających jedną stronę należy używać wbudowanych, ponieważ skrypty nie będą musiały być udostępniane na wielu stronach
źródło
Posiadanie wewnętrznych plusów JS: łatwiej jest zarządzać i debugować Możesz zobaczyć, co się dzieje
Wewnętrzne wady JS: ludzie mogą to zmienić, co naprawdę może cię denerwować.
zewnętrzne plusy JS: bez zmian możesz wyglądać bardziej profesjonalnie (a przynajmniej tak myślę)
zewnętrzne wady JS: trudniej zarządzać, trudno jest wiedzieć, co się dzieje.
źródło
Zawsze staraj się używać zewnętrznych js, ponieważ inline js jest zawsze trudny do utrzymania.
Co więcej, profesjonalnie wymagane jest używanie zewnętrznego js, ponieważ większość programistów zaleca używanie js na zewnątrz.
Sam używam zewnętrznego js.
źródło