Carregando reCAPTCHA

Este documento discute as práticas recomendadas para carregar a tag de script reCAPTCHA. Estas informações são aplicáveis ao reCAPTCHA v2 e v3.

Como carregar o reCAPTCHA de forma assíncrona

Todas as versões do reCAPTCHA podem ser carregadas de forma assíncrona. Carregar o reCAPTCHA de forma assíncrona não afeta a capacidade de identificar tráfego suspeito. Devido aos benefícios de desempenho dos scripts assíncronos, o carregamento do reCAPTCHA de forma assíncrona é geralmente recomendado.

<script async src="https://www.google.com/recaptcha/api.js">

Ao carregar o reCAPTCHA de forma assíncrona, lembre-se de que ele não pode ser usado até terminar de carregar. Por exemplo, o código a seguir provavelmente seria corrompido:

<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>

Em algumas situações, o ajuste da ordem do script pode ser suficiente para evitar disputas. Como alternativa, você pode evitar disputas ao incluir o seguinte snippet de código em páginas que carregam reCAPTCHA. Se você estiver usando grecaptcha.ready() para encapsular chamadas de API, adicione o seguinte snippet de código para garantir que o reCAPTCHA possa ser chamado a qualquer momento.

<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>

Como alternativa, os sites que usam a API v2 podem achar útil usar o callback onload. O callback onload é executado quando o reCAPTCHA termina de carregar. O callback onload precisa ser definido antes do carregamento do script 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>

Se o carregamento do reCAPTCHA de forma assíncrona não for uma opção, é recomendável incluir dicas de recursos preconnect para o reCAPTCHA. Isso minimiza o tempo que o script de download bloqueia o analisador.

Como usar dicas de recursos

Incluir as dicas de recurso a seguir no <head> do documento reduzirá o tempo necessário para enviar os recursos usados pelo reCAPTCHA. A dica de recurso preconnect instrui o navegador a estabelecer uma conexão antecipada com origem de terceiros.

<link rel="preconnect" href="https://www.google.com">
<link rel="preconnect" href="https://www.gstatic.com" crossorigin>

Carregamento lento

De modo geral, quanto mais contexto o reCAPTCHA tiver sobre uma página, mais bem informado ele será para determinar se as ações do usuário são legítimas. Isso é especialmente verdadeiro ao usar versões do reCAPTCHA que não dependem de desafios do usuário. Portanto, não é recomendável aguardar para carregar o reCAPTCHA até que ocorra uma ação restrita específica (por exemplo, o envio do formulário).