Como desenvolver o ecossistema de framework da Web

O Chrome está colaborando com frameworks de código aberto para melhorar a Web

O Chrome é um colaborador ativo do ecossistema de frameworks da Web, e nossa palestra no Chrome Dev Summit 2019 abordou o que fizemos no ano passado.

Leia a seguir um resumo estendido da palestra com mais detalhes e recursos.

Como podemos melhorar a Web?

O objetivo de todos na equipe do Chrome é melhorar a Web. Trabalhamos para aprimorar as APIs do navegador e o V8, o mecanismo principal de JavaScript e WebAssembly que alimenta o Chrome, para que os desenvolvedores tenham recursos que os ajudem a criar ótimas páginas da Web. Também tentamos melhorar os sites que já estão em produção hoje, contribuindo para ferramentas de código aberto de várias maneiras.

A maioria dos desenvolvedores da Web confia em ferramentas de código aberto sempre que possível e prefere não criar uma infraestrutura totalmente personalizada. Os frameworks JavaScript do lado do cliente e as bibliotecas de interface do usuário representam uma parte crescente do uso de código aberto. Os dados sobre os três frameworks e bibliotecas do lado do cliente mais populares, React, Angular, e Vue, mostram que:

  • 72% dos participantes da primeira pesquisa anual de desenvolvedores e designers da Web do MDN usam pelo menos um desses frameworks e bibliotecas.
  • Mais de 320.000 sites nos 5 milhões de URLs principais analisados pelo HTTP Archive usam pelo menos um desses frameworks e bibliotecas.
  • Quando agrupados por tempo gasto, 30 dos 100 URLs principais usam pelo menos um desses frameworks e bibliotecas. (A pesquisa foi feita com dados internos.)

Isso significa que melhores ferramentas de código aberto podem resultar diretamente em uma Web melhor e, por isso, os engenheiros do Chrome começaram a trabalhar diretamente com autores externos de frameworks e bibliotecas.

Contribuições para frameworks da Web

Os frameworks usados com frequência para criar e estruturar páginas da Web se enquadram em duas categorias:

  • Frameworks de interface (ou bibliotecas), como Preact, React ou Vue, que fornecem controle sobre a camada de visualização de um aplicativo (por exemplo, usando um modelo de componente).
  • Frameworks da Web, como Next.js, Nuxt.js e Gatsby, que fornecem um sistema completo com recursos integrados, como a renderização do lado do servidor. Esses frameworks geralmente aproveitam um framework ou biblioteca de interface para a camada de visualização.

Um espectro de frameworks e bibliotecas de UI versus frameworks da Web

Os desenvolvedores podem optar por não usar frameworks, mas, ao juntar uma biblioteca de camadas de visualização, um roteador, um sistema de estilo, um renderizador de servidor e assim por diante, eles geralmente acabam criando o próprio tipo de framework. Embora sejam opinativos, os frameworks da Web cuidam de muitas dessas preocupações por padrão.

O restante desta postagem destaca muitas melhorias que foram lançadas recentemente em diferentes frameworks e ferramentas, incluindo contribuições da equipe do Chrome.

Angular

A equipe do Angular lançou várias melhorias na versão 8 do framework:

Gráfico mostrando a redução do tamanho do pacote de angular.io com e sem builds diferenciais
Redução do tamanho do pacote para angular.io com builds diferenciais (da versão 8 do Angular)
  • Suporte à sintaxe de importação dinâmica padrão para rotas de carregamento lento.
  • Suporte a Web Workers para executar operações em uma linha de execução em segundo plano separada da linha de execução principal.
  • O Ivy, o novo mecanismo de renderização do Angular que oferece melhor desempenho de recompilação e uma redução nos tamanhos dos pacotes, está disponível no modo de visualização para projetos atuais.

Saiba mais sobre essas melhorias na página "Versão 8 do Angular" e a equipe do Chrome espera trabalhar em colaboração com eles no próximo ano, à medida que mais recursos forem lançados.

Next.js

Next.js é um framework da Web que usa o React como uma camada de visualização. Além de um modelo de componente de interface que muitos desenvolvedores esperam de um framework do lado do cliente, o Next.js oferece vários recursos padrão integrados:

  • Roteamento com divisão de código padrão
  • Compilação e agrupamento (usando Babel e webpack)
  • Renderização do lado do servidor
  • Mecanismos para buscar dados por página
  • Estilização encapsulada (com styled-jsx)

O Next.js é otimizado para reduzir os tamanhos dos pacotes, e a equipe do Chrome ajudou a identificar áreas em que poderíamos ajudar a melhorar ainda mais a performance. Saiba mais sobre cada um deles acessando as solicitações de comentários (RFCs, na sigla em inglês) e as solicitações de envio (PRs, na sigla em inglês):

  1. Uma estratégia de divisão de webpack aprimorada que emite pacotes mais granulares, reduzindo a quantidade de código duplicado buscado por várias rotas (RFC, PR).
  2. Carregamento diferencial com o padrão de módulo/sem módulo que pode reduzir a quantidade total de JavaScript em apps Next.js em até 20% sem alterações de código (RFC, PR).
  3. Melhoria no rastreamento de métricas de performance que utiliza a API User Timing (PR).
Página inicial do Barnebys.com
Barnebys.com, um grande mecanismo de pesquisa de antiguidades e colecionáveis, teve uma redução de 23% no JavaScript total após ativar a divisão granular

Também estamos explorando outros recursos para melhorar a experiência do usuário e do desenvolvedor ao usar o Next.js, como:

  • Ativar o modo simultâneo para desbloquear a hidratação progressiva ou parcial de componentes.
  • Um sistema de conformidade baseado em webpack que analisa todos os arquivos de origem e os recursos gerados para mostrar erros e avisos melhores (RFC).
Exemplo de um erro de build de conformidade no Next.js
Um exemplo de erro de build de conformidade no Next.js (protótipo)

Nuxt.js

Nuxt.js é um framework da Web que combina o Vue.js com diferentes bibliotecas para fornecer uma configuração opinativa. Semelhante ao Next.js, ele inclui muitos recursos prontos para uso:

  • Roteamento com divisão de código padrão
  • Compilação e agrupamento (usando Babel e webpack)
  • Renderização do lado do servidor
  • Busca assíncrona de dados para cada página
  • Repositório de dados padrão (Vuex)

Além de trabalhar diretamente na melhoria da performance de diferentes ferramentas, expandimos o fundo de frameworks para oferecer suporte financeiro a mais frameworks e bibliotecas de código aberto. Com nosso suporte recente ao Nuxt.js, alguns recursos serão lançados em breve, incluindo renderização do servidor e otimizações de imagem mais inteligentes.

Babel

Também fizemos progressos na melhoria da performance de uma ferramenta subjacente importante em quase todos os frameworks mencionados: o Babel.

O Babel compila códigos que contêm uma sintaxe mais recente em códigos que diferentes navegadores podem entender. Tornou-se comum usar @babel/preset-env para segmentar navegadores modernos em que diferentes destinos de navegador podem ser especificados para fornecer polyfilling suficiente para todos os ambientes escolhidos. Uma maneira de especificar os destinos é usar <script type="module"> para segmentar todos os navegadores que oferecem suporte a módulos ES.

Para otimizar esse caso, lançamos uma nova predefinição: @babel/preset-modules. Em vez de converter a sintaxe moderna em sintaxe mais antiga para evitar bugs do navegador, preset-modules corrige cada bug específico transformando-o na sintaxe moderna não corrompida mais próxima possível. Isso resulta em um código moderno que pode ser entregue quase sem modificações à maioria dos navegadores.

Um novo preset do Babel para oferecer um polyfill melhor para navegadores.

Os desenvolvedores que já usam preset-env também se beneficiarão dessas otimizações sem precisar fazer nada, já que elas também serão incorporadas ao preset-env em breve.

A seguir

Trabalhar em colaboração com frameworks e bibliotecas de código aberto para oferecer melhores experiências ajuda a equipe do Chrome a perceber o que é fundamentalmente importante para usuários e desenvolvedores.

Se você trabalha em um framework da Web, biblioteca de interface ou qualquer forma de ferramenta da Web (agrupador, compilador, linter), inscreva-se no fundo de frameworks!