Czy przeglądarki (IE i Firefox) analizują połączone pliki javascript za każdym razem, gdy strona jest odświeżana?
Mogą buforować pliki, więc domyślam się, że nie będą próbować ich pobierać za każdym razem, ale ponieważ każda strona jest zasadniczo osobna, spodziewam się, że usuną stary kod i go parsują.
Jest to nieefektywne, choć doskonale zrozumiałe, ale zastanawiam się, czy współczesne przeglądarki są wystarczająco sprytne, aby uniknąć kroku analizy w witrynach. Mam na myśli przypadki, w których witryna korzysta z biblioteki javascript, takiej jak ExtJS lub jQuery itp.
Odpowiedzi:
To są szczegóły, które udało mi się wykopać. Warto przede wszystkim zauważyć, że chociaż JavaScript jest zwykle uważany za interpretowany i uruchamiany na maszynie wirtualnej, tak naprawdę nie jest tak w przypadku współczesnych interpreterów, które mają tendencję do kompilowania źródła bezpośrednio w kodzie maszynowym (z wyjątkiem IE).
Chrome: silnik V8
V8 ma pamięć podręczną kompilacji. Przechowuje skompilowany JavaScript przy użyciu skrótu źródła dla maksymalnie 5 kolekcji śmieci. Oznacza to, że dwa identyczne fragmenty kodu źródłowego będą współdzielić wpis pamięci podręcznej w pamięci, niezależnie od tego, w jaki sposób zostały uwzględnione. Ta pamięć podręczna nie jest czyszczona po ponownym załadowaniu stron.
Źródło
Aktualizacja - 19.03.2015
Zespół Chrome opublikował szczegółowe informacje na temat swoich nowych technik przesyłania strumieniowego JavaScript i buforowania .
Opera: Carakan Engine
Dlatego JavaScript jest buforowany podczas przeładowywania stron, dwa żądania do tego samego skryptu nie spowodują ponownej kompilacji.
Źródło
Firefox: silnik SpiderMonkey
SpiderMonkey używa
Nanojit
jako natywnego zaplecza kompilatora JIT. Proces kompilacji kodu maszynowego można zobaczyć tutaj . Krótko mówiąc, wydaje się , że rekompilują skrypty podczas ich ładowania. Jeśli jednak przyjrzymy się bliżej elementom wewnętrznymNanojit
, zobaczymy, że monitor wyższego poziomujstracer
, który służy do śledzenia kompilacji, może przechodzić przez trzy etapy podczas kompilacji, zapewniając korzyściNanojit
:Oznacza to, że dla
hot
fragmentów kodu kod macierzysty jest buforowany. Oznacza to, że nie trzeba go ponownie kompilować. Nie jest wyjaśnione, czy te zaszyfrowane sekcje natywne są zachowywane między odświeżeniami strony. Ale przypuszczam, że są. Jeśli ktoś może znaleźć na to dowody potwierdzające, to doskonale.EDYCJA : Wskazano, że twórca Mozilli Boris Zbarsky stwierdził, że Gecko nie buforuje jeszcze skompilowanych skryptów . Zaczerpnięte z tej SO odpowiedzi .
Safari: JavaScriptCore / SquirelFish Engine
Myślę, że najlepsza odpowiedź na to wdrożenie została już udzielona przez kogoś innego .
Napisał to Maciej Stachowiak , główny programista Safari. Myślę więc, że możemy uznać to za prawdę.
Nie udało mi się znaleźć żadnych innych informacji, ale możesz przeczytać więcej na temat poprawy prędkości najnowszego
SquirrelFish Extreme
silnika tutaj lub przejrzeć kod źródłowy , jeśli czujesz się odważny.IE: Silnik czakry
Nie ma aktualnych informacji na temat silnika JavaScript IE9 (czakry) w tym polu. Jeśli ktoś coś wie, prosimy o komentarz.
Jest to dość nieoficjalne, ale w przypadku starszych implementacji silnika IE Eric Lippert ( programista MS JScript ) stwierdza w odpowiedzi na blogu , że:
Sugeruje to, że kod bajtowy nie utrzymuje się w żaden sposób, a zatem kod bajtowy nie jest buforowany.
źródło
Opera to robi, jak wspomniano w drugiej odpowiedzi. ( źródło )
Firefox (silnik SpiderMonkey) nie buforuje kodu bajtowego. ( źródło )
WebKit (Safari, Konqueror) nie buforuje kodu bajtowego. ( źródło )
Nie jestem pewien co do IE [6/7/8] lub V8 (Chrome), myślę, że IE może wykonać jakieś buforowanie, podczas gdy V8 może nie. IE jest zamkniętym źródłem, więc nie jestem pewien, ale w V8 buforowanie „skompilowanego” kodu może nie mieć sensu, ponieważ kompilują się bezpośrednio do kodu maszynowego.
źródło
O ile mi wiadomo, tylko Opera buforuje przeanalizowany JavaScript. Zobacz sekcję „Skompilowane programy w pamięci podręcznej” tutaj .
źródło
Nie ma znaczenia, że Google Dart wyraźnie rozwiązuje ten problem za pomocą „migawek” - celem jest przyspieszenie inicjalizacji i czasu ładowania poprzez załadowanie przygotowanej wersji kodu.
InfoQ ma dobry opis @ http://www.infoq.com/articles/google-dart
źródło
Myślę, że poprawna odpowiedź brzmiałaby „nie zawsze”. Z tego, co rozumiem, zarówno przeglądarka, jak i serwer odgrywają rolę w określaniu, co zostanie buforowane. Jeśli naprawdę potrzebujesz przeładowywać pliki za każdym razem, myślę, że powinieneś być w stanie skonfigurować to z poziomu Apache (na przykład). Oczywiście przypuszczam, że przeglądarkę użytkownika można skonfigurować tak, aby ignorowała to ustawienie, ale jest to prawdopodobnie mało prawdopodobne.
Więc wyobrażam sobie, że w większości praktycznych przypadków same pliki javascript są buforowane, ale są dynamicznie ponownie interpretowane przy każdym ładowaniu strony.
źródło
Przeglądarka zdecydowanie korzysta z buforowania, ale tak, przeglądarki analizują JavaScript za każdym razem, gdy strona jest odświeżana. Ponieważ za każdym razem, gdy strona jest ładowana przez przeglądarkę, tworzy 2 drzewa 1. Drzewo zawartości i 2. drzewo wyrenderowania.
To drzewo renderowania składa się z informacji o układzie wizualnym elementów dom. Tak więc za każdym razem, gdy strona się ładuje, javascript jest analizowany, a wszelkie dynamiczne zmiany w javascript będą podobały się pozycjonowaniu elementu dom, show / hide element, add / remove element spowoduje, że przeglądarka odtworzy drzewo renderowania. Ale współczesne przeglądarki, takie jak FF i chrome, traktują to nieco inaczej, mają koncepcję przyrostowego renderowania, więc za każdym razem, gdy pojawiają się dynamiczne zmiany w js, jak wspomniano powyżej, spowoduje to tylko renderowanie i ponowne malowanie tych elementów.
źródło