Saat menyematkan JavaScript ke dokumen HTML, di mana tempat yang tepat untuk meletakkan <script>
tag dan memasukkan JavaScript? Saya sepertinya ingat bahwa Anda tidak seharusnya menempatkan ini di <head>
bagian, tetapi menempatkan di awal <body>
bagian itu buruk juga, karena JavaScript harus diuraikan sebelum halaman ditampilkan sepenuhnya (atau sesuatu seperti itu). Hal ini tampaknya meninggalkan akhir dari <body>
bagian sebagai tempat yang logis untuk <script>
tag.
Jadi, di mana adalah tempat yang tepat untuk menempatkan <script>
tag?
(Pertanyaan ini merujuk pada pertanyaan ini , di mana disarankan agar pemanggilan fungsi JavaScript harus dipindahkan dari <a>
tag ke <script>
tag. Saya secara khusus menggunakan jQuery, tetapi jawaban yang lebih umum juga sesuai.)
sumber
Jawaban:
Inilah yang terjadi ketika browser memuat situs web dengan
<script>
tag di atasnya:<script>
tag yang mereferensikan file skrip eksternal.Langkah # 4 menyebabkan pengalaman pengguna yang buruk. Situs web Anda pada dasarnya berhenti memuat hingga Anda mengunduh semua skrip. Jika ada satu hal yang dibenci pengguna sedang menunggu sebuah situs web dimuat.
Mengapa ini bahkan terjadi?
Setiap skrip dapat menyisipkan HTML sendiri melalui
document.write()
atau manipulasi DOM lainnya. Ini menyiratkan bahwa parser harus menunggu sampai skrip telah diunduh & dieksekusi sebelum dapat dengan aman menguraikan sisa dokumen. Lagipula, skrip bisa memasukkan HTML-nya sendiri ke dalam dokumen.Namun, sebagian besar pengembang JavaScript tidak lagi memanipulasi DOM saat dokumen dimuat. Sebagai gantinya, mereka menunggu hingga dokumen dimuat sebelum memodifikasinya. Sebagai contoh:
Javascript:
Karena browser Anda tidak tahu my-script.js tidak akan mengubah dokumen sampai dokumen tersebut diunduh & dieksekusi, parser berhenti mengurai.
Rekomendasi kuno
Pendekatan lama untuk memecahkan masalah ini adalah dengan meletakkan
<script>
tag di bagian bawah Anda<body>
, karena ini memastikan parser tidak diblokir sampai akhir.Pendekatan ini memiliki masalah sendiri: browser tidak dapat mulai mengunduh skrip hingga seluruh dokumen diuraikan. Untuk situs web yang lebih besar dengan skrip & stylesheet besar, dapat mengunduh skrip sesegera mungkin sangat penting untuk kinerja. Jika situs web Anda tidak dimuat dalam 2 detik, orang akan pergi ke situs web lain.
Dalam solusi optimal, browser akan mulai mengunduh skrip Anda sesegera mungkin, sementara pada saat yang sama mem-parsing sisa dokumen Anda.
Pendekatan modern
Hari ini, browser mendukung
async
dandefer
atribut pada skrip. Atribut ini memberi tahu browser bahwa aman untuk melanjutkan penguraian saat skrip sedang diunduh.async
Skrip dengan atribut async dijalankan secara tidak sinkron. Ini berarti skrip dieksekusi segera setelah diunduh, tanpa memblokir browser sementara itu.
Ini menyiratkan bahwa skrip 2 dapat diunduh & dieksekusi sebelum skrip 1.
Menurut http://caniuse.com/#feat=script-async , 97,78% dari semua browser mendukung ini.
menunda
Skrip dengan atribut defer dijalankan secara berurutan (yaitu skrip pertama 1, lalu skrip 2). Ini juga tidak memblokir browser.
Tidak seperti skrip async, skrip penangguhan hanya dieksekusi setelah seluruh dokumen dimuat.
Menurut http://caniuse.com/#feat=script-defer , 97,79% dari semua browser mendukung ini. 98,06% mendukungnya setidaknya sebagian.
Catatan penting tentang kompatibilitas browser: dalam beberapa keadaan IE <= 9 dapat mengeksekusi skrip yang ditangguhkan rusak. Jika Anda perlu mendukung browser tersebut, baca ini dulu!
Kesimpulan
Canggih saat ini adalah menempatkan skrip ke dalam
<head>
tag dan menggunakan atributasync
ataudefer
. Ini memungkinkan skrip Anda untuk diunduh secepatnya tanpa memblokir browser Anda.Hal yang baik adalah bahwa situs web Anda masih harus memuat dengan benar pada 2% browser yang tidak mendukung atribut ini sementara mempercepat 98% lainnya.
sumber
document.write
beroperasi pada dom. Pertanyaannya bukan apakah skrip memanipulasi dom, tetapi ketika itu terjadi. Selama semua manipulasi dom terjadi setelahdomready
peristiwa telah dipicu, Anda baik-baik saja. jQuery adalah perpustakaan, dan karena itu tidak - atau tidak seharusnya - memanipulasi dom dengan sendirinya.async
dandefer
tidak digunakan di mana pun? Maksud saya, saya melihat banyak sumber HTML dari internet, dan saya tidak melihatasync
dandefer
atribut di mana pun. ...?Tepat sebelum tag penutup, seperti yang dinyatakan pada
http://developer.yahoo.com/performance/rules.html#js_bottom
sumber
Tag skrip non-pemblokiran dapat ditempatkan di mana saja:
async
skrip akan dieksekusi secara tidak sinkron segera setelah tersediadefer
skrip dijalankan ketika dokumen telah selesai diuraikanasync defer
skrip kembali ke perilaku menunda jika async tidak didukungScript tersebut akan dijalankan secara tidak sinkron / setelah dokumen siap, yang berarti Anda tidak dapat melakukan ini:
Atau ini:
Atau ini:
Atau ini:
Karena itu, skrip asinkron menawarkan keuntungan ini:
Browser dapat mengunduh stylesheet, gambar, dan skrip lainnya secara paralel tanpa menunggu skrip diunduh dan dieksekusi.
Anda dapat menempatkan skrip di dalam kepala atau badan tanpa khawatir tentang pemblokiran (berguna jika Anda menggunakan CMS). Perintah eksekusi masih penting.
Dimungkinkan untuk menghindari masalah urutan eksekusi dengan menggunakan skrip eksternal yang mendukung panggilan balik. Banyak API JavaScript pihak ketiga sekarang mendukung eksekusi non-pemblokiran. Berikut adalah contoh memuat Google Maps API secara tidak sinkron .
sumber
<head>
termasuk logika.async
ataudefer
ketika termasuk jQuery seperti yang Anda tentukan di blok kedua Anda:<script src="jquery.js" async></script>
. Apakah Anda bisa menjelaskan alasannya? Saya pikir saya perlu memasukkan tag async untuk kinerja — sesuai jawaban yang diterima — agar halaman saya dapat memuat bahkan ketika jQuery masih memuat]. Terima kasih!<script src=jquery.js>
diikuti oleh$(function(){ ... })
blok di suatu tempat di halaman. Pemuatan asinkron tidak menjamin bahwa jQuery akan dimuat pada saat browser mencoba mem-parsing blok-blok itu maka itu akan menghasilkan $ tidak kesalahan yang didefinisikan (Anda mungkin tidak mendapatkan kesalahan jika jQuery diambil dari cache). Saya menjawab pertanyaan tentang memuat jQuery secara tidak sinkron dan menjaga$(function(){ ... })
. Saya akan melihat apakah saya dapat menemukannya, atau Anda dapat melihat pertanyaan ini: stackoverflow.com/q/14811471/87015jquery
lib untuk memuat, lalu.js
skrip saya yang tersisa . Ketika saya mendeklarasikanasync
ataudefer
padajquery
tag skrip lib,.js
skrip saya tidak berfungsi. Saya pikir$(function(){ ... })
dilindungi itu — kurasa tidak. Solusi saat ini: Saya tidak menambahkandefer
atauasync
padajquery
skrip lib, tetapi saya menambahkan skripasync
tindak lanjut saya.js
. Catatan: alasan saya melakukan semua ini adalah untuk membuat Google Page Speed senang. Sekali lagi terima kasih! Saran lain dipersilahkan. (Atau tautan ke jawaban Anda sebelumnya). :)Nasihat standar, dipromosikan oleh Yahoo! Tim Performance yang luar biasa, adalah untuk menempatkan
<script>
tag di bagian akhir dokumen sehingga mereka tidak memblokir rendering halaman.Tetapi ada beberapa pendekatan baru yang menawarkan kinerja yang lebih baik, seperti dijelaskan dalam jawaban ini tentang waktu buka file JavaScript Google Analytics:
sumber
Jika Anda menggunakan JQuery maka letakkan javascript di mana pun Anda menemukan yang terbaik dan gunakan
$(document).ready()
untuk memastikan bahwa semuanya dimuat dengan benar sebelum menjalankan fungsi apa pun.Di samping catatan: Saya suka semua tag skrip saya di
<head>
bagian karena itu tampaknya menjadi tempat terbersih.sumber
<header>
?$(document).ready()
tidak berarti Anda dapat menempatkan JavaScript di mana pun Anda suka - Anda masih harus meletakkannya setelah<script src=".../jquery.min.js">
tempat Anda memasukkan jQuery, sehingga$
ada.header
elemen adalah bagian dari konten dokumen HTML, dan harus muncul satu atau lebih kali dalam tag headbody
elemen. The
untuk meta-data dan data non-konten untuk dokumen. Saat ini, dengandefer
danasync
merupakan tempat yang ideal untuk tag skrip.header
elemen hanya boleh berisi informasi yang menjelaskan bagian dokumen yang mengikutinya.Pendekatan modern pada 2019 menggunakan skrip jenis modul ES6 .
Secara default, modul dimuat secara tidak sinkron dan tertunda. yaitu Anda dapat menempatkannya di mana saja dan mereka akan memuat secara paralel dan mengeksekusi ketika halaman selesai memuat.
Perbedaan antara skrip dan modul dijelaskan di sini:
https://stackoverflow.com/a/53821485/731548
Eksekusi modul dibandingkan dengan skrip dijelaskan di sini:
https://developers.google.com/web/fundamentals/primers/modules#defer
Dukungan ditunjukkan di sini:
https://caniuse.com/#feat=es6-module
sumber
XHTML Tidak Akan Memvalidasi jika skrip berada di mana saja selain dalam elemen kepala.Ternyata itu bisa dimana-mana.Anda dapat menunda eksekusi dengan sesuatu seperti jQuery sehingga tidak masalah di mana ia ditempatkan (kecuali untuk kinerja kecil yang hit selama parsing).
sumber
tag skrip harus selalu digunakan sebelum tubuh tertutup atau terbawah dalam file HTML .
maka Anda dapat melihat konten halaman terlebih dahulu sebelum memuat file js .
periksa ini jika memerlukan: http://stevesouders.com/hpws/rule-js-bottom.php
sumber
Jawaban konvensional (dan diterima secara luas) adalah "di bagian bawah", karena kemudian seluruh DOM akan dimuat sebelum apa pun dapat mulai dijalankan.
Ada perbedaan pendapat, karena berbagai alasan, mulai dengan praktik yang tersedia untuk memulai eksekusi dengan sengaja dengan acara onload halaman.
sumber
Tempat terbaik untuk meletakkan
<script>
tag adalah sebelum menutup</body>
tag , jadi pengunduhan dan pengeksekusiannya tidak memblokir browser untuk menguraikan html dalam dokumen,Juga memuat file js secara eksternal memiliki kelebihannya sendiri seperti itu akan di- cache oleh browser dan dapat mempercepat waktu pemuatan halaman , ini memisahkan kode HTML dan JavaScript dan membantu mengelola basis kode dengan lebih baik .
tetapi browser modern juga mendukung beberapa cara optimal lainnya seperti
async
dandefer
untuk memuatjavascript
file eksternal .Async dan Defer
Biasanya eksekusi halaman HTML dimulai baris demi baris. Ketika elemen JavaScript eksternal ditemukan, parsing HTML dihentikan sampai JavaScript diunduh dan siap untuk dieksekusi. Eksekusi halaman normal ini dapat diubah menggunakan
defer
danasync
atribut.Defer
Ketika atribut defer digunakan, JavaScript diunduh parallelly dengan parsing HTML tetapi akan dieksekusi hanya setelah parsing HTML lengkap dilakukan.
Async
Ketika atribut async digunakan, JavaScript diunduh segera setelah skrip ditemukan dan setelah unduhan, itu akan dieksekusi secara tidak sinkron (paralel) bersama dengan penguraian HTML.
Kapan harus menggunakan atribut mana
async
.async
, keduanya akan berjalansejajar dengan penguraian HTML, segera setelah mereka diunduh
dan tersedia.
defer
untuk keduanya:defer
, maka script1 dijamin untuk dieksekusi terlebih dahulu,async
gunakan skrip Anda tanpa atribut dan letakkan di atas semuaasync
skrip.referensi: knowledgehills.com
sumber
Tergantung, jika Anda memuat skrip yang diperlukan untuk menata halaman Anda / menggunakan tindakan di halaman Anda (seperti klik tombol) maka Anda lebih baik meletakkannya di atas. Jika gaya Anda adalah 100% CSS dan Anda memiliki semua opsi mundur untuk tindakan tombol maka Anda dapat meletakkannya di bagian bawah.
Atau hal terbaik (jika itu bukan masalah) adalah Anda dapat membuat kotak pemuatan modal, letakkan javascript di bagian bawah halaman Anda dan lenyapkan saat baris terakhir skrip Anda dimuat. Dengan cara ini Anda dapat menghindari pengguna menggunakan tindakan di halaman Anda sebelum skrip dimuat. Dan juga menghindari penataan yang tidak tepat.
sumber
Termasuk skrip di bagian akhir terutama digunakan di mana konten / gaya situs web akan ditampilkan terlebih dahulu.
termasuk skrip di kepala memuat skrip lebih awal dan dapat digunakan sebelum memuat seluruh situs web.
jika skrip dimasukkan akhirnya validasi akan terjadi hanya setelah pemuatan seluruh gaya dan desain yang tidak dihargai untuk situs web yang cepat tanggap.
sumber
Bergantung pada skrip dan penggunaannya, yang terbaik (dalam hal memuat halaman dan waktu rendering) mungkin adalah dengan tidak menggunakan tag <script> konvensional-per se, tetapi untuk secara dinamis memicu pemuatan skrip secara asinkron.
Ada beberapa teknik yang berbeda, tetapi yang paling mudah adalah menggunakan document.createElement ("script") ketika event window.onload dipicu. Kemudian skrip dimuat pertama ketika halaman itu sendiri telah dirender, sehingga tidak memengaruhi waktu pengguna harus menunggu halaman muncul.
Ini secara alami mensyaratkan bahwa skrip itu sendiri tidak diperlukan untuk rendering halaman.
Untuk informasi lebih lanjut, lihat posting skrip skrip async oleh Steve Souders (pembuat YSlow tetapi sekarang di Google).
sumber
Jika Anda masih sangat peduli tentang dukungan dan kinerja di IE <10, yang terbaik adalah SELALU membuat skrip Anda sebagai tag terakhir dari tubuh HTML Anda. Dengan begitu, Anda yakin bahwa sisa DOM telah dimuat dan Anda tidak akan memblokir dan merender.
Jika Anda tidak terlalu peduli lagi dengan IE <10, Anda mungkin ingin meletakkan skrip Anda di kepala dokumen Anda dan menggunakannya
defer
untuk memastikan skrip tersebut hanya berjalan setelah DOM Anda dimuat (<script type="text/javascript" src="path/to/script1.js" defer></script>
). Jika Anda masih ingin kode Anda bekerja di IE <10, jangan lupa untuk membungkus kode Anda dalamwindow.onload
genap!sumber
Script memblokir DOM memuat hingga dimuat dan dieksekusi.
Jika Anda menempatkan skrip di akhir
<body>
semua DOM memiliki peluang untuk memuat dan merender (halaman akan "menampilkan" lebih cepat).<script>
akan memiliki akses ke semua elemen DOM tersebut.Di sisi lain menempatkannya setelah
<body>
mulai atau di atas akan mengeksekusi skrip (di mana masih ada elemen DOM).Anda termasuk jQuery yang berarti Anda dapat menempatkannya di mana pun Anda inginkan dan gunakan .ready ()
sumber
Saya pikir itu tergantung pada eksekusi halaman web. Jika halaman yang ingin Anda tampilkan tidak dapat ditampilkan dengan benar tanpa memuat JavaScript terlebih dahulu maka Anda harus memasukkan file JavaScript terlebih dahulu. Tetapi Jika Anda dapat menampilkan / merender halaman web tanpa terlebih dahulu mengunduh file JavaScript, maka Anda harus meletakkan kode JavaScript di bagian bawah halaman. Karena itu akan meniru pemuatan halaman yang cepat, dan dari sudut pandang pengguna sepertinya halaman itu memuat lebih cepat.
sumber
Anda dapat menempatkan sebagian besar
<script>
referensi di akhir<body>
,Tapi Jika ada komponen aktif pada halaman Anda yang menggunakan skrip eksternal,
maka ketergantungannya (file js) harus didahulukan sebelum itu (idealnya di head tag).
sumber
Sebelum akhir tag tubuh untuk mencegah dan UI memblokir.
sumber
Di Akhir Dokumen HTML
Sehingga tidak akan mempengaruhi pemuatan dokumen HTML di browser pada saat eksekusi.
sumber
Tempat terbaik untuk menulis
JavaScript
kode Anda adalah di akhir dokumen setelah atau tepat sebelum</body>
tag untuk memuat dokumen terlebih dahulu dan kemudian jalankan kode js.Dan jika Anda menulis di
JQuery
bawah ini bisa di kepala dokumen dan itu akan dijalankan setelah dokumen dimuat:sumber
SyntaxError
Lebih masuk akal bagi saya untuk memasukkan skrip setelah HTML. Karena sebagian besar waktu saya memerlukan Dom untuk memuat sebelum saya menjalankan skrip saya. Saya bisa meletakkannya di kepala tag tapi saya tidak suka semua overhead pendengar pemuatan Dokumen. Saya ingin kode saya pendek dan manis dan mudah dibaca.
Saya pernah mendengar versi lama safari aneh ketika menambahkan skrip Anda di luar tag kepala tapi saya katakan siapa yang peduli. Saya tidak tahu siapa pun yang menggunakan omong kosong tua itu, kan?
Pertanyaan yang bagus.
sumber
Anda dapat menempatkan di mana Anda ingin skrip dan satu tidak lebih baik dari praktik lainnya.
situasinya adalah sebagai berikut:
Halaman memuat secara linear, "top-down", jadi jika Anda meletakkan skrip di kepala memastikan bahwa mulai memuat sebelum semuanya, sekarang, jika Anda memasukkannya ke dalam tubuh yang dicampur dengan kode dapat menyebabkan halaman dimuat dengan cara yang tidak sedap dipandang.
mengidentifikasi praktik yang baik tidak tergantung di mana.
untuk mendukung Anda, saya akan menyebutkan yang berikut:
Anda dapat menempatkan:
dan halaman akan dimuat secara linear
Halaman dimuat secara tidak sinkron dengan konten lain
konten halaman akan dimuat sebelum dan setelah selesai memuat skrip dimuat
praktik yang baik di sini adalah, kapan akan menerapkan masing-masing?
Saya harap saya telah membantu, apa pun hanya menjawab saya masalah ini.
sumber