Apakah browser (IE dan Firefox) mem-parsing file javascript yang ditautkan setiap kali halaman disegarkan?
Mereka dapat men-cache file, jadi saya kira mereka tidak akan mencoba mengunduhnya setiap kali, tetapi karena setiap halaman pada dasarnya terpisah, saya berharap mereka untuk merobohkan kode lama dan menguraikannya kembali.
Ini tidak efisien, meskipun sangat bisa dimengerti, tetapi saya bertanya-tanya apakah browser modern cukup pintar untuk menghindari langkah penguraian dalam situs. Saya memikirkan kasus di mana situs menggunakan perpustakaan javascript, seperti ExtJS atau jQuery, dll.
Jawaban:
Ini adalah detail yang bisa saya gali. Perlu dicatat terlebih dahulu bahwa meskipun JavaScript biasanya dianggap ditafsirkan dan dijalankan pada VM, ini tidak benar-benar terjadi dengan penerjemah modern, yang cenderung mengkompilasi sumber secara langsung ke dalam kode mesin (dengan pengecualian IE).
Chrome: Mesin V8
V8 memiliki cache kompilasi. Toko ini mengkompilasi JavaScript menggunakan hash sumber hingga 5 koleksi sampah. Ini berarti bahwa dua bagian kode sumber yang identik akan berbagi entri cache dalam memori terlepas dari bagaimana mereka dimasukkan. Cache ini tidak dihapus ketika halaman dimuat ulang.
Sumber
Pembaruan - 19/03/2015
Tim Chrome telah merilis detail tentang teknik baru mereka untuk streaming dan caching JavaScript .
Opera: Mesin Carakan
Oleh karena itu JavaScript di-cache di seluruh reload halaman, dua permintaan ke skrip yang sama tidak akan menghasilkan kompilasi ulang.
Sumber
Firefox: Mesin SpiderMonkey
SpiderMonkey menggunakan
Nanojit
sebagai back-end aslinya, kompiler JIT. Proses kompilasi kode mesin dapat dilihat di sini . Singkatnya, tampaknya mengkompilasi ulang skrip saat dimuat. Namun, jika kita melihat lebih dalam pada internalNanojit
kita melihat bahwa monitor tingkat yang lebih tinggijstracer
, yang digunakan untuk melacak kompilasi dapat transisi melalui tiga tahap selama kompilasi, memberikan manfaat untukNanojit
:Ini berarti bahwa untuk
hot
fragmen kode kode asli di-cache. Berarti tidak perlu dikompilasi ulang. Tidak diperjelas apakah bagian asli hash ini dipertahankan di antara refresh halaman. Tetapi saya akan berasumsi bahwa mereka memang demikian. Jika ada yang bisa menemukan bukti pendukung untuk ini, maka sangat bagus.EDIT : Sudah menunjukkan bahwa pengembang Mozilla Boris Zbarsky telah menyatakan bahwa Gecko tidak tembolok dikompilasi script belum . Diambil dari jawaban SO ini .
Safari: Mesin JavaScriptCore / SquirelFish
Saya pikir jawaban terbaik untuk implementasi ini sudah diberikan oleh orang lain .
Ini ditulis oleh Maciej Stachowiak , pengembang utama Safari. Jadi saya pikir kita bisa menganggap itu benar.
Saya tidak dapat menemukan informasi lain tetapi Anda dapat membaca lebih lanjut tentang peningkatan kecepatan
SquirrelFish Extreme
mesin terbaru di sini , atau menelusuri kode sumber di sini jika Anda merasa ingin bertualang.IE: Mesin Chakra
Tidak ada informasi terkini tentang JavaScript Engine (Chakra) IE9 di bidang ini. Jika ada yang tahu sesuatu, silakan komentar.
Ini cukup tidak resmi, tetapi untuk implementasi mesin IE yang lebih lama, Eric Lippert ( pengembang MS dari JScript ) menyatakan dalam sebuah balasan blog di sini bahwa:
Ini menunjukkan bahwa bytecode tidak bertahan dengan cara apa pun, dan dengan demikian bytecode tidak di-cache.
sumber
Opera melakukannya, seperti yang disebutkan dalam jawaban lain. ( sumber )
Firefox (mesin SpiderMonkey) tidak menyimpan bytecode cache. ( sumber )
WebKit (Safari, Konqueror) tidak tidak cache yang bytecode. ( sumber )
Saya tidak yakin tentang IE [6/7/8] atau V8 (Chrome), saya pikir IE mungkin melakukan semacam caching sementara V8 mungkin tidak. IE adalah sumber tertutup jadi saya tidak yakin, tetapi dalam V8 mungkin tidak masuk akal untuk men-cache kode "dikompilasi" karena mereka mengkompilasi langsung ke kode mesin.
sumber
Sejauh yang saya ketahui, hanya Opera yang meng-cache JavaScript yang diuraikan. Lihat bagian "Program terkompilasi dalam cache" di sini .
sumber
Tidak ada artinya Google Dart secara eksplisit menangani masalah ini melalui "Snapshots" - tujuannya adalah untuk mempercepat inisialisasi dan memuat waktu dengan memuat versi kode yang telah disiapkan.
InfoQ memiliki langgan yang baik @ http://www.infoq.com/articles/google-dart
sumber
Saya pikir jawaban yang benar adalah "tidak selalu." Dari apa yang saya mengerti, baik browser dan server berperan dalam menentukan apa yang di-cache. Jika Anda benar-benar membutuhkan file untuk dimuat ulang setiap kali, maka saya pikir Anda harus dapat mengonfigurasinya dari dalam Apache (misalnya). Tentu saja, saya kira browser pengguna dapat dikonfigurasikan untuk mengabaikan pengaturan itu, tapi itu mungkin tidak mungkin.
Jadi saya akan membayangkan bahwa dalam kebanyakan kasus praktis, file javascript itu sendiri di-cache, tetapi secara dinamis ditafsirkan kembali setiap kali halaman dimuat.
sumber
Browser pasti menggunakan caching tetapi ya, browser mem-parsing JavaScript setiap kali halaman di-refresh. Karena setiap kali halaman dimuat oleh browser, itu membuat 2 pohon 1.Content tree dan 2.render tree.
Pohon render ini terdiri dari informasi tentang tata letak visual elemen dom. Jadi, setiap kali halaman dibuka, javascript diuraikan dan setiap perubahan dinamis oleh javascript akan menyukai posisi elemen dom, tampilkan / sembunyikan elemen, tambahkan / hapus elemen akan menyebabkan browser membuat ulang pohon render. Tapi broswers modern seperti FF dan chrome menanganinya sedikit berbeda, mereka memiliki konsep render tambahan, sehingga setiap kali ada perubahan dinamis oleh js seperti yang disebutkan di atas, itu hanya akan menyebabkan elemen-elemen tersebut untuk membuat dan mengecat kembali.
sumber