Apa cara yang baik untuk mencoba memuat jQuery yang dihosting di Google (atau lib Google yang dihosting Google), tetapi muat salinan jQuery saya jika upaya Google gagal?
Saya tidak mengatakan Google tidak stabil. Ada kasus di mana salinan Google diblokir (misalnya di Iran, misalnya).
Apakah saya akan mengatur timer dan memeriksa objek jQuery?
Apa bahaya kedua salinan itu?
Tidak benar-benar mencari jawaban seperti "gunakan saja Google" atau "gunakan saja sendiri." Saya mengerti argumen itu. Saya juga mengerti bahwa pengguna cenderung memiliki cache versi Google. Saya berpikir tentang fallback untuk cloud secara umum.
Edit: Bagian ini ditambahkan ...
Karena Google menyarankan untuk menggunakan google.load untuk memuat pustaka ajax, dan melakukan panggilan balik ketika selesai, saya bertanya-tanya apakah itu kunci untuk membuat serialisasi masalah ini.
Saya tahu ini terdengar agak gila. Saya hanya mencoba mencari tahu apakah itu dapat dilakukan dengan cara yang dapat diandalkan atau tidak.
Pembaruan: jQuery sekarang di-host di CDN Microsoft.
sumber
Jawaban:
Anda dapat mencapainya seperti ini:
Ini harus di halaman Anda
<head>
dan penangan acara siap jQuery harus di<body>
untuk menghindari kesalahan (meskipun itu bukan bukti bodoh!).Satu lagi alasan untuk tidak menggunakan jQuery yang dihosting Google adalah bahwa di beberapa negara, nama domain Google dilarang.
sumber
Cara termudah dan terbersih untuk melakukan ini sejauh ini:
sumber
XHTML 1.0
danHTML 4.01
type="text/javascript"
bagian - bagiannya, jadi kepada orang-orang yang menulis html untuk peramban yang lebih lama, perhatikan bahwa Anda sekarang harus menambahkannya.type="text/javascript"
juga tidak perlu di browser lama, karena semuanya default ke Javascript. Peramban yang benar - benar lebih tua melihatlanguage
atributnya; tetapi bahkan kemudian, Javascript adalah default jika atributnya hilang.<script src="//cdn1.com/jquery.js"></script> <script>window.jQuery || document.write('<script src="//cdn2.com/jquery.js"><\/script>')</script> <script>window.jQuery || document.write('<script src="local/jquery.js"><\/script>')</script>
Ini sepertinya bekerja untuk saya:
Cara kerjanya adalah dengan menggunakan
google
objek yang memanggil http://www.google.com/jsapi memuat kewindow
objek. Jika objek itu tidak ada, kami mengasumsikan bahwa akses ke Google gagal. Jika demikian, kami memuat salinan lokal menggunakandocument.write
. (Saya menggunakan server saya sendiri dalam hal ini, silakan gunakan server Anda sendiri untuk menguji ini).Saya juga menguji keberadaan
window.google.load
- Saya juga bisa melakukantypeof
pemeriksaan untuk melihat bahwa benda-benda adalah benda atau fungsi yang sesuai. Tapi saya pikir ini yang berhasil.Berikut ini hanya logika pemuatan, karena penyorotan kode tampaknya gagal karena saya memposting seluruh halaman HTML yang saya uji:
Meskipun saya harus mengatakan, saya tidak yakin bahwa jika ini menjadi perhatian bagi pengunjung situs Anda, Anda harus mengutak-atik API Perpustakaan Google AJAX sama sekali.
Fakta menyenangkan : Saya awalnya mencoba menggunakan blok try..catch untuk ini dalam berbagai versi tetapi tidak dapat menemukan kombinasi yang sebersih ini. Saya tertarik untuk melihat implementasi lain dari ide ini, murni sebagai latihan.
sumber
Jika Anda memiliki modernizr.js tertanam di situs Anda, Anda dapat menggunakan yepnope.js bawaan untuk memuat skrip Anda secara tidak sinkron - antara lain jQuery (dengan fallback).
Ini memuat jQuery dari Google-cdn. Setelah itu diperiksa, apakah jQuery berhasil dimuat. Jika tidak ("nggak"), versi lokal dimuat. Juga skrip pribadi Anda dimuat - "keduanya" menunjukkan, bahwa proses memuat dimulai secara independen dari hasil tes.
Ketika semua proses memuat selesai, fungsi dijalankan, dalam kasus 'MyApp.init'.
Saya pribadi lebih suka cara memuat skrip asinkron ini. Dan karena saya mengandalkan fitur-tes yang disediakan oleh modernizr ketika membangun sebuah situs, saya tetap melekat pada situs tersebut. Jadi sebenarnya tidak ada overhead.
sumber
yepnope.js
sudah usang. lihat stackoverflow.com/questions/33986561/…Ada beberapa solusi hebat di sini, tetapi saya ingin mengambil satu langkah lebih jauh mengenai file lokal.
Dalam skenario ketika Google gagal, seharusnya memuat sumber lokal tetapi mungkin file fisik di server tidak selalu merupakan pilihan terbaik. Saya membawa ini karena saya sedang mengimplementasikan solusi yang sama, hanya saja saya ingin kembali ke file lokal yang dihasilkan oleh sumber data.
Alasan saya untuk ini adalah bahwa saya ingin memiliki beberapa pemikiran ketika datang untuk melacak apa yang saya muat dari Google vs apa yang saya miliki di server lokal. Jika saya ingin mengubah versi, saya ingin agar salinan lokal saya tetap disinkronkan dengan apa yang saya coba muat dari Google. Dalam lingkungan di mana ada banyak pengembang, saya pikir pendekatan terbaik adalah mengotomatiskan proses ini sehingga yang harus dilakukan adalah mengubah nomor versi dalam file konfigurasi.
Inilah solusi yang saya usulkan yang seharusnya bekerja secara teori:
Secara teori, jika kode saya ditulis dengan benar, semua yang perlu saya lakukan adalah mengubah nomor versi di konfigurasi aplikasi saya kemudian viola! Anda memiliki solusi cadangan yang otomatis, dan Anda tidak perlu memelihara file fisik di server Anda.
Apa yang dipikirkan semua orang? Mungkin ini berlebihan, tetapi bisa menjadi metode yang elegan untuk mempertahankan perpustakaan AJAX Anda.
Biji pohon ek
sumber
Setelah Anda mencoba untuk memasukkan salinan Google dari CDN.
Di HTML5, Anda tidak perlu mengatur
type
atribut.Anda juga bisa menggunakan...
sumber
[Violation] Avoid using document.write().
Anda mungkin ingin menggunakan file lokal Anda sebagai pilihan terakhir.
Tampaknya CDN jQuery sekarang tidak mendukung https. Jika itu Anda mungkin ingin memuat dari sana dulu.
Jadi inilah urutannya: Google CDN => Microsoft CDN => Salinan lokal Anda.
sumber
Persyaratan memuat versi / fallback jQuery terbaru / lama:
sumber
jQuery
variabel)Cara memeriksa variabel yang tidak didefinisikan dalam JavaScript
Bagaimana cara saya memasukkan file JavaScript ke file JavaScript lain?
sumber
Karena masalah pelarangan Google, saya lebih suka menggunakan cdn Microsoft http://www.asp.net/ajaxlibrary/cdn.ashx
sumber
Ini penjelasan yang bagus tentang ini!
Juga mengimplementasikan penundaan pemuatan dan batas waktu!
http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/
sumber
Bagi mereka yang menggunakan ASP.NET MVC 5, tambahkan kode ini di BundleConfig.cs Anda untuk mengaktifkan CDN untuk jquery:
sumber
UPDATE:
Jawaban ini ternyata salah. Silakan lihat komentar untuk penjelasan yang sebenarnya.
Sebagian besar dari Anda pertanyaan telah dijawab, tetapi untuk bagian terakhir:
Tidak ada yang benar-benar. Anda akan membuang bandwidth, mungkin menambahkan beberapa milidetik mengunduh salinan kedua yang tidak berguna, tetapi tidak ada salahnya jika keduanya terjadi. Anda harus, tentu saja, menghindari ini menggunakan teknik yang disebutkan di atas.
sumber
Saya membuat intisari yang seharusnya secara dinamis memuat jQuery jika belum dimuat, dan jika sumber gagal, ia melanjutkan ke fallback (dijahit bersama dari banyak jawaban): https://gist.github.com/tigerhawkvok/9673154
Harap dicatat saya berencana untuk terus memperbarui Gist tetapi bukan jawaban ini, untuk apa nilainya!
sumber
Google Hosted jQuery
Paket Cadangan / Fallback!
Referensi: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx
sumber
Saya menganggap bahwa harus keluar dari string <to \ x3C terakhir. Ketika browser melihat, itu menganggap ini sebagai akhir dari blok skrip (karena parser HTML tidak tahu tentang JavaScript, itu tidak dapat membedakan antara sesuatu yang hanya muncul dalam string, dan sesuatu yang sebenarnya dimaksudkan untuk mengakhiri skrip elemen). Jadi muncul secara harfiah di JavaScript yang ada di dalam halaman HTML akan (dalam kasus terbaik) menyebabkan kesalahan, dan (dalam kasus terburuk) menjadi lubang keamanan yang sangat besar.
sumber
Atau
Tidak akan berfungsi jika versi cdn tidak dimuat, karena browser akan berjalan melalui kondisi ini dan selama itu masih mengunduh sisa javascripts yang memerlukan jQuery dan mengembalikan kesalahan. Solusi adalah memuat skrip melalui kondisi itu.
sumber
Hampir semua CDN publik cukup andal. Namun, jika Anda khawatir tentang domain google yang diblokir, maka Anda dapat dengan mudah mundur ke CDN jQuery alternatif . Namun, dalam kasus seperti itu, Anda dapat memilih untuk melakukannya secara berlawanan dan menggunakan beberapa CDN lain sebagai opsi pilihan dan mundur ke Google CDN untuk menghindari permintaan yang gagal dan waktu tunggu:
sumber
Menggunakan sintaks Razor di ASP.NET, kode ini memberikan dukungan fallback dan bekerja dengan root virtual:
Atau buat helper ( gambaran umum helper ):
dan gunakan seperti ini:
sumber
CdnScript
helper, Anda hanya perlu satu baris kode per skrip . Semakin banyak skrip yang Anda miliki, semakin besar hasilnya.try { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }
. Menerjemahkan ini ke sekelompokif
s bisa menjadi mimpi buruk.Meskipun penulisan
document.write("<script></script>")
tampaknya lebih mudah untuk backoff jQuery, Chrome memberikan kesalahan validasi pada kasus itu. Jadi saya lebih suka melanggar kata "skrip". Sehingga menjadi lebih aman seperti di atas.Untuk masalah jangka panjang, akan lebih baik untuk mencatat fallback JQuery. Dalam kode di atas, jika CDN pertama tidak tersedia JQuery diambil dari CDN lain. Tapi Anda mungkin ingin tahu CDN yang salah dan menghapusnya secara permanen. (kasus ini adalah kasus yang sangat luar biasa) Juga lebih baik untuk mencatat masalah fallback. Jadi, Anda dapat mengirim kasus yang salah dengan AJAX. Karena JQuery tidak didefinisikan, Anda harus menggunakan javascript vanilla untuk permintaan AJAX.
sumber
Ketidakmampuan untuk memuat sumber daya dari penyimpanan data eksternal di luar kendali Anda sulit. Mencari fungsi yang hilang benar-benar keliru sebagai cara untuk menghindari menderita timeout, seperti dijelaskan di sini: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/
sumber
Namun fallback lain yang menggantikan ajax.googleapis.com dengan cdnjs.cloudflare.com :
sumber
Anda dapat menggunakan kode seperti:
Tetapi juga ada perpustakaan yang dapat Anda gunakan untuk mengatur beberapa kemungkinan fallback untuk skrip Anda dan mengoptimalkan proses pemuatan:
Contoh:
basket.js saya pikir varian terbaik untuk saat ini. Akan menghapus naskah Anda di localStorage, yang akan mempercepat pemuatan berikutnya. Panggilan paling sederhana:
Ini akan mengembalikan janji dan Anda dapat melakukan kesalahan panggilan berikutnya, atau memuat dependensi pada kesuksesan:
Membutuhkan JS
ya tidak
sumber