Acelerando sites com dicas iniciais

Os sites ainda estão carregando muito lentamente. No momento mais crítico do processo de download, o canal geralmente fica quase completamente ocioso. A nova tecnologia da Fastly, proposta pelo engenheiro Kazuho Oku, ajudará a fazer melhor uso desse primeiro par crítico de segundos.

Você já baixou um site no seu telefone - e procurou por 10 segundos em uma página sem texto? Ninguém gosta de sentar e olhar para uma tela em branco enquanto alguma fonte incomum está sendo carregada. Portanto, faz sentido transferir o carregamento de coisas importantes para o mais rápido possível. O link rel = preload de pré-carga deveria resolver parcialmente o problema. Primeiro, o navegador analisa cabeçalhos HTTP, portanto, este é o lugar perfeito para apontar para o pré-carregamento de um recurso que você definitivamente precisará mais tarde.

Por padrão, a Internet está lenta


Vamos ver o que acontece se você não usar a pré-carga. O navegador só pode começar a carregar recursos depois de descobrir que precisa deles. É mais provável que isso ocorra para recursos que estão em HTML durante a análise inicial do documento (por exemplo, <script> , <link rel=stylesheet> e <img> ).

Os recursos detectados após a construção da árvore de renderização são baixados mais lentamente (este é o local em que a página fica mais lenta devido ao carregamento da fonte, porque para entender isso, primeiro você precisa carregar a folha de estilo, analisá-la, criar o modelo de objeto CSS e, em seguida, a árvore de renderização).

Ainda mais devagar estão carregando recursos que são adicionados ao documento usando carregadores JavaScript acionados por eventos como DOMContentLoaded . Se você juntar tudo, obteremos uma cascata não otimizada e sem sentido. Na maioria das vezes, o canal está ocioso e os recursos são carregados antes do necessário ou tarde demais:



O link rel = preload ajuda muito


Nos últimos anos, a situação melhorou graças ao Link rel = preload . Por exemplo:

 Link: </resources/fonts/myfont.woff>; rel=preload; as=font; crossorigin Link: </resources/css/something.css>; rel=preload; as=style Link: </resources/js/main.js>; rel=preload; as=script 

Graças a essas diretivas, o navegador pode começar a carregar recursos imediatamente após receber os cabeçalhos e antes de iniciar a análise do corpo HTML:



Essa é uma melhoria significativa, especialmente para páginas grandes e recursos críticos que, de outra forma, seriam descobertos tarde. Especialmente para fontes, mas qualquer coisa pode se tornar um recurso crítico, como o arquivo de dados necessário para carregar um aplicativo JavaScript.

No entanto, podemos fazer mais. Afinal, o navegador não faz nada entre o momento em que termina o envio da solicitação e quando recebe os primeiros bytes da resposta (o grande fragmento verde na solicitação inicial é maior).

Usamos o tempo do "pensamento do servidor" com a ajuda de "dicas iniciais"


Por outro lado, o servidor está realmente ocupado. Ele gera uma resposta e determina se é bem-sucedido ou não. Depois de acessar o banco de dados, chamadas de API, autenticação etc. o servidor pode decidir que o erro 404 é a resposta correta.

Às vezes, o tempo de meditação do servidor é menor que a latência da rede. Às vezes substancialmente mais. Mas é importante entender que eles não se sobrepõem. Enquanto o servidor está pensando, não estamos enviando dados para o cliente.

Mas é interessante que, mesmo antes de gerar a resposta, você já conheça alguns estilos e fontes que precisam ser baixados para exibir a página. Afinal, as páginas de erro geralmente usam a mesma identidade corporativa e design que as páginas comuns. Seria ótimo enviar esses Link: rel=preload antes que o servidor funcione . É por isso que o padrão Early Hints , concebido no RFC8297 pelo HTTP Working Group, foi cunhado por Fastly, meu colega Kazuho Oku. Avalie a mágica de várias barras de status em uma resposta :

 HTTP/1.1 103 Early Hints Link: <some-font-face.woff2>; rel="preload"; as="font"; crossorigin Link: <main-styles.css>; rel="preload"; as="style" HTTP/1.1 404 Not Found Date: Fri, 26 May 2017 10:02:11 GMT Content-Length: 1234 Content-Type: text/html; charset=utf-8 Link: <some-font-face.woff2>; rel="preload"; as="font"; crossorigin Link: <main-styles.css>; rel="preload"; as="style" 

O servidor pode gravar o primeiro código de resposta "informativo" assim que receber uma solicitação e enviá-lo para a rede. Então ele lidará com a definição de uma reação real e sua geração. Enquanto isso, no navegador, você pode começar a pré-carregar muito mais cedo:



Obviamente, isso exigirá certas alterações na operação de navegadores, servidores e CDNs, e os desenvolvedores de alguns navegadores expressaram reservas sobre as dificuldades de implementação. Portanto, ainda não está claro quando esses cabeçalhos podem ser colocados em operação. Você pode acompanhar o progresso em rastreadores públicos para Chrome e Firefox .

Esperamos que, no final, você consiga emitir cabeçalhos do Early Hints diretamente do Fastly, ainda enviando solicitações de maneira padrão. Ainda não decidimos como definir a interface via VCL, então, deixe-me saber se você tem algum desejo sobre este assunto!

Mas e quanto ao HTTP / 2 Server Push?


Com o HTTP / 2, existe uma nova tecnologia chamada Server Push que parece resolver o mesmo problema que Link rel = preload na resposta das Dicas iniciais. Embora realmente funcione (e você possa gerar rapidamente envio personalizado a partir de servidores de borda no Fastly), existem diferenças significativas em vários pontos:

  • O servidor não sabe sobre a disponibilidade de um recurso no cliente; portanto, ele geralmente o envia desnecessariamente. Devido ao buffer e à latência da rede, o cliente geralmente não pode cancelar o envio antes de receber todo o conteúdo. (Embora exista uma possível solução para esse problema, na forma do cabeçalho do Cache Digest proposto, no qual Kazuho está trabalhando com Joam Weiss, da Akamai).
  • Os recursos transmitidos estão vinculados à conexão, portanto, é fácil iniciar um recurso que o cliente não usa, pois está tentando obtê-lo por outra conexão. Os clientes podem precisar usar uma conexão diferente porque o recurso está em uma fonte diferente com um certificado TLS diferente ou porque é recuperado em um modo de credencial diferente.
  • O H2 Push não é implementado de maneira muito consistente em diferentes navegadores. Portanto, é difícil prever se funcionará ou não no seu caso específico.

De uma maneira ou de outra, o Early Hints e o Server Push oferecem vantagens e desvantagens. As dicas iniciais fornecem um uso mais eficiente da rede em troca de trocas de pacotes adicionais. Se você espera uma pequena latência de rede e muito tempo para pensar no servidor, o Early Hints é a solução certa.

No entanto, esse nem sempre é o caso. Vamos ser otimistas e imaginar que as pessoas em breve se estabelecerão em Marte. Eles navegam na web com um atraso de 20 a 45 minutos para cada troca de pacotes; portanto, a troca adicional é extremamente dolorosa e o tempo do servidor é insignificante em comparação a ela. O Server Push vence facilmente aqui. Mas se olharmos para as páginas da Web em Marte, é mais provável que baixemos algum tipo de pacote de dados, algo como pacotes da Web agora oferecidos e trocas assinadas .

Bônus Extra: Solicitação Mais Rápida


Embora o Early Hints deva ser usado principalmente no navegador, há um benefício potencial interessante para a CDN. Quando Fastly recebe muitas solicitações para o mesmo recurso, geralmente enviamos apenas uma delas para a fonte e colocamos o restante na fila de espera. Esse processo é conhecido como recolhimento de solicitação . Se a resposta da origem incluir Cache-Control: private , você deverá remover todas as solicitações da fila e enviá-las separadamente para a fonte, porque não podemos usar uma resposta para atender a várias solicitações.

Não podemos tomar uma decisão até que uma resposta seja recebida para a primeira solicitação, mas, no caso do suporte ao Early Hints, se o servidor retornou uma resposta do Early Hints com o cabeçalho Cache-Control, saberemos muito mais cedo que a fila não pode ser recolhida em uma única solicitação, mas, em vez disso, encaminhe imediatamente todas as solicitações da fila para a origem.

Solicite conteúdo menos crítico com dicas de prioridade


As dicas iniciais são uma ótima maneira de acessar alguns dos objetos mais valiosos da fila (cascata): quando a rede está ociosa, o usuário espera, há apenas uma solicitação no caminho e não há nada na tela. Mas assim que o HTML é carregado e a página é analisada, o número de recursos que precisam ser carregados aumenta drasticamente. Agora é importante não carregar recursos o mais rápido possível, mas carregá-los na ordem correta. Os navegadores usam uma variedade surpreendentemente complexa de heurísticas para determinar independentemente a prioridade do download, mas se você quiser redefini-las, no futuro isso poderá ser feito com a ajuda de dicas de prioridade:

 <script src="main.js" async importance="high"></script> <script src="non-critical-1.js" async importance="low"></script> 

Com esse novo atributo de importância, os desenvolvedores podem controlar a ordem de carregamento de recursos em caso de concorrência pela rede. Talvez os recursos de baixa prioridade possam ser adiados até que o processador e a rede estejam livres, ou dependendo do tipo de dispositivo.

Isso pode ser usado?


Nem pistas iniciais nem pistas prioritárias se tornaram o padrão ainda. Recentemente, o H2O, o servidor HTTP / 2 usado e suportado pela Fastly, começou a usar as Dicas Antigas (consulte PR 1727 e 1767 ), e existe a intenção de implementar Dicas de Prioridade no Chrome , além de rastrear ativamente as respostas 1xx. Ao mesmo tempo, não há mal nenhum em começar a enviar dicas precoces agora - e se você quiser se antecipar à tendência, vá em frente!

Source: https://habr.com/ru/post/pt421059/


All Articles