Saya punya beberapa pertanyaan tentang atribut async
& defer
untuk <script>
tag yang menurut saya hanya berfungsi di browser HTML5.
Salah satu situs saya memiliki dua file JavaScript eksternal yang saat ini berada tepat di atas </body>
tag; yang pertama adalahjquery bersumber dari google dan yang kedua adalah skrip eksternal lokal.
Sehubungan dengan kecepatan memuat situs
Apakah ada keuntungan dalam menambahkan
async
ke dua skrip yang saya miliki di bagian bawah halaman?Apakah akan ada keuntungan dalam menambahkan
async
opsi ke dua skrip dan meletakkannya di bagian atas halaman di<head>
?- Apakah ini berarti mereka mengunduh ketika halaman dimuat?
- Saya berasumsi ini akan menyebabkan penundaan untuk browser HTML4, tetapi apakah ini mempercepat pemuatan halaman untuk browser HTML5?
Menggunakan <script defer src=...
- Akankah memuat dua skrip di dalam
<head>
dengan atributdefer
yang sama mempengaruhi seperti memiliki skrip sebelumnya</body>
? - Sekali lagi saya menganggap ini akan memperlambat browser HTML4.
Menggunakan <script async src=...
Jika saya memiliki dua skrip dengan async
diaktifkan
- Apakah mereka akan mengunduh secara bersamaan?
- Atau satu per satu dengan sisa halaman?
- Apakah urutan skrip kemudian menjadi masalah? Misalnya satu skrip tergantung pada skrip lain sehingga jika salah satu mengunduh lebih cepat, skrip kedua mungkin tidak dijalankan dengan benar, dll.
Akhirnya apakah saya lebih baik meninggalkan hal-hal sebagaimana adanya sampai HTML5 lebih umum digunakan?
javascript
html
Adam
sumber
sumber
async
baru (ish), tetapidefer
telah menjadi bagian dari IE sejak IE4.defer
telah ditambahkan ke browser lain jauh lebih baru, tetapi versi yang lebih lama dari browser tersebut cenderung kurang banyak berkeliaran.defer
sama dengan menempatkan skrip di bagian bawah HTML, yang sudah umum selama bertahun-tahun.Jawaban:
Simpan skrip Anda tepat sebelumnya
</body>
. Async dapat digunakan dengan skrip yang berlokasi di sana dalam beberapa keadaan (lihat diskusi di bawah). Tunda tidak akan membuat banyak perbedaan untuk skrip yang terletak di sana karena pekerjaan parsing DOM sudah cukup banyak dilakukan.Berikut adalah artikel yang menjelaskan perbedaan antara async dan defer: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ .
HTML Anda akan ditampilkan lebih cepat di peramban yang lebih lama jika Anda menyimpan skrip di ujung badan tepat sebelumnya
</body>
. Jadi, untuk menjaga kecepatan muat di browser lama, Anda tidak ingin meletakkannya di tempat lain.Jika skrip kedua Anda bergantung pada skrip pertama (mis. Skrip kedua Anda menggunakan jQuery yang dimuat dalam skrip pertama), maka Anda tidak dapat membuatnya async tanpa kode tambahan untuk mengontrol urutan eksekusi, tetapi Anda dapat membuatnya menunda karena skrip penundaan akan masih dieksekusi dalam urutan, tidak sampai dokumen diurai. Jika Anda memiliki kode itu dan Anda tidak perlu menjalankan skrip segera, Anda dapat membuatnya async atau menunda.
Anda dapat memasukkan skrip ke dalam
<head>
tag dan mengaturnyadefer
dan memuat skrip akan ditangguhkan sampai DOM telah diuraikan dan itu akan mendapatkan tampilan halaman cepat di browser baru yang mendukung penundaan, tetapi itu tidak akan membantu Anda sama sekali di browser yang lebih lama dan itu tidak benar-benar lebih cepat daripada hanya menempatkan skrip tepat sebelum</body>
yang bekerja di semua browser. Jadi, Anda bisa melihat mengapa lebih baik meletakkannya sebelumnya</body>
.Async lebih berguna ketika Anda benar-benar tidak peduli ketika skrip dimuat dan tidak ada yang tergantung pada pengguna tergantung pada pemuatan skrip itu. Contoh yang paling sering dikutip untuk menggunakan async adalah skrip analitik seperti Google Analytics yang tidak Anda inginkan menunggu dan itu tidak mendesak untuk segera dijalankan dan itu berdiri sendiri sehingga tidak ada yang bergantung padanya.
Biasanya pustaka jQuery bukan kandidat yang baik untuk async karena skrip lain bergantung padanya dan Anda ingin menginstal event handler sehingga halaman Anda dapat mulai merespons acara pengguna dan Anda mungkin perlu menjalankan beberapa kode inisialisasi berbasis jQuery untuk menetapkan status awal halaman. Ini dapat digunakan async, tetapi skrip lain harus dikodekan untuk tidak mengeksekusi sampai jQuery dimuat.
sumber
head
dan mengaturnyadefer
tidak akan lebih cepat daripada menempatkannya sebelumnya</body>
, tetapi dari apa yang saya baca itu salah. Pikirkan tentang hal ini - jika Anda memasukkan skrip ke dalamnya<head>
, maka skrip tersebut akan segera mulai diunduh, sedangkan jika skrip itu benar sebelumnya,</body>
maka semua elemen lainnya akan diunduh terlebih dahulu.Gambar ini menjelaskan tag skrip normal, async, dan penundaan
Skrip async dieksekusi segera setelah skrip dimuat, jadi skrip tersebut tidak menjamin urutan eksekusi (skrip yang Anda sertakan di bagian akhir dapat dieksekusi sebelum file skrip pertama)
Skrip penangguhan menjamin urutan eksekusi di mana mereka muncul di halaman.
Ref tautan ini: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
sumber
async
akan menang. Lihat stackoverflow.com/questions/13821151/…<script>
tag, total panjang halaman memuat lebih lama dari waktu yang dibutuhkan untuk mengunduh file skrip.HTML5:
async
,defer
Di HTML5, Anda bisa memberi tahu browser kapan harus menjalankan kode JavaScript. Ada 3 kemungkinan:
Tanpa
async
ataudefer
, browser akan segera menjalankan skrip Anda, sebelum merender elemen yang ada di bawah tag skrip Anda.Dengan
async
(asinkron), browser akan terus memuat halaman HTML dan merendernya saat browser memuat dan menjalankan skrip pada saat yang sama.Dengan
defer
, browser akan menjalankan skrip Anda ketika halaman selesai parsing. (tidak perlu selesai mengunduh semua file gambar. Ini bagus.)sumber
async=""
sebelum akan memvalidasi dan menyimpan perubahan templat.async
- Skrip dieksekusi saat mereka telah diunduh, tanpa mempertimbangkan urutannya dalam file HTML.Keduanya
async
dandefer
skrip mulai mengunduh segera tanpa menjeda pengurai dan keduanya mendukungonload
penangan opsional untuk mengatasi kebutuhan umum untuk melakukan inisialisasi yang tergantung pada skrip.Perbedaan antara
async
dandefer
berpusat di sekitar saat skrip dieksekusi. Setiapasync
skrip dieksekusi pada kesempatan pertama setelah selesai mengunduh dan sebelum acara pemuatan jendela. Ini berarti ada kemungkinan (dan kemungkinan) bahwaasync
skrip tidak dieksekusi dalam urutan di mana mereka muncul di halaman. Sedangkandefer
script, di sisi lain, dijamin akan dieksekusi dalam urutan yang terjadi di halaman. Eksekusi itu dimulai setelah penguraian selesai, tetapi sebelum acara dokumenDOMContentLoaded
.Sumber & perincian lebih lanjut: di sini .
sumber
Menghadapi masalah yang sama dan sekarang jelas mengerti bagaimana keduanya akan bekerja. Semoga tautan referensi ini akan membantu ...
Async
Saat Anda menambahkan atribut async ke tag skrip Anda, hal berikut akan terjadi.
Menunda
Defer sangat mirip dengan async dengan satu perbedaan besar. Inilah yang terjadi ketika browser menemukan skrip dengan atribut penangguhan.
Referensi: Perbedaan antara Async dan Defer
sumber
async
dandefer
akan mengunduh file selama parsing HTML. Keduanya tidak akan mengganggu pengurai.Script dengan
async
atribut akan dieksekusi setelah diunduh. Sedangkan script dengandefer
atribut akan dieksekusi setelah menyelesaikan parsing DOM.Skrip yang dimuat dengan
async
tidak menjamin pesanan apa pun. Sementara skrip yang dimuat dengandefer
atribut mempertahankan urutan di mana mereka muncul di DOM.Gunakan
<script async>
saat skrip tidak bergantung pada apa pun. ketika skrip tergantung penggunaan.Solusi terbaik adalah menambahkan bagian bawah tubuh. Tidak akan ada masalah dengan pemblokiran atau rendering.
sumber
Saya pikir Jake Archibald memberi kami beberapa wawasan pada tahun 2013 yang mungkin menambah lebih positif pada topik:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Namun, ini mungkin bukan cara tercepat untuk memuat skrip:
sumber
Tampaknya perilaku defer dan async bergantung pada browser, setidaknya pada fase eksekusi. CATATAN, penundaan hanya berlaku untuk skrip eksternal. Saya berasumsi async mengikuti pola yang sama.
Di IE 11 dan di bawah, urutannya tampak seperti ini:
Di Edge, Webkit, dll, atribut async tampaknya diabaikan atau ditempatkan di akhir:
Di browser yang lebih baru, atribut data-pagespeed-no-defer berjalan sebelum skrip eksternal lainnya. Ini untuk skrip yang tidak bergantung pada DOM.
CATATAN: Gunakan tunda ketika Anda membutuhkan urutan eksekusi skrip eksternal Anda. Ini memberi tahu browser untuk menjalankan semua skrip yang ditangguhkan dengan urutan penempatan dalam file.
ASIDE: Ukuran javascripts eksternal memang penting saat memuat ... tetapi tidak berpengaruh pada urutan eksekusi.
Jika Anda khawatir tentang kinerja skrip Anda, Anda mungkin ingin mempertimbangkan minifikasi atau hanya memuatnya secara dinamis dengan XMLHttpRequest.
sumber
data-pagespeed-no-defer
adalah atribut yang digunakan oleh modul PageSpeed sisi server . The atribut dengan sendirinya tidak memiliki efek di browser apapun.data-pagespeed-no-defer