AMP

Corrigir erros de validação

Nesta seção, analisaremos e resolveremos os erros de validação de AMP na nossa página AMP. Esses erros podem aparecer em outra ordem no seu console.

Incluir charset

Para começar, corrigiremos o seguinte erro:

The mandatory tag 'meta charset=utf-8' is missing or incorrect.

Para que o texto seja exibido corretamente, é necessário especificar o charset das páginas AMP. As informações do meta charset também precisam ser o primeiro filho da tag <head>. Essa tag precisa ser a primeira para evitar a reinterpretação de conteúdo adicionado antes da tag meta charset.

Adicione o código a seguir como a primeira linha da tag <head>:

<meta charset="utf-8" />

Salve o arquivo e atualize a página. Verifique se o erro de charset ainda ocorre.

Agora, veja este erro:

The mandatory tag 'link rel=canonical' is missing or incorrect.

Todo documento AMP precisa ter um link que faça referência à respectiva versão "canônica". Veja mais sobre o que é uma página canônica e quais são as diferentes abordagens para vincular o conteúdo canônico na etapa deste tutorial sobre como fazer com que a página seja detectável.

Neste tutorial, o artigo HTML original que estamos convertendo será a página canônica.

Adicione o código a seguir à tag <meta charset="utf-8" />:

<link rel="canonical" href="/article.html" />

É possível criar uma página AMP canônica independente. Nesse caso, o link canônico ainda é necessário, mas precisa levar ao próprio artigo AMP:

<link rel="canonical" href="article.amp.html" />

Agora, atualize a página. Embora ainda haja muitos erros para corrigir, o erro do link canônico não está mais presente.

Especificar o atributo AMP

A AMP exige um atributo no elemento raiz <html> das páginas para declarar que elas são documentos AMP.

The mandatory attribute '⚡' is missing in tag 'html ⚡ for top-level html'
The mandatory tag 'html ⚡ for top-level html' is missing or incorrect.

Para corrigir os erros acima, basta adicionar o atributo à tag <html> da seguinte forma:

<html  lang="en"></html>

Agora, atualize a página e verifique se os erros desapareceram.

A abordagem recomendada é especificar , mas também é possível usar o atributo amp no lugar do atributo . Veja este exemplo:

<html amp lang="en"></html>

Especificar uma janela de visualização

Agora, vejamos o seguinte erro:

The mandatory tag 'meta name=viewport' is missing or incorrect.

A AMP exige a definição de width e minimum-scale para a janela de visualização. Esses valores precisam ser definidos como device-width e 1, respectivamente. A janela de visualização é uma tag comum incluída no elemento <head> de uma página HTML.

Para corrigir o erro na janela de visualização, adicione o seguinte snippet HTML à tag <head>:

<meta name="viewport" content="width=device-width" />

Os valores especificados para width e minimum-scale são obrigatórios na AMP. A definição de initial-scale não é obrigatória, mas é recomendada e costuma ser incluída no desenvolvimento da Web para dispositivos móveis. Leia mais sobre a janela de visualização e o design responsivo em Defina a janela de visualização.

Assim como antes, atualize a página e verifique se o erro desapareceu.

Substituir folhas de estilo externas

O erro a seguir está relacionado com o uso de folhas de estilo:

The attribute 'href' in tag 'link rel=stylesheet for fonts' is set to the invalid value 'base.css'.

Especificamente, este erro se refere à seguinte tag de link da folha de estilo na tag <head>:

<link href="base.css" rel="stylesheet" />

O problema é que essa é uma referência de folha de estilo externa. Na AMP, para carregar documentos com a maior velocidade possível, não inclua folhas de estilo externas. Em vez disso, todas as regras de folha de estilo precisam ser adicionadas in-line ao documento AMP usando as tags <style amp-custom></ style>.

<style amp-custom>
  /* The content from base.css */
</style>

Então, corrija o erro:

  1. Remova a tag <link> que direciona para a folha de estilo na tag <head> e a substitua por uma tag in-line <style amp-custom></style>. O atributo amp-custom na tag de estilo é obrigatório.
  2. Copie todos os estilos do arquivo base.css para as tags <style amp-custom></style>.

Mais uma vez, atualize a página e verifique se o erro das folhas de estilo desapareceu.

O estilo in-line é obrigatório. Além disso, há um limite de tamanho de arquivo de 50 kilobytes para todas as informações de estilo. Use pré-processadores de CSS, como o SASS (em inglês), para reduzir o CSS antes de realizar a inserção in-line dele nas páginas AMP.

É possível ter somente uma tag de estilo em todo o documento AMP. Se várias folhas de estilo externas forem referenciadas pelas páginas AMP, será necessário agrupá-las em um único conjunto de regras. Para saber quais regras de CSS são válidas na AMP, leia CSS compatível.

Excluir JavaScript de terceiros

É relativamente fácil alterar as folhas de estilo inserindo CSS in-line, mas isso não se aplica ao JavaScript.

The tag 'script' is disallowed except in specific forms.

Em geral, os scripts só são permitidos na AMP quando cumprem dois requisitos principais:

  1. Todo JavaScript precisa ser assíncrono (ou seja, incluir o atributo async na tag de script).
  2. O JavaScript é para a biblioteca AMP e para qualquer componente AMP na página.

Isso exclui efetivamente o uso de todo JavaScript gerado por usuários/terceiros na AMP, exceto no caso indicado abaixo.

As únicas exceções à restrição a scripts gerados por usuários/terceiros são:

  1. Scripts que adicionam metadados à página ou configuram componentes AMP: terão o atributo de tipo application/ld+json ou application/json.
  2. Scripts incluídos em iframes: só inclua JavaScript em um iframe em último caso. Sempre que possível, substitua os recursos JavaScript usando os Componentes AMP. Veremos nosso primeiro componente AMP na próxima seção.

Tente abrir o arquivo externo [base.js] (https://github.com/googlecodelabs/accelerated-mobile-pages-foundations/blob/master/base.js). O que você vê? O arquivo deverá estar vazio, sem qualquer código JavaScript, e incluir apenas um comentário com informações como esta:

/*

This external JavaScript file is intentionally empty.

Its purpose is merely to demonstrate the AMP validation error related to the
use of external JavaScript files.

*/

Considerando que esse arquivo JavaScript externo não é um componente funcional do site, é possível remover a referência inteira com segurança.

Remova a seguinte referência externa de JavaScript do documento:

<script type="text/javascript" src="base.js"></script>

Agora, atualize a página e verifique se o erro do script desapareceu.

Incluir CSS padrão da AMP

Os seguintes erros se referem à ausência de código boilerplate:

The mandatory tag 'noscript enclosure for boilerplate' is missing or incorrect.
The mandatory tag 'head > style : boilerplate' is missing or incorrect.
The mandatory tag 'noscript > style : boilerplate' is missing or incorrect.

Todo documento AMP exige o seguinte código boilerplate correspondente:

<style amp-boilerplate>
  body {
    -webkit-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
    -moz-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
    -ms-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
    animation: -amp-start 8s steps(1, end) 0s 1 normal both;
  }
  @-webkit-keyframes -amp-start {
    from {
      visibility: hidden;
    }
    to {
      visibility: visible;
    }
  }
  @-moz-keyframes -amp-start {
    from {
      visibility: hidden;
    }
    to {
      visibility: visible;
    }
  }
  @-ms-keyframes -amp-start {
    from {
      visibility: hidden;
    }
    to {
      visibility: visible;
    }
  }
  @-o-keyframes -amp-start {
    from {
      visibility: hidden;
    }
    to {
      visibility: visible;
    }
  }
  @keyframes -amp-start {
    from {
      visibility: hidden;
    }
    to {
      visibility: visible;
    }
  }</style
><noscript
  ><style amp-boilerplate>
    body {
      -webkit-animation: none;
      -moz-animation: none;
      -ms-animation: none;
      animation: none;
    }
  </style></noscript
>

Adicione o código boilerplate à parte inferior da tag <head> do documento.

Inicialmente, a tag <style amp-boilerplate> oculta o conteúdo do corpo até que a biblioteca JavaScript da AMP seja carregada. Em seguida, o conteúdo é renderizado. Isso acontece nas AMP para evitar a renderização de conteúdo sem estilo, também conhecida como Flash Of Unstyled Content (FOUC). Isso ajuda a garantir que a experiência do usuário seja realmente instantânea, porque o conteúdo da página é exibido de uma só vez e tudo acima da dobra é renderizado em conjunto. A segunda tag inverterá essa lógica se o JavaScript estiver desativado no navegador.

Substituir<img> por <amp-img>

A AMP não é compatível com os elementos HTML padrão correspondentes à exibição de mídia, o que explica este erro:

The tag 'img' may only appear as a descendant of tag 'noscript'. Did you mean 'amp-img'?

A AMP tem um componente Web criado especificamente para substituir a tag <img>, a tag <amp-img>:

<amp-img src="mountains.jpg"></amp-img>

Substitua a tag <img> pela tag <amp-img> acima e repita a validação. Vários novos erros serão exibidos:

Layout not supported: container
The implied layout 'CONTAINER' is not supported by tag 'amp-img'.

Por que o amp-img acionou outro erro? Porque amp-img não é um substituto direto da tag HTML img tradicional. Existem requisitos adicionais ao usar o amp-img.

Sistema de layout AMP

O erro de layout informa que amp-img não é compatível com o tipo de layout container. Um dos conceitos mais importantes do design da AMP é o foco na redução do reflow de DOM necessário para renderizar páginas da Web.

A fim de reduzir o reflow de DOM, a AMP inclui um sistema para garantir que o layout da página seja identificado o quanto antes no ciclo de vida de download e renderização da página.

A imagem abaixo faz uma comparação entre o layout normal de uma página HTML com a abordagem aplicada pela AMP. Observe na abordagem à esquerda como o texto faz reflow toda vez que um anúncio ou imagem é carregado. A abordagem da AMP para o layout evita que o texto se mova, mesmo que as imagens e os anúncios demorem muito para serem carregados.

Comparação entre o layout normal do conteúdo e a abordagem da AMP

O sistema de layout AMP permite que os elementos da página sejam posicionados e dimensionados de várias maneiras: dimensões fixas, design responsivo, altura fixa e muito mais.

No caso do nosso artigo, o sistema de layout inferiu que o layout de amp-img é do tipo container. No entanto, o tipo container só é aplicável a elementos que tenham elementos filhos. O tipo container é incompatível com a tag amp-img, o que causa esse erro.

Por que o tipo container foi inferido? Porque não especificamos um atributo height para a tag amp-img. No HTML, sempre especifique largura e altura fixas para os elementos da página a fim de reduzir o reflow. Na AMP, é necessário definir a largura e a altura dos elementos do amp-img para que a AMP possa predeterminar a proporção do elemento.

Adicione width e height à tag <amp-img> da seguinte forma:

<amp-img src="mountains.jpg" width="266" height="150"></amp-img>

Atualize a página e verifique o validador, que não deverá exibir mais erros.

Agora você tem um documento AMP válido, mas a imagem está posicionada na página de uma maneira estranha. Por padrão, quando você especificar a altura e a largura de um amp-img, a AMP corrigirá as dimensões fornecidas. Mas não seria ótimo se a AMP dimensionasse a imagem para se estender de maneira responsiva e se ajustar à página independentemente do tamanho da tela?

A imagem não é responsiva.

Mesmo assim, a AMP consegue determinar a proporção dos elementos com base na largura e na altura especificadas. Isso permite que o sistema de layout AMP posicione e dimensione o elemento de diversas maneiras. O atributo layout informa à AMP como você quer que o elemento seja posicionado e dimensionado.

Defina o atributo layout como responsive para que a imagem seja redimensionada:

<amp-img
  src="mountains.jpg"
  layout="responsive"
  width="266"
  height="150"
></amp-img>

Pronto! A imagem está na proporção correta e preenche responsivamente a largura da tela.

Agora a imagem é responsiva!

Saiba mais sobre o sistema de layout AMP na especificação de layout AMP.

Pronto!

O documento AMP será parecido com isto:

<!DOCTYPE html>
<html  lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />

    <link rel="canonical" href="/article.html" />
    <link rel="shortcut icon" href="amp_favicon.png" />

    <title>News Article</title>

    <style amp-boilerplate>
      body {
        -webkit-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
        -moz-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
        -ms-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
        animation: -amp-start 8s steps(1, end) 0s 1 normal both;
      }
      @-webkit-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @-moz-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @-ms-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @-o-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
    </style>
    <noscript
      ><style amp-boilerplate>
        body {
          -webkit-animation: none;
          -moz-animation: none;
          -ms-animation: none;
          animation: none;
        }
      </style></noscript
    >
    <style amp-custom>
      body {
        width: auto;
        margin: 0;
        padding: 0;
      }

      header {
        background: Tomato;
        color: white;
        font-size: 2em;
        text-align: center;
      }

      h1 {
        margin: 0;
        padding: 0.5em;
        background: white;
        box-shadow: 0px 3px 5px grey;
      }

      p {
        padding: 0.5em;
        margin: 0.5em;
      }
    </style>
    <script async src="https://cdn.ampproject.org/v0.js"></script>
  </head>
  <body>
    <header>News Site</header>
    <article>
      <h1>Article Name</h1>

      <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam egestas
        tortor sapien, non tristique ligula accumsan eu.
      </p>

      <amp-img
        src="mountains.jpg"
        layout="responsive"
        width="266"
        height="150"
      ></amp-img>
    </article>
  </body>
</html>

Atualize a página e observe o resultado do console. Você verá a seguinte mensagem:

AMP validation successful.

Perguntas frequentes