Bagaimana Anda dapat secara andal dan dinamis memuat file JavaScript? Ini akan dapat digunakan untuk mengimplementasikan modul atau komponen yang ketika 'diinisialisasi' komponen akan secara dinamis memuat semua skrip perpustakaan JavaScript yang diperlukan sesuai permintaan.
Klien yang menggunakan komponen tidak diperlukan untuk memuat semua file skrip perpustakaan (dan secara manual memasukkan <script>
tag ke halaman web mereka) yang mengimplementasikan komponen ini - hanya file skrip komponen 'utama'.
Bagaimana pustaka JavaScript arus utama melakukan ini (Prototipe, jQuery, dll)? Apakah alat-alat ini menggabungkan banyak file JavaScript menjadi versi tunggal dari file skrip? Atau apakah mereka melakukan pemuatan dinamis skrip 'perpustakaan' tambahan?
Tambahan untuk pertanyaan ini: apakah ada cara untuk menangani acara setelah file JavaScript yang dimasukkan secara dinamis dimuat? Prototipe memiliki document.observe
untuk acara di seluruh dokumen. Contoh:
document.observe("dom:loaded", function() {
// initially hide all containers for tab content
$$('div.tabcontent').invoke('hide');
});
Apa saja acara yang tersedia untuk elemen skrip?
sumber
Jawaban:
Anda dapat menulis tag skrip dinamis (menggunakan Prototipe ):
Masalahnya di sini adalah kita tidak tahu kapan file skrip eksternal dimuat penuh.
Kami sering menginginkan kode dependen kami di baris berikutnya dan suka menulis sesuatu seperti:
Ada cara cerdas untuk menyuntikkan dependensi skrip tanpa perlu callback. Anda cukup menarik skrip melalui permintaan AJAX yang sinkron dan mengevaluasi skrip di tingkat global.
Jika Anda menggunakan Prototipe, metode Script.load terlihat seperti ini:
sumber
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)web.archive.org
.Tidak ada impor / sertakan / butuhkan dalam javascript, tetapi ada dua cara utama untuk mencapai apa yang Anda inginkan:
1 - Anda dapat memuatnya dengan panggilan AJAX lalu gunakan eval.
Ini adalah cara yang paling mudah tetapi terbatas pada domain Anda karena pengaturan keamanan Javascript, dan menggunakan eval membuka pintu untuk bug dan peretasan.
2 - Tambahkan tag skrip dengan URL skrip dalam HTML.
Pasti cara terbaik untuk pergi. Anda dapat memuat skrip bahkan dari server asing, dan itu bersih saat Anda menggunakan parser browser untuk mengevaluasi kode. Anda dapat meletakkan tag di bagian atas halaman web, atau di bagian bawah badan.
Kedua solusi ini dibahas dan diilustrasikan di sini.
Sekarang, ada masalah besar yang harus Anda ketahui. Melakukan hal itu menyiratkan bahwa Anda memuat kode dari jarak jauh. Browser web modern akan memuat file dan terus mengeksekusi skrip Anda saat ini karena mereka memuat semuanya secara tidak sinkron untuk meningkatkan kinerja.
Ini berarti bahwa jika Anda menggunakan trik ini secara langsung, Anda tidak akan dapat menggunakan kode yang baru dimuat di baris berikutnya setelah Anda memintanya untuk dimuat, karena masih akan memuat.
EG: my_lovely_script.js berisi MySuperObject
Kemudian Anda memuat ulang halaman yang mengenai F5. Dan itu berhasil! Membingungkan ...
Jadi apa yang harus dilakukan?
Nah, Anda dapat menggunakan retasan yang disarankan penulis di tautan yang saya berikan kepada Anda. Singkatnya, untuk orang-orang yang terburu-buru, dia menggunakan en event untuk menjalankan fungsi panggilan balik ketika skrip dimuat. Jadi Anda bisa meletakkan semua kode menggunakan pustaka jarak jauh di fungsi panggilan balik. EG:
Kemudian Anda menulis kode yang ingin Anda gunakan SETELAH skrip dimuat dalam fungsi lambda:
Kemudian Anda jalankan semua itu:
OK aku mengerti. Tetapi sulit untuk menulis semua hal ini.
Nah, dalam hal ini, Anda dapat menggunakan seperti biasa kerangka kerja jQuery gratis, yang memungkinkan Anda melakukan hal yang sama dalam satu baris:
sumber
Saya menggunakan versi yang jauh lebih rumit baru - baru ini dengan jQuery :
Ini bekerja sangat baik di setiap browser yang saya uji di: IE6 / 7, Firefox, Safari, Opera.
Pembaruan: versi jQuery-less:
sumber
$.getScript
. Lihat jawaban saya.Saya pada dasarnya melakukan hal yang sama seperti yang Anda lakukan pada Adam, tetapi dengan sedikit modifikasi untuk memastikan saya menambahkan tag kepala untuk menyelesaikan pekerjaan. Saya cukup membuat fungsi include (kode di bawah) untuk menangani skrip dan file css.
Fungsi ini juga memeriksa untuk memastikan bahwa skrip atau file CSS belum dimuat secara dinamis. Itu tidak memeriksa nilai-nilai kode tangan dan mungkin ada cara yang lebih baik untuk melakukan itu, tetapi melayani tujuannya.
sumber
jawaban lain yang luar biasa
https://stackoverflow.com/a/950146/671046
sumber
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Berikut ini beberapa contoh kode yang saya temukan ... apakah ada yang punya cara yang lebih baik?
sumber
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Jika Anda sudah memuat jQuery, Anda harus menggunakan $ .getScript .
Ini memiliki keunggulan dibandingkan jawaban lain di sini karena Anda memiliki fungsi panggilan balik bawaan (untuk menjamin skrip dimuat sebelum kode dependen berjalan) dan Anda dapat mengontrol caching.
sumber
Jika Anda ingin memuat skrip SYNC , Anda perlu menambahkan teks skrip langsung ke tag HEAD HTML. Menambahkannya sebagai akan memicu beban ASYNC . Untuk memuat teks skrip dari file eksternal secara sinkron, gunakan XHR. Di bawah contoh cepat (ini menggunakan bagian dari jawaban lain di ini dan tulisan lainnya):
sumber
Saya pikir hanya menambahkan skrip ke tubuh akan lebih mudah kemudian menambahkannya ke simpul terakhir pada halaman. Bagaimana dengan ini:
sumber
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Saya telah menggunakan solusi lain yang saya temukan di internet ... yang satu ini di bawah creativecommons dan memeriksa apakah sumbernya dimasukkan sebelum memanggil fungsi ...
Anda dapat menemukan file di sini: include.js
sumber
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Baru tahu tentang fitur hebat di YUI 3 (pada saat penulisan tersedia dalam rilis pratinjau). Anda dapat dengan mudah memasukkan dependensi ke perpustakaan YUI dan ke modul "eksternal" (apa yang Anda cari) tanpa terlalu banyak kode: YUI Loader .
Ini juga menjawab pertanyaan kedua Anda mengenai fungsi yang dipanggil segera setelah modul eksternal dimuat.
Contoh:
Bekerja dengan sempurna untuk saya dan memiliki keuntungan mengelola dependensi. Lihat dokumentasi YUI untuk contoh dengan kalender YUI 2 .
sumber
Ada standar ECMA baru yang diusulkan yang disebut impor dinamis , baru-baru ini dimasukkan ke Chrome dan Safari.
sumber
Teknik yang kami gunakan di tempat kerja adalah meminta file javascript menggunakan permintaan AJAX dan kemudian eval () kembali. Jika Anda menggunakan pustaka prototipe, mereka mendukung fungsi ini dalam panggilan Ajax.Request mereka.
sumber
jquery menyelesaikan ini untuk saya dengan fungsi .append () - gunakan ini untuk memuat paket jquery ui lengkap
Untuk Menggunakan - di kepala html / php / etc Anda setelah Anda mengimpor jquery.js Anda hanya akan memasukkan file yang satu ini seperti itu untuk memuat keseluruhan perpustakaan Anda menambahkannya ke kepala ...
sumber
Tetap bagus, pendek, sederhana, dan dapat dipelihara! :]
Kode ini hanyalah contoh fungsional singkat yang dapat memerlukan fungsionalitas fitur tambahan untuk dukungan penuh pada platform apa pun (atau yang diberikan).
sumber
Impor modul dinamis mendarat di Firefox 67+ .
Dengan penanganan kesalahan:
Ini juga berfungsi untuk semua jenis perpustakaan non-modul, dalam hal ini lib tersedia pada objek jendela, cara lama, tetapi hanya sesuai permintaan, yang bagus.
Contoh menggunakan suncalc.js , server harus mengaktifkan CORS agar berfungsi seperti ini!
https://caniuse.com/#feat=es6-module-dynamic-import
sumber
Ada skrip yang dirancang khusus untuk tujuan ini.
yepnope.js dibangun ke dalam Modernizr, dan lab.js adalah versi yang lebih dioptimalkan (tetapi kurang ramah pengguna.
Saya tidak akan merekomendasikan melakukan ini melalui perpustakaan besar seperti jquery atau prototipe - karena salah satu manfaat utama dari pemuat skrip adalah kemampuan untuk memuat skrip lebih awal - Anda tidak perlu menunggu sampai jquery & semua elemen dom Anda dimuat sebelum menjalankan pemeriksaan untuk melihat apakah Anda ingin memuat skrip secara dinamis.
sumber
Saya menulis modul sederhana yang mengotomatiskan pekerjaan mengimpor / termasuk skrip modul dalam JavaScript. Cobalah dan silakan berikan umpan balik! :) Untuk penjelasan rinci tentang kode, lihat posting blog ini: http://stamat.wordpress.com/2013/04/12/javascript-require-import-include-modules/
sumber
Saya kehilangan semua sampel ini, tetapi hari ini saya perlu memuat .js eksternal dari .js utama saya dan saya melakukan ini:
sumber
Inilah yang sederhana dengan dukungan callback dan IE:
sumber
Saya tahu jawaban saya agak terlambat untuk pertanyaan ini, tetapi, di sini ada artikel bagus di www.html5rocks.com - Menyelam dalam-dalam ke perairan keruh pemuatan skrip .
Dalam artikel itu disimpulkan bahwa dalam hal dukungan browser, cara terbaik untuk secara dinamis memuat file JavaScript tanpa memblokir rendering konten adalah dengan cara berikut:
Mengingat Anda memiliki empat skrip bernama
script1.js, script2.js, script3.js, script4.js
maka Anda dapat melakukannya dengan menerapkan async = false :Sekarang, Spec mengatakan : Unduh bersama, jalankan segera setelah semua unduhan.
Firefox <3.6, Opera mengatakan: Saya tidak tahu apa itu "async" itu, tetapi kebetulan saya mengeksekusi skrip yang ditambahkan melalui JS sesuai urutan penambahannya.
Safari 5.0 mengatakan: Saya mengerti "async", tetapi tidak mengerti pengaturannya ke "false" dengan JS. Saya akan menjalankan skrip Anda segera setelah mereka mendarat, dalam urutan apa pun.
IE <10 mengatakan: Tidak tahu tentang "async", tetapi ada solusi menggunakan "onreadystatechange".
Yang lainnya mengatakan: Aku temanmu, kita akan melakukan ini berdasarkan buku.
Sekarang, kode lengkap dengan solusi IE <10:
Beberapa trik dan minifikasi kemudian, 362 byte
sumber
Sesuatu seperti ini...
sumber
Berikut contoh sederhana untuk fungsi memuat file JS. Poin yang relevan:
$.ajax
atau$.getScript
Anda dapat menggunakan nonces, dengan demikian menyelesaikan masalah dengan CSPunsafe-inline
. Cukup gunakan propertiscript.nonce
Sekarang Anda menggunakannya hanya dengan
sumber
Satu baris yang absurd, bagi mereka yang berpikir bahwa memuat perpustakaan js tidak boleh mengambil lebih dari satu baris kode: P
Jelas jika skrip yang ingin Anda impor adalah modul, Anda dapat menggunakan
import(...)
fungsinya.sumber
Dengan Janji Anda dapat menyederhanakannya seperti ini. Fungsi pemuat:
Penggunaan (async / menunggu):
Penggunaan (Janji):
CATATAN: ada satu solusi serupa tetapi tidak memeriksa apakah skrip sudah dimuat dan memuat skrip setiap kali. Yang ini memeriksa properti src.
sumber
semua pustaka javascript utama seperti jscript, prototype, YUI memiliki dukungan untuk memuat file skrip. Misalnya, di YUI, setelah memuat inti Anda dapat melakukan hal berikut untuk memuat kontrol kalender
sumber
Saya telah men-tweak beberapa posting di atas dengan contoh kerja. Di sini kita bisa memberikan css dan js dalam array yang sama juga.
sumber
Bagi Anda, yang menyukai one-liners:
Kemungkinannya Anda mungkin mendapatkan kesalahan, seperti:
Dalam hal ini, Anda dapat mundur ke:
sumber