JavaScript yang tidak mengganggu: <script> di bagian atas atau bawah kode HTML?

90

Baru-baru ini saya membaca Manifesto Yahoo Praktik Terbaik untuk Mempercepat Situs Web Anda . Mereka merekomendasikan untuk meletakkan penyertaan JavaScript di bagian bawah kode HTML bila kita bisa.

Tapi di mana tepatnya dan kapan?

Haruskah kita meletakkannya sebelum menutup </html>atau sesudahnya? Dan yang terpenting, kapan kita masih harus meletakkannya di <head>bagian?

e-satis
sumber

Jawaban:

87

Ada dua kemungkinan untuk skrip yang benar-benar tidak mengganggu:

  • termasuk file skrip eksternal melalui tag skrip di bagian head
  • termasuk file skrip eksternal melalui tag skrip di bagian bawah badan (sebelum </body></html>)

Yang kedua bisa lebih cepat karena penelitian Yahoo asli menunjukkan beberapa browser mencoba memuat file skrip ketika mereka menekan tag skrip dan oleh karena itu tidak memuat sisa halaman sampai selesai. Namun, jika skrip Anda memiliki bagian 'siap' yang harus dijalankan segera setelah DOM siap, Anda mungkin perlu memilikinya di kepala. Masalah lainnya adalah tata letak - jika skrip Anda akan mengubah tata letak halaman yang Anda inginkan dimuat sedini mungkin sehingga halaman Anda tidak menghabiskan waktu lama untuk menggambar ulang sendiri di depan pengguna Anda.

Jika situs skrip eksternal berada di domain lain (seperti widget eksternal), sebaiknya letakkan di bagian bawah untuk menghindari penundaan pemuatan halaman.

Dan untuk masalah kinerja apa pun, lakukan tolok ukur Anda sendiri - apa yang mungkin benar pada saat studi selesai mungkin berubah dengan pengaturan lokal Anda sendiri atau perubahan di browser.

domgblackwell.dll
sumber
13
Mengenai naskah yang memiliki porsi 'siap'. Menempatkan skrip itu di bagian bawah tubuh menjamin DOM siap untuk dimanipulasi, jika Anda meletakkannya di kepala, Anda harus membungkusnya sehingga menunggu acara DOMReady (atau serupa)
Juan Mendes
4
@Juan Ya ya, tetapi dengan menempatkan skrip di bagian bawah, Anda menunda acara DOMReady dengan jumlah waktu yang diperlukan browser untuk mengurai dokumen dan memproses elemen kepala (200-500 md), sebelum meminta skrip itu . Terutama pada pemuatan halaman pertama (dengan asumsi itu dapat di-cache dari sana). Sedangkan jika diletakkan di kepala. Kemungkinan akan siap lebih cepat. Jadi dengan mengingat HTML5, jika skrip harus mengubah tata letak ketika DOM sudah siap, Anda sekarang lebih baik dengan skrip "asinkron" atau "tunda" di kepala.
hexalys
31

Tidak pernah semudah itu - Yahoo merekomendasikan untuk meletakkan skrip tepat sebelum </body>tag penutup , yang akan menciptakan ilusi bahwa halaman memuat lebih cepat pada cache kosong (karena skrip tidak akan memblokir pengunduhan sisa dokumen). Namun, jika Anda memiliki beberapa kode yang ingin Anda jalankan saat pemuatan halaman, itu hanya akan mulai dijalankan setelah seluruh halaman dimuat. Jika Anda meletakkan skrip di <head>tag, skrip tersebut akan mulai dijalankan sebelumnya - jadi pada cache yang diprioritaskan, halaman akan benar-benar tampak memuat lebih cepat.

Juga, hak istimewa untuk meletakkan skrip di bagian bawah halaman tidak selalu tersedia. Jika Anda perlu menyertakan skrip sebaris dalam tampilan Anda yang bergantung pada pustaka atau beberapa kode JavaScript lain yang dimuat sebelumnya, Anda harus memuat ketergantungan tersebut di <head>tag.

Semua rekomendasi Yahoo menarik tetapi tidak selalu dapat diterapkan dan harus dipertimbangkan berdasarkan kasus per kasus.

Eran Galperin
sumber
1
Jika Anda memiliki javscript yang tidak mengganggu, Anda tidak akan memiliki cuplikan sebaris, pertanyaan yang disebutkan secara khusus tidak mengganggu.
Juan Mendes
1
<script>tag sebaris tidak menyiratkan javascript yang mengganggu.
Eran Galperin
@ Eric Galperin: Apa gunanya menggunakan tag skrip sebaris yang tidak mengganggu?
Juan Mendes
4
@Juan obstrusive Javascript berarti UI rusak tanpanya, atau tertanam dalam markup. <script>tag terpisah dari markup dan dapat digunakan dengan kode yang meningkatkan antarmuka tetapi tidak diperlukan. Jadi tidak ada yang secara inheren menonjol tentang <script>tag sebaris .
Eran Galperin
4
1. Nama saya Eran bukan Eric, 2. Ketika Anda ingin mengirimkan data ke Javascript dari bahasa sisi server, dalam satu putaran jika item misalnya, Anda mungkin menggunakan <script>tag untuk menyandikan nilai-nilai itu ke dalam variabel javascript, untuk digunakan mungkin dengan pengeditan sebaris atau perilaku serupa lainnya.
Eran Galperin
22

Seperti yang dikatakan orang lain, letakkan sebelum tag html tubuh penutup .

Beberapa hari yang lalu kami menerima banyak panggilan dari klien yang mengeluh bahwa situs mereka sangat lambat. Kami mengunjungi mereka secara lokal dan menemukan bahwa mereka membutuhkan waktu 20-30 detik untuk memuat satu halaman. Berpikir itu adalah server yang berkinerja buruk, kami masuk - tetapi server web dan sql adalah ~ 0% aktivitas.

Setelah beberapa menit, kami menyadari situs eksternal tidak aktif, yang kami tautkan untuk tag pelacakan Javascript. Ini berarti browser menekan tag skrip di bagian kepala situs dan menunggu untuk mengunduh file skrip.

Jadi, setidaknya untuk skrip pihak ketiga / eksternal, saya sarankan untuk meletakkannya sebagai hal terakhir di halaman. Kemudian jika mereka tidak tersedia, browser setidaknya akan memuat halaman sampai saat itu - dan pengguna tidak akan menyadarinya.

Lazlow
sumber
10
Cerita keren bro :) Tapi serius, ini adalah argumen paling menarik yang pernah saya lihat untuk menempatkan tag skrip di bagian bawah halaman.
pengguna271608
16

Untuk meringkas, berdasarkan saran di atas:

  1. Untuk skrip eksternal (Google analytics, pelacak pemasaran pihak ketiga, dll.) Tempatkan mereka sebelum </body>tag.
  2. Untuk skrip yang memengaruhi tata letak halaman, tempatkan di head.
  3. Untuk skrip yang mengandalkan 'dom ready' (seperti jquery), pertimbangkan untuk menempatkan sebelumnya </body>kecuali Anda memiliki alasan edge-case untuk menempatkan skrip di head.
  4. Jika ada skrip sebaris dengan ketergantungan, tempatkan skrip yang diperlukan di kepala.
Luke W.
sumber
6

Jika Anda ingin mengutak-atik posisi skrip Anda, YSlow adalah alat yang hebat untuk memberi Anda rasa apakah itu akan meningkatkan atau merusak kinerja. Menempatkan javascript pada posisi dokumen tertentu dapat benar-benar mematikan waktu pemuatan halaman.

http://developer.yahoo.com/yslow/

skaffman
sumber
5

Tidak, seharusnya tidak setelah </html>karena itu tidak valid. Tempat terbaik untuk meletakkan skrip adalah tepat sebelum</body>

Ini pada dasarnya karena sebagian besar browser berhenti merender halaman saat mereka mengevaluasi skrip yang Anda berikan. Jadi tidak apa-apa untuk meletakkan kode non-pemblokiran di mana saja di halaman (saya terutama memikirkan hal-hal yang melampirkan fungsi ke onLoadacara, karena pengikatan acara sangat cepat sehingga efektif menjadi gratis). Pembunuh besar di sini adalah di awal halaman memasukkan beberapa skrip server iklan, yang dapat mencegah pemuatan halaman apa pun sebelum iklan diunduh sepenuhnya, membuat waktu muat halaman Anda menggelembung

Laurie Young
sumber
Anda tahu, jika Anda benar-benar peduli dengan kecepatan maka tidak akan ada </body> atau </html> - tag penutup untuk jenis elemen ini bersifat opsional. Letakkan <script> di bagian paling akhir, dan lupakan tentang menggunakan </body> dan </html> sekaligus.
Jim
9
Mudah-mudahan Jim sedang menyindir - bagaimanapun juga, jangan menuruti nasihatnya. XHTML yang dibentuk dengan baik membutuhkan tag penutup untuk setiap elemen, termasuk tag body dan html. Jika kode Anda bukan XML yang valid, Anda salah melakukannya.
matt lohkamp
6
Tidak, saya tidak sedang menyindir. Lihatlah pertanyaannya. Ini menentukan HTML, bukan XHTML. Benar bahwa XHTML yang valid memerlukan hal-hal ini, tetapi HTML yang valid tidak. Tidak ada yang salah dengan memilih HTML dan menghilangkan tag penutup untuk jenis elemen ini.
Jim
2

Jika Anda meletakkannya di bagian bawah, itu memuat yang terakhir, sehingga mempercepat kecepatan pengguna dapat melihat halaman. Itu harus sebelum final </html>meskipun jika tidak, itu tidak akan menjadi bagian dari DOM.

Jika kode diperlukan secara instan, maka taruh di kepala.

Yang terbaik adalah meletakkan hal-hal seperti widget blog di bagian bawah sehingga jika tidak dimuat, itu tidak mempengaruhi kegunaan halaman.

Bradshaw kaya
sumber