Saya telah melakukan beberapa proyek berbasis web, tetapi saya tidak terlalu memikirkan beban dan urutan eksekusi dari halaman web biasa. Tapi sekarang saya perlu tahu detailnya. Sulit untuk menemukan jawaban dari Google atau SO, jadi saya membuat pertanyaan ini.
Halaman contohnya seperti ini:
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="abc.js" type="text/javascript">
</script>
<link rel="stylesheets" type="text/css" href="abc.css"></link>
<style>h2{font-wight:bold;}</style>
<script>
$(document).ready(function(){
$("#img").attr("src", "kkk.png");
});
</script>
</head>
<body>
<img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
<script src="kkk.js" type="text/javascript"></script>
</body>
</html>
Jadi inilah pertanyaanku:
- Bagaimana cara memuat halaman ini?
- Apa urutan pemuatannya?
- Kapan kode JS dieksekusi? (inline dan eksternal)
- Kapan CSS dieksekusi (diterapkan)?
- Kapan $ (dokumen). Sudah dieksekusi?
- Akankah abc.jpg diunduh? Atau apakah itu hanya mengunduh kkk.png?
Saya memiliki pemahaman sebagai berikut:
- Browser memuat html (DOM) pada awalnya.
- Browser mulai memuat sumber daya eksternal dari atas ke bawah, baris demi baris.
- Jika a
<script>
terpenuhi, pemuatan akan diblokir dan menunggu sampai file JS dimuat dan dieksekusi dan kemudian melanjutkan. - Sumber daya lain (CSS / gambar) dimuat secara paralel dan dieksekusi jika diperlukan (seperti CSS).
Atau seperti ini:
Browser mem-parsing html (DOM) dan mendapatkan sumber daya eksternal dalam susunan atau susunan seperti susunan. Setelah html dimuat, browser mulai memuat sumber daya eksternal dalam struktur secara paralel dan mengeksekusi, sampai semua sumber daya dimuat. Maka DOM akan diubah sesuai dengan perilaku pengguna tergantung pada JS.
Adakah yang bisa memberikan penjelasan terperinci tentang apa yang terjadi ketika Anda mendapat respons dari halaman html? Apakah ini bervariasi di berbagai browser? Adakah referensi tentang pertanyaan ini?
Terima kasih.
EDIT:
Saya melakukan percobaan di Firefox dengan Firebug. Dan itu ditampilkan sebagai gambar berikut:
sumber
Jawaban:
Menurut sampel anda,
kira-kira alur eksekusi adalah sebagai berikut:
<script src="jquery.js" ...
jquery.js
diunduh dan diuraikan<script src="abc.js" ...
abc.js
diunduh, diuraikan dan dijalankan<link href="abc.css" ...
abc.css
diunduh dan diuraikan<style>...</style>
<script>...</script>
<img src="abc.jpg" ...
abc.jpg
diunduh dan ditampilkan<script src="kkk.js" ...
kkk.js
diunduh, diuraikan dan dijalankanPerhatikan bahwa unduhan mungkin tidak sinkron dan non-pemblokiran karena perilaku peramban. Misalnya, di Firefox ada pengaturan ini yang membatasi jumlah permintaan simultan per domain.
Juga tergantung pada apakah komponen telah di-cache atau tidak, komponen mungkin tidak diminta lagi dalam permintaan waktu dekat. Jika komponen telah di-cache, komponen akan dimuat dari cache alih-alih URL yang sebenarnya.
Ketika parsing berakhir dan dokumen siap dan dimuat, acara
onload
dipecat. Jadi ketikaonload
dipecat,$("#img").attr("src","kkk.png");
dijalankan. Begitu:$("#img").attr("src", "kkk.png");
kkk.png
diunduh dan dimuat ke#img
The
$(document).ready()
event sebenarnya acara dipecat ketika semua komponen halaman dimuat dan siap. Baca lebih lanjut tentang hal ini: http://docs.jquery.com/Tutorials:Introducing_$ (document) .ready ()Sunting - Bagian ini menguraikan lebih banyak pada bagian paralel atau tidak:
Secara default, dan dari pemahaman saya saat ini, browser biasanya menjalankan setiap halaman dengan 3 cara: HTML parser, Javascript / DOM, dan CSS.
Pengurai HTML bertanggung jawab untuk mem-parsing dan menafsirkan bahasa markup dan dengan demikian harus dapat membuat panggilan ke 2 komponen lainnya.
Misalnya ketika parser melewati garis ini:
Parser akan membuat 3 panggilan, dua ke Javascript dan satu ke CSS. Pertama, parser akan membuat elemen ini dan mendaftarkannya di ruang nama DOM, bersama dengan semua atribut yang terkait dengan elemen ini. Kedua, pengurai akan memanggil untuk mengikat acara onclick ke elemen khusus ini. Terakhir, itu akan membuat panggilan lain ke utas CSS untuk menerapkan gaya CSS ke elemen khusus ini.
Eksekusi top down dan single threaded Javascript mungkin terlihat multi-utas, tetapi faktanya Javascript adalah utas tunggal. Inilah sebabnya mengapa ketika memuat file javascript eksternal, penguraian halaman HTML utama ditangguhkan.
Namun, file CSS dapat diunduh secara bersamaan karena aturan CSS selalu diterapkan - artinya elemen mengatakan selalu dicat ulang dengan aturan CSS paling segar yang ditentukan - sehingga membuatnya tidak terhapus.
Sebuah elemen hanya akan tersedia di DOM setelah diurai. Dengan demikian ketika bekerja dengan elemen tertentu, skrip selalu ditempatkan setelah, atau dalam acara jendela yang memuat.
Script seperti ini akan menyebabkan kesalahan (pada jQuery):
Karena ketika skrip diuraikan,
#mydiv
elemen masih belum didefinisikan. Sebaliknya ini akan berhasil:ATAU
sumber
<script>
akan memblokir komponen lain, bukan? Adakah referensi tentang spesifikasi untuk setiap browser?1) HTML diunduh.
2) HTML diuraikan secara progresif. Ketika permintaan aset tercapai, browser akan mencoba mengunduh aset. Konfigurasi default untuk sebagian besar server HTTP dan sebagian besar browser adalah untuk memproses hanya dua permintaan secara paralel. IE dapat dikonfigurasi ulang untuk mengunduh aset dalam jumlah tak terbatas secara paralel. Steve Souders telah dapat mengunduh lebih dari 100 permintaan secara paralel di IE. Pengecualian adalah bahwa permintaan skrip memblokir permintaan aset paralel di IE. Inilah sebabnya mengapa sangat disarankan untuk meletakkan semua JavaScript dalam file JavaScript eksternal dan meletakkan permintaan sesaat sebelum tag penutup tubuh dalam HTML.
3) Setelah HTML diuraikan, DOM diberikan. CSS diberikan bersamaan dengan rendering DOM di hampir semua agen pengguna. Karenanya sangat disarankan untuk meletakkan semua kode CSS ke file CSS eksternal yang diminta setinggi mungkin di bagian <head> </head> dokumen. Kalau tidak, halaman diberikan hingga terjadinya posisi permintaan CSS di DOM dan kemudian rendering dimulai dari atas.
4) Hanya setelah DOM benar-benar diberikan dan permintaan untuk semua aset di halaman tersebut diselesaikan atau waktu habis apakah JavaScript mengeksekusi dari peristiwa onload. IE7, dan saya tidak yakin tentang IE8, tidak cepat habis aset jika respon HTTP tidak diterima dari permintaan aset. Ini berarti aset yang diminta oleh JavaScript sebaris ke halaman, yaitu JavaScript yang ditulis ke dalam tag HTML yang tidak terkandung dalam suatu fungsi, dapat mencegah pelaksanaan peristiwa yang dimuat selama berjam-jam. Masalah ini dapat dipicu jika kode inline tersebut ada di halaman dan gagal dieksekusi karena tabrakan namespace yang menyebabkan crash kode.
Dari langkah-langkah di atas, salah satu yang paling intensif CPU adalah penguraian DOM / CSS. Jika Anda ingin halaman Anda diproses lebih cepat maka tuliskan CSS yang efisien dengan menghilangkan instruksi yang berlebihan dan mengkonsolidasikan instruksi CSS ke dalam referensi elemen sesedikit mungkin. Mengurangi jumlah node di pohon DOM Anda juga akan menghasilkan rendering lebih cepat.
Ingatlah bahwa setiap aset yang Anda minta dari HTML atau bahkan dari aset CSS / JavaScript Anda diminta dengan tajuk HTTP terpisah. Ini menghabiskan bandwidth dan membutuhkan pemrosesan per permintaan. Jika Anda ingin memuat halaman Anda secepat mungkin, kurangi jumlah permintaan HTTP dan kurangi ukuran HTML Anda. Anda tidak melakukan bantuan pengguna Anda dengan rata-rata berat halaman 180k dari HTML saja. Banyak pengembang berlangganan kekeliruan bahwa pengguna mengambil keputusan tentang kualitas konten pada halaman dalam 6 nanodetik dan kemudian membersihkan kueri DNS dari servernya dan membakar komputernya jika tidak senang, jadi alih-alih mereka memberikan halaman yang paling indah di 250k HTML. Buat HTML Anda pendek dan manis sehingga pengguna dapat memuat halaman Anda lebih cepat.
sumber
Buka halaman Anda di Firefox dan dapatkan addon HTTPFox. Ini akan memberi tahu Anda semua yang Anda butuhkan.
Menemukan ini di archivist.incuito:
http://archivist.incutio.com/viewlist/css-discuss/76444
sumber
Jika Anda menanyakan hal ini karena Anda ingin mempercepat situs web Anda, periksa halaman Yahoo tentang Praktik Terbaik untuk Mempercepat Situs Web Anda . Ini memiliki banyak praktik terbaik untuk mempercepat situs web Anda.
sumber
AFAIK, browser (setidaknya Firefox) meminta setiap sumber daya segera setelah diuraikan. Jika menemukan tag img, ia akan meminta gambar itu segera setelah tag img diuraikan. Dan itu bisa jadi bahkan sebelum ia menerima totalitas dokumen HTML ... itu masih bisa mengunduh dokumen HTML ketika itu terjadi.
Untuk Firefox, ada antrean peramban yang berlaku, tergantung bagaimana pengaturannya di: config. Misalnya tidak akan mencoba mengunduh lebih dari 8 file sekaligus dari server yang sama ... permintaan tambahan akan diantrekan. Saya pikir ada batas per-domain, per batas proxy, dan hal-hal lain, yang didokumentasikan di situs web Mozilla dan dapat diatur di about: config. Saya membaca di suatu tempat bahwa IE tidak memiliki batasan seperti itu.
Acara siap jQuery dipecat segera setelah dokumen HTML utama diunduh dan DOM diuraikan. Kemudian acara pemuatan diaktifkan setelah semua sumber daya tertaut (CSS, gambar, dll.) Telah diunduh dan diuraikan juga. Itu dibuat jelas dalam dokumentasi jQuery.
Jika Anda ingin mengontrol urutan semua yang dimuat, saya percaya cara yang paling dapat diandalkan untuk melakukannya adalah melalui JavaScript.
sumber
Dynatrace AJAX Edition menunjukkan kepada Anda urutan pemuatan, parsing, dan eksekusi halaman yang tepat.
sumber
Jawaban yang dipilih sepertinya tidak berlaku untuk browser modern, setidaknya di Firefox 52. Yang saya amati adalah bahwa permintaan memuat sumber daya seperti css, javascript dikeluarkan sebelum parser HTML mencapai elemen, misalnya
Apa yang saya temukan bahwa waktu mulai permintaan untuk memuat sumber daya css dan javascript tidak diblokir. Sepertinya Firefox memiliki pemindaian HTML, dan mengidentifikasi sumber daya utama (sumber daya img tidak termasuk) sebelum mulai mem-parsing HTML.
sumber