Aplicativo de página única

Um aplicativo de página única (do inglês "single-page application", abreviado SPA) é uma aplicação web ou site que consiste de uma única página web com o objetivo de fornecer uma experiência do usuário similar à de um aplicativo desktop. Em um SPA, todo o código necessário - HTML, JavaScript, e CSS – ou é obtido com um único carregamento de página, ou os recursos apropriados são carregados dinamicamente e adicionados à página conforme necessário, geralmente em resposta a ações do usuário. A página não é recarregada em qualquer momento do processo, tampouco ocorre a transferência de controle para outra página, embora a URL no navegador ou a API de história do HTML5 possam ser usadas para fornecer a percepção e navegabilidade de páginas separadas ao aplicativo. Interação com aplicativos de página única muitas vezes envolve comunicação dinâmica com o servidor web por trás dos bastidores.

Técnicas

Existem diversas técnicas que permitem o navegador manter uma única página mesmo quando o site/aplicativo requer atualização de dados vindo da comunicação com o servidor.

Frameworks JavaScript para aplicações web, como o React e o Vue, geralmente aprimoram recursos disponíveis por meio de tecnologias web nativas, como roteamento, desenvolvimento baseado em componentes e gerenciamento de estado, capacidade de aumentar a produtividade do desenvolvedor, padrões estruturados para aplicações de grande escala, simplificar o tratamento de casos extremos e, ferramentas para otimização de desempenho como camadas de abstração, renderização simultânea, tree-shaking e, hidratação seletiva. Embora os padrões web nativos tenham avançado significativamente, incluindo Web Components, API JavaScript modernas como Fetch e ES Modules, e recursos do navegador como Shadow DOM.

Embora esses avanços melhorem a eficiência da renderização e o gerenciamento de recursos, seus benefícios dependem da aplicação específica e do contexto de implementação. Frameworks leves, como Svelte e Preact, adotam abordagens arquitetônicas diferentes; o Svelte elimina completamente o DOM virtual, optando por compilar componentes em código JavaScript eficiente, enquanto o Preact oferece uma alternativa minimalista e compatível com o React. A escolha da estrutura depende dos requisitos de uma aplicação, incluindo a experiência da equipe, metas de desempenho e prioridades de desenvolvimento.

Uma categoria mais recente de frameworks web, incluindo enhance.dev, Astro e Fresh, aproveita padrões web nativos enquanto minimiza abstrações e o uso de ferramentas de desenvolvimento. Essas soluções enfatizam o aprimoramento progressivo, a renderização no servidor e a otimização de desempenho, por padrão o Astro renderiza HTML estático, enquanto apenas as partes interativas são atualizadas, ja o Fresh se concentra na renderização do lado do servidor com sobrecarga de tempo de execução zero. O Enhance.dev prioriza padrões de aprimoramento progressivo usando Web Components. Embora essas ferramentas reduzam a dependência do JavaScript do lado do cliente, transferindo a lógica para o tempo de compilação ou para a execução no servidor, elas ainda usam JavaScript quando necessário para a interatividade. Essa abordagem os torna particularmente adequados para aplicações críticas de desempenho e focadas em conteúdo.

Meteor.js é um framework JavaScript full-stack (cliente-servidor) projetado exclusivamente para SPAs, que apresenta vinculação de dados mais simples do que Angular, Ember e, ReactJS, usando o Protocolo de Dados Distribuídos, e um padrão de publicação-assinatura para propagar automaticamente as alterações de dados aos clientes em tempo real, sem exigir que o desenvolvedor escreva qualquer código de sincronização. A reatividade de pilha completa garante que todas as camadas, do banco de dados aos modelos, se atualizem automaticamente quando necessário. Pacotes de ecossistema como Server-Side Rendering abordam o problema da otimização de mecanismos de busca.

O Ajax foi uma técnica popular em 2006, que usa solicitações assíncronas a um servidor para dados XML ou JSON, como com o XMLHttpRequest do JavaScript, objeto ActiveX, ou o moderno fetch() (2017). Ao contrário da abordagem declarativa da maioria dos frameworks SPA, o Ajax e sites usam diretamente JavaScript ou uma biblioteca JavaScript como o jQuery para manipular o DOM e editar elementos HTML, que oferece uma sintaxe mais simples e padroniza o comportamento do Ajax em diferentes navegadores, que historicamente tinham comportamentos variados.

O WebSocket é uma tecnologia de comunicação cliente-servidor bidirecional em tempo real integrada a especificação HTML, conexão única full-duplex sem novas requisições e handshakes e cabeçalhos HTTP, assim na comunicação em tempo real seu uso é superior ao Ajax em termos de desempenho, mantendo a latência baixa mesmo com altos volumes de mensagens. Usar WebSocket é a opção padrão da comunicação bidirecional, como Chat, transmissão ao vivo, um agente de IA; quando o cliente envia dados com a mesma frequência que o servidor.

Eventos enviados pelo servidor (do inglês server-sent events, SSEs) é uma técnica pela qual os servidores podem iniciar a transmissão de dados para os navegadores dos clientes usando a API EventSource; após o estabelecimento da conexão inicial, o fluxo de eventos permanece aberto até ser fechado pelo cliente, e os SSEs são enviados por meio do HTTP tradicional e possuem uma variedade de recursos que os WebSockets não possuem por design, como reconexão automática, IDs de eventos e a capacidade de enviar eventos arbitrários.

História

As origens do termo aplicação de página única não são claras, embora o conceito seja discutido desde 2003 por evangelistas de tecnologia da Netscape e, embora Stuart Morris, um estudante de programação da Universidade de Cardiff (País de Gales), escreveu no site slashdotslash.com os mesmos objetivos e funções em abril de 2002, e mais tarde, no mesmo ano, Lucas Birdeau, Kevin Hakman, Michael Peachey e Clifford Yeh descreveram uma implementação de aplicação de página única na patente americana US-8136109B1. As versões anteriores eram chamadas de aplicações web avançadas/rica.

Referências

  1. ↑ Flanagan, David, "JavaScript - The Definitive Guide", 5th ed., O'Reilly, Sebastopol, CA, 2006, p.497
  2. ↑ «Fixing the Back Button: SPA Behavior using Location Hash». Falafel Software Blog (em inglês). Consultado em 18 de janeiro de 2016. Arquivado do original em 13 de fevereiro de 2016
  3. ↑ Uzayr, Sufyan bin; Cloud, Nicholas; Ambler, Tim (novembro 2019). JavaScript Frameworks for Modern Web Development: The Essential Frameworks, Libraries, and Tools to Learn Right Now. [S.l.]: Apress. ISBN 978-1484249949
  4. ↑ Rojas, Carlos (13 novembro 2020). Building Native Web Components: Front-End Development with Polymer and Vue.js. [S.l.]: Apress. ISBN 978-1484259047
  5. ↑ Hands-On JavaScript High Performance: Build faster web apps using Node.js, Svelte.js, and WebAssembly. [S.l.: s.n.] ISBN 978-1838821098
  6. ↑ Uzayr, Sufyan bin; Cloud, Nicholas; Ambler, Tim (novembro 2019). JavaScript Frameworks for Modern Web Development: The Essential Frameworks, Libraries, and Tools to Learn Right Now. [S.l.]: Apress. ISBN 978-1484249949
  7. ↑ Rojas, Carlos (13 novembro 2020). Building Native Web Components: Front-End Development with Polymer and Vue.js. [S.l.]: Apress. ISBN 978-1484259047
  8. ↑ Hands-On JavaScript High Performance: Build faster web apps using Node.js, Svelte.js, and WebAssembly. [S.l.: s.n.] ISBN 978-1838821098
  9. ↑ «Enhance». GitHub
  10. ↑ «Astro framework». GitHub
  11. ↑ «Fresh». GitHub
  12. ↑ Uzayr, Sufyan bin; Cloud, Nicholas; Ambler, Tim (novembro 2019). JavaScript Frameworks for Modern Web Development: The Essential Frameworks, Libraries, and Tools to Learn Right Now. [S.l.]: Apress. ISBN 978-1484249949
  13. ↑ Rojas, Carlos (13 novembro 2020). Building Native Web Components: Front-End Development with Polymer and Vue.js. [S.l.]: Apress. ISBN 978-1484259047
  14. ↑ Hands-On JavaScript High Performance: Build faster web apps using Node.js, Svelte.js, and WebAssembly. [S.l.: s.n.] ISBN 978-1838821098
  15. ↑ «Meteor Blaze». GitHub. 6 maio 2022
  16. ↑ Introducing DDP, March 21, 2012
  17. ↑ Ćwirko, Julian (7 de setembro de 2017). «Server-side rendering (SSR) in Meteor». Medium (em inglês). Consultado em 10 de junho de 2026. Cópia arquivada em 4 de outubro de 2019
  18. ↑ «Server Side Rendering for Meteor». Consultado em 31 de janeiro de 2015. Arquivado do original em 20 de março de 2015
  19. ↑ Flanagan, David, "JavaScript - The Definitive Guide", 5th ed., O'Reilly, Sebastopol, CA, 2006, p.497
  20. 1 2 «Real-Time Monitoring using AJAX and WebSockets». Computer.org. Consultado em 1 de junho de 2016
  21. 1 2 3 4 Ably.Sep 24, Madeleine QuinnHead of AEO at; Read, 2026·14 Min. «WebSockets vs Server-Sent Events: how to choose the right one for production». Ably Realtime. Consultado em 15 de outubro de 2026
  22. ↑ «Server-Sent Events». W3C. 17 de julho de 2013
  23. ↑ «Inner-Browsing: Extending Web Browsing the Navigation Paradigm». Consultado em 16 de maio de 2003. Arquivado do original em 10 de agosto de 2003
  24. ↑ «Slashdotslash.com: A self contained website using DHTML». Consultado em 6 de julho de 2012
  25. ↑ «US patent 8,136,109: delivery of data and formatting information to allow client-side manipulation» [Patente US 8,136,109, fornecimento de dados e informações de formatação para permitir a manipulação no lado do cliente]