Dokumen ini membahas praktik terbaik untuk memuat tag skrip reCAPTCHA. Informasi ini berlaku untuk reCAPTCHA v2 dan v3.
Memuat reCAPTCHA secara asinkron
Semua versi reCAPTCHA dapat dimuat secara asinkron. Memuat reCAPTCHA secara asinkron tidak memengaruhi kemampuannya untuk mengidentifikasi traffic yang mencurigakan. Karena manfaat performa skrip asinkron, memuat reCAPTCHA secara asinkron sangat direkomendasikan.
<script async src="https://www.google.com/recaptcha/api.js">
Saat memuat reCAPTCHA secara asinkron, perhatikan bahwa reCAPTCHA tidak dapat digunakan hingga pemuatan selesai. Misalnya, kode berikut mungkin akan rusak:
<script async src="https://www.google.com/recaptcha/api.js"></script>
<script>
// If reCAPTCHA is still loading, grecaptcha will be undefined.
grecaptcha.ready(function(){
grecaptcha.render("container", {
sitekey: "ABC-123"
});
});
</script>
Dalam beberapa situasi, menyesuaikan pengurutan skrip sudah cukup untuk mencegah kondisi race. Atau, Anda dapat mencegah kondisi race dengan menyertakan
cuplikan kode berikut di halaman yang memuat reCAPTCHA. Jika Anda menggunakan grecaptcha.ready()
untuk menggabungkan panggilan API, tambahkan cuplikan kode berikut untuk memastikan bahwa reCAPTCHA dapat dipanggil kapan saja.
<script async src="https://www.google.com/recaptcha/api.js"></script>
<script>
// How this code snippet works:
// This logic overwrites the default behavior of `grecaptcha.ready()` to
// ensure that it can be safely called at any time. When `grecaptcha.ready()`
// is called before reCAPTCHA is loaded, the callback function that is passed
// by `grecaptcha.ready()` is enqueued for execution after reCAPTCHA is
// loaded.
if(typeof grecaptcha === 'undefined') {
grecaptcha = {};
}
grecaptcha.ready = function(cb){
if(typeof grecaptcha === 'undefined') {
// window.__grecaptcha_cfg is a global variable that stores reCAPTCHA's
// configuration. By default, any functions listed in its 'fns' property
// are automatically executed when reCAPTCHA loads.
const c = '___grecaptcha_cfg';
window[c] = window[c] || {};
(window[c]['fns'] = window[c]['fns']||[]).push(cb);
} else {
cb();
}
}
// Usage
grecaptcha.ready(function(){
grecaptcha.render("container", {
sitekey: "ABC-123"
});
});
</script>
Sebagai alternatif, situs yang menggunakan API v2 mungkin akan bermanfaat untuk menggunakan
callback onload
; callback onload
dijalankan saat reCAPTCHA selesai
dimuat. Callback onload
harus ditentukan sebelum memuat skrip reCAPTCHA.
<script>
const onloadCallback = function() {
console.log("reCAPTCHA has loaded!");
grecaptcha.reset();
};
</script>
<script async src="https://www.google.com/recaptcha/api.js?onload=onloadCallback”></script>
Jika memuat reCAPTCHA secara asinkron tidak memungkinkan, Anda sebaiknya menyertakan petunjuk resource preconnect
untuk reCAPTCHA. Tindakan ini akan meminimalkan
durasi download skrip memblokir parser.
Menggunakan petunjuk resource
Menyertakan petunjuk resource berikut dalam <head>
dokumen akan mengurangi jumlah waktu yang diperlukan untuk mengirimkan resource yang digunakan oleh reCAPTCHA. Petunjuk resource preconnect
menginstruksikan browser untuk membuat
koneksi awal dengan asal pihak ketiga.
<link rel="preconnect" href="https://www.google.com">
<link rel="preconnect" href="https://www.gstatic.com" crossorigin>
Pemuatan Lambat
Secara umum, semakin banyak konteks yang dimiliki reCAPTCHA tentang sebuah halaman, semakin baik informasinya dalam menentukan apakah tindakan pengguna sah. Hal ini terutama berlaku saat menggunakan versi reCAPTCHA yang tidak bergantung pada verifikasi login pengguna. Oleh karena itu, menunggu untuk memuat reCAPTCHA hingga tindakan dibatasi tertentu terjadi (misalnya, pengiriman formulir) umumnya tidak direkomendasikan.