Aplicativo de página única: vantagens e desvantagens [fechado]


203

Eu li sobre SPA e vantagens. Acho a maioria deles não convincente. Existem 3 vantagens que despertam minhas dúvidas.

Pergunta: Você pode atuar como advogado do SPA e provar que estou errado sobre as três primeiras declarações?

                              === ADVANTAGES ===

1. O SPA é extremamente bom para sites muito responsivos:

É difícil implementar a renderização no servidor para todos os estados intermediários - os estados de exibição pequena não são bem mapeados para URLs.

Os aplicativos de página única são diferenciados por sua capacidade de redesenhar qualquer parte da interface do usuário sem exigir uma ida e volta do servidor para recuperar o HTML. Isso é conseguido separando os dados da apresentação dos dados, tendo uma camada de modelo que lida com dados e uma camada de visualização que lê dos modelos.

O que há de errado em manter uma camada de modelo para não-SPA? O SPA é a única arquitetura compatível com o MVC no lado do cliente?

2. Com o SPA, não precisamos usar consultas extras para o servidor para baixar páginas.

Hah, e quantas páginas o usuário pode baixar durante a visita ao seu site? Dois três? Em vez disso, aparecem outros problemas de segurança e você precisa separar sua página de login, página de administração etc. em páginas separadas. Por sua vez, entra em conflito com a arquitetura do SPA.

3. pode haver outras vantagens? Não ouça mais nada ..

                            === DISADVANTAGES ===
  1. O cliente deve ativar o javascript.
  2. Apenas um ponto de entrada para o site.
  3. Segurança.

PS : Trabalhei em projetos de SPA e não-SPA. E estou fazendo essas perguntas porque preciso aprofundar meu entendimento. Não há como prejudicar os apoiadores do SPA. Não me peça para ler um pouco mais sobre o SPA. Eu só quero ouvir suas considerações sobre isso.


1
2. e 3. não são problemas.
Wiktor Zychla

1
Sugiro que, em vez de apenas ler sobre SPAs, você possa passar algum tempo brincando com uma estrutura real como extjs. O tempo até lá será recompensado e você poderá responder às suas próprias perguntas.
Wiktor Zychla

3
@WiktorZychla Eu trabalho em um projeto de SPA. Eu uso o JQuery + Backbone. Eu também escrevi um site JSP. Não consigo responder a essas perguntas. Você pode?
VB_

3
@VolodymyrBakhmatiuk: isso não importa, o que o usuário pode comprometer é a GUI, não os dados, porque os dados são protegidos no lado do servidor.
Wiktor Zychla

4
E se esta pergunta for baseada em opiniões? Muitas vezes me perguntei por que e quando devo escrever um SPA? Seria útil se SO permitido Favor n Contras perguntas bem
Anurag Awasthi

Respostas:


144

Vejamos um dos sites de SPA mais populares, o GMail.

1. O SPA é extremamente bom para sites muito responsivos:

A renderização no servidor não é tão difícil quanto costumava ser com técnicas simples, como manter um #hash na URL ou, mais recentemente, em HTML5pushState . Com essa abordagem, o estado exato do aplicativo Web é incorporado no URL da página. Como no GMail, toda vez que você abre um e-mail, uma tag de hash especial é adicionada ao URL. Se copiado e colado em outra janela do navegador, é possível abrir exatamente o mesmo email (desde que eles possam se autenticar). Essa abordagem é mapeada diretamente para uma string de consulta mais tradicional, a diferença está apenas na execução. Com o HTML5 pushState (), você pode eliminar #hashe usar URLs completamente clássicos que podem ser resolvidos no servidor na primeira solicitação e carregados via ajax nas solicitações subsequentes.

2. Com o SPA, não precisamos usar consultas extras para o servidor para baixar páginas.

O número de páginas que o usuário baixa durante a visita ao meu site? realmente quantos e-mails alguns leem quando ele abre sua conta de e-mail. Eu li> 50 de uma só vez. agora a estrutura dos e-mails é quase a mesma. se você usar um esquema de renderização do lado do servidor, o servidor o renderizará em cada solicitação (caso típico). - preocupação de segurança - você deve / não deve manter páginas separadas para os administradores / login que dependam inteiramente da estrutura do seu site, como paytm.com, por exemplo, também criar um site SPA não significa que você abra todos os pontos de extremidade para todos os usuários, quero dizer, uso autenticação de formulários no meu site de spa. - no provavelmente mais usado framework Angular JS do SPA, o desenvolvedor pode carregar todo o templo de html do site, para que isso possa ser feito dependendo do nível de autenticação dos usuários. pré-carregamento de html para todos os tipos de autenticação isn '

3. Pode haver outras vantagens? Não ouça mais nada ..

  • hoje em dia, você pode assumir com segurança que o cliente terá navegadores habilitados para javascript.
  • apenas um ponto de entrada do site. Como mencionei anteriormente, a manutenção do estado é possível, você pode ter qualquer número de pontos de entrada que desejar, mas deve ter um com certeza.
  • mesmo em um usuário de SPA, verifique apenas o que ele tem direitos adequados. você não precisa injetar tudo de uma vez. carregar modelos diff html e javascript assíncrono também é uma parte válida do SPA.

As vantagens que consigo pensar são:

  1. A renderização de html obviamente requer alguns recursos agora, todos os usuários que visitam seu site estão fazendo isso. agora, além de renderizar lógicas importantes, agora são feitas no lado do cliente, e não no lado do servidor.
  2. data e hora - eu apenas dou ao cliente a hora UTC em um formato predefinido e nem me importo com os fusos horários em que o javascript lida com isso. essa é uma grande vantagem para onde eu tinha que adivinhar fusos horários com base no local derivado do IP dos usuários.
  3. para mim, o estado é mais bem mantido em um SPA, porque depois de definir uma variável, você sabe que ela estará lá. isso dá a sensação de desenvolver um aplicativo em vez de uma página da web. isso geralmente ajuda muito na criação de sites como foodpanda, flipkart, amazon. porque se você não estiver usando o estado do lado do cliente, estará usando sessões caras.
  4. os sites certamente são extremamente responsivos - darei um exemplo extremo para esta tentativa de fazer uma calculadora em um site que não seja do SPA (eu sei que é estranho).

Atualizações de comentários

Parece que ninguém mencionou soquetes e pesquisas longas. Se você sair de outro cliente, por exemplo, aplicativo móvel, seu navegador também deverá sair. Se você não usa o SPA, é necessário recriar a conexão do soquete sempre que houver um redirecionamento. Isso também deve funcionar com todas as atualizações de dados, como notificações, atualização de perfil, etc.

Uma perspectiva alternativa: além do seu site, seu projeto envolverá um aplicativo móvel nativo? Se sim, é provável que você esteja alimentando dados brutos para esse aplicativo nativo a partir de um servidor (ou seja, JSON) e processando o lado do cliente para processá-lo, correto? Portanto, com essa afirmação, você JÁ está fazendo um modelo de renderização no lado do cliente. Agora a pergunta é: por que você não deve usar o mesmo modelo para a versão do site do seu projeto? Uma espécie de acéfalo. A questão é se você deseja renderizar páginas do lado do servidor apenas para benefícios de SEO e conveniência de URLs compartilháveis ​​/ que podem ser marcados como favoritos


4
Bom para você para fazer esta comunidade um Wiki resposta :) Também estes são grandes pontos
Jason Sperske

@Parv Sharma explica por favor mais amplamente por que manter o estado é mais comphortable com SPA?
VB_

4
Você não pode indexar facilmente as páginas para otimização de SEO com o SPA.
Ankit_Shah55

2
@ Ankit_Shah55 Isso pode não ser mais verdade (pelo menos para o google, que possui a maior parte do mercado de mecanismos de pesquisa). Consulte "Descontinuação do nosso esquema de rastreamento AJAX" do Google. Entendo que você não precisa mais fazer nada especial para o Google indexar seu SPA. Eu acho que você precisará garantir o suporte ao pushstate, no entanto, porque eu não acho que os fragmentos de hash dos índices do Google.
Kevin Wheeler

3
Parece que ninguém mencionou soquetes e pesquisas longas. Se você sair de outro cliente, por exemplo, aplicativo móvel, seu navegador também deverá sair. Se você não usa o SPA, é necessário recriar a conexão do soquete sempre que houver um redirecionamento. Isso também deve trabalhar com todas as atualizações em dados, como notificações, actualização do perfil etc.
tsuz

66

Sou pragmático, então tentarei analisar isso em termos de custos e benefícios.

Observe que, por qualquer desvantagem que eu der, reconheço que são solucionáveis. É por isso que não vejo nada em preto e branco, mas custos e benefícios.

Vantagens

  • Rastreamento de estado mais fácil - não há necessidade de usar cookies, envio de formulários, armazenamento local, armazenamento de sessão etc. para lembrar o estado entre duas cargas de página.
  • O conteúdo da placa da caldeira que está em todas as páginas (cabeçalho, rodapé, logotipo, faixa de direitos autorais etc.) é carregado apenas uma vez por sessão típica do navegador.
  • Não há latência de sobrecarga na alternância de "páginas".

Desvantagens

  • Monitoramento de desempenho - mãos atadas: a maioria das soluções de monitoramento de desempenho no nível do navegador que eu vi focam apenas no tempo de carregamento da página, como tempo até o primeiro byte, tempo para criar o DOM, ida e volta da rede para o HTML, evento onload etc. Atualizando a página pós-carregamento via AJAX não seria medido. Existem soluções que permitem instrumentar seu código para registrar medidas explícitas, como ao clicar em um link, iniciar um cronômetro e encerrar um cronômetro após renderizar os resultados do AJAX e enviar esse feedback. A New Relic, por exemplo, suporta essa funcionalidade. Ao usar um SPA, você se vinculou a apenas algumas ferramentas possíveis.
  • Teste de segurança / penetração - de mãos dadas: as verificações de segurança automatizadas podem ter dificuldade em descobrir links quando toda a página é construída dinamicamente por uma estrutura de SPA. Provavelmente existem soluções para isso, mas, novamente, você se limitou.
  • Agrupamento: é fácil entrar em uma situação quando você está baixando todo o código necessário para todo o site no carregamento inicial da página, o que pode ter um desempenho terrível para conexões de baixa largura de banda. Você pode agrupar seus arquivos JavaScript e CSS para tentar carregar pedaços mais naturais à medida que avança, mas agora você precisa manter esse mapeamento e observar se arquivos indesejados são atraídos por dependências não realizadas (aconteceu comigo). Mais uma vez, solucionável, mas com um custo.
  • Refatoração do Big Bang: se você deseja fazer uma grande mudança na arquitetura, como, por exemplo, mudar de uma estrutura para outra, para minimizar os riscos, é desejável fazer alterações incrementais. Ou seja, comece a usar o novo, migre de alguma forma, como por página, por recurso, etc. e depois largue o antigo. Com o aplicativo tradicional de várias páginas, você pode alternar uma página de Angular para React e depois outra página no próximo sprint. Com um SPA, é tudo ou nada. Se você deseja alterar, é necessário alterar o aplicativo inteiro de uma só vez.
  • Complexidade da navegação: existem ferramentas para ajudar a manter o contexto de navegação nos SPAs, como history.js, Angular 2, a maioria dos quais se baseia na estrutura de URL (#) ou na API de histórico mais recente. Se cada página fosse uma página separada, você não precisa disso.
  • Complexidade de descobrir código: pensamos naturalmente nos sites como páginas. Um aplicativo de várias páginas geralmente divide o código por página, o que ajuda na manutenção.

Novamente, reconheço que todos esses problemas são solucionáveis, a algum custo. Mas chega um momento em que você passa todo o seu tempo resolvendo problemas que você poderia ter evitado em primeiro lugar. Ele volta aos benefícios e à importância que eles têm para você.


2
Eu acho que essa resposta fornece um feedback muito válida a partir de alguém que realmente tem construído um grande sistema complexo e experimentou as vítimas a longo prazo SPA traz (ou se parece com isso)
DanielCuadra

4
O que recebo desta resposta é: evite o SPA se você estiver fazendo algo remotamente sério.
IvanP

Acho que você nos deu uma visão geral muito útil, em vez de apenas responder. Realmente pragmático.
Hos Mercury

3
Concordo. O SPA parecia ótimo quando fizemos a prova de conceito. Agora, três anos depois, vimos todos os problemas mencionados nesta resposta e continuamos gastando muito tempo tentando resolvê-los. A mudança de estrutura não é mais uma opção e estamos presos a uma estrutura que basicamente interrompeu o desenvolvimento.
Qi Fan

1
Eu experimentei os últimos 4 pontos de desvantagem diretamente. Eu construí um aplicativo da Web LOC de 10K com Angular, Bootstrap e PHP como os principais players com cerca de 5K de código JS angular. Existem alguns recursos realmente interessantes do Angular, mas neste momento eu realmente gostaria de ter usado uma abordagem tradicional baseada em páginas e acho que isso teria acelerado significativamente o desenvolvimento do site.
Zack Macomber 29/08

41

Desvantagens

1. O cliente deve ativar o javascript. Sim, essa é uma clara desvantagem do SPA. No meu caso, sei que posso esperar que meus usuários tenham o JavaScript ativado. Se você não pode, não pode fazer um SPA, ponto final. É como tentar implantar um aplicativo .NET em uma máquina sem o .NET Framework instalado.

2. Apenas um ponto de entrada para o site. Eu resolvo esse problema usando o SammyJS . 2-3 dias de trabalho para configurar seu roteamento corretamente, e as pessoas poderão criar marcadores de link direto no seu aplicativo que funcionem corretamente. Seu servidor precisará expor apenas um terminal - o terminal "forneça o HTML + CSS + JS para este aplicativo" (pense nele como um local de download / atualização para um aplicativo pré-compilado) - e o JavaScript do cliente que você escrever manipular a entrada real no aplicativo.

3. segurança.Esse problema não é exclusivo dos SPAs; você precisa lidar com a segurança exatamente da mesma maneira quando tiver um aplicativo cliente-servidor "antigo" (o modelo HATEOAS de usar o Hypertext para vincular páginas). É só que o usuário está fazendo as solicitações em vez do seu JavaScript e que os resultados estão em HTML, em vez de JSON ou algum formato de dados. Em um aplicativo não-SPA, você deve proteger as páginas individuais no servidor, enquanto em um aplicativo SPA, você deve proteger os pontos de extremidade de dados. (E, se você não deseja que seu cliente tenha acesso a todo o código, também é necessário dividir o JavaScript para download em áreas separadas. Simplesmente vinculo isso ao meu sistema de roteamento baseado no SammyJS, para que o navegador apenas solicite coisas que o cliente sabe que deve ter acesso, com base em um carregamento inicial das funções do usuário,

Vantagens

  1. Uma grande vantagem arquitetural de um SPA (que raramente é mencionado) em muitos casos é a enorme redução na "chattiness" do seu aplicativo. Se você o projetar adequadamente para lidar com a maioria dos processos no cliente (o ponto todo, afinal), o número de solicitações ao servidor (leia "possibilidades de erros 503 que prejudicam sua experiência do usuário") será reduzido drasticamente. De fato, um SPA torna possível o processamento totalmente offline, o que é enorme em algumas situações.

  2. O desempenho é certamente melhor com a renderização do lado do cliente, se você fizer o que é certo, mas esse não é o motivo mais atraente para criar um SPA. (Afinal, as velocidades da rede estão melhorando.) Não defenda o SPA apenas com base nisso.

  3. A flexibilidade no design da interface do usuário talvez seja a outra grande vantagem que encontrei. Depois de definir minha API (com um SDK em JavaScript), pude reescrever completamente meu front-end sem impacto no servidor, além de alguns arquivos de recursos estáticos. Tente fazer isso com um aplicativo MVC tradicional! :) (Isso se torna valioso quando você tem que se preocupar com implementações ativas e consistência de versão da sua API.)

Portanto, se você precisar de processamento offline (ou pelo menos desejar que seus clientes possam sobreviver a interrupções ocasionais do servidor) - reduzindo drasticamente seus próprios custos de hardware - e você pode assumir JavaScript e navegadores modernos, precisará de um SPA. Em outros casos, é mais uma troca.


6
Outra vantagem é que um SPA pode ser salvo como marcador ("Adicionar à tela inicial") no iOS e abri-lo no modo de tela cheia (supondo que você tenha definido a metatag correta ), fazendo com que pareça um aplicativo nativo e não um página da web.
Strille

7
3. É tão fácil no aplicativo MVC tradicional. Se você opera com os mesmos dados, basta fazer alterações na parte V (visualização) do seu aplicativo. Isso geralmente é modelos, css e js.
28415 karantan

Uma versão SPA do SO pode ter links para perguntas individuais para compartilhar ou quais vantagens e desvantagens traria, por exemplo, em termos de SEO (pesquisa de perguntas anteriores em um mecanismo de pesquisa).
Selçuk

5
A maioria dos aplicativos de SPA que eu vi são mais faladores que os aplicativos do lado do servidor. Em vez de uma única solicitação para obter dados, você acaba com mais solicitações ao servidor por página.
Matthew Whited 4/16

29

Uma grande desvantagem do SPA - SEO. Somente recentemente o Google e o Bing começaram a indexar páginas baseadas no Ajax executando JavaScript durante o rastreamento e, em muitos casos, as páginas ainda estão sendo indexadas incorretamente.

Durante o desenvolvimento do SPA, você será forçado a lidar com problemas de SEO, provavelmente pós-renderizando todo o site e criando instantâneos de html estático para o uso do rastreador. Isso exigirá um investimento sólido em infraestruturas adequadas.

Atualização 19.06.16:

Desde que escrevi esta resposta há um tempo, ganho muito mais experiência com os aplicativos de página única (ou seja, o AngularJS 1.x) - então tenho mais informações para compartilhar.

Na minha opinião, a principal desvantagem dos aplicativos de SPA é o SEO, limitando-os apenas aos aplicativos de "painel". Além disso, você terá muito mais dificuldade com o cache, em comparação com as soluções clássicas. Por exemplo, no ASP.NET, o cache é extremamente fácil - basta ativar o OutputCaching e você é bom: a página HTML inteira será armazenada em cache de acordo com a URL (ou qualquer outro parâmetro). No entanto, no SPA, você precisará lidar com o armazenamento em cache (usando algumas soluções, como cache de segundo nível, cache de modelos, etc.).


É melhor o SEO ter o tráfego encaminhado para a página única x espalhado por algumas páginas?
SILENT

@SILENT - não tenho certeza, mas desde que todas as páginas no mesmo domínio, eu não acho que deveria haver uma diferença
Illidan

Eu não entendo o argumento de SEO. Você não pode simplesmente ter as mesmas rotas definidas no seu SPA e também o servidor, para que os bots de pesquisa possam rastrear seu site com facilidade e, ao mesmo tempo, as pessoas obtenham URLs diretos para o seu conteúdo. E assim, você pode ter dois conjuntos de modelos para manter, grande coisa. Você pode tentar usar o modelo universal, se for uma preocupação.
MarsAndBack

@MarsAndBack: Não tenho certeza de qual servidor você está falando. Se você quer dizer o sitemap - ele é inútil no caso do SPA: os mecanismos de pesquisa não executam JavaScript (pelo menos, esse era o estado das coisas há alguns anos) - eles apenas baixam e analisam HTML. Portanto, mesmo se você preparar o mapa do site - a página não será construída corretamente.
Illidan

12

Gostaria de defender que o SPA seja o melhor para aplicativos orientados a dados. O Gmail, é claro, trata de dados e, portanto, um bom candidato a um SPA.

Mas se sua página é principalmente para exibição, por exemplo, uma página de termos de serviço, um SPA é um exagero.

Eu acho que o ponto ideal é ter um site com uma mistura de páginas de estilo SPA e estática / MVC, dependendo da página em particular.

Por exemplo, em um site que estou construindo, o usuário acessa uma página de índice padrão do MVC. Mas quando eles acessam o aplicativo real, ele acessa o SPA. Outra vantagem disso é que o tempo de carregamento do SPA não está na página inicial, mas na página do aplicativo. O tempo de carregamento na página inicial pode ser uma distração para os usuários do site iniciantes.

Esse cenário é um pouco como usar o Flash. Após alguns anos de experiência, o número de sites apenas em Flash caiu para quase zero devido ao fator de carga. Mas como um componente de página, ele ainda está em uso.


1
depois de muitos anos de desenvolvimento web, é isso que posso confirmar. você deve misturar os aplicativos spa e mvc. você também não pode ter uma resposta. Primeiro, eu tive meu aplicativo inteiro como spa, e descobri que ele não está listado corretamente pelo Google. então mudei para o mpa e uso o spa apenas nas situações necessárias. O wordpress também não é spa e uma estrutura popular por boas razões.
Rudolf Schmidt

1
Esta é a minha abordagem também. Eu tenho o SPA como a principal área para meus usuários percorrerem rapidamente os resultados da pesquisa, seja em um mapa ou em uma lista dinâmica. Então, ao examinar os detalhes, eles são abertos como páginas padrão renderizadas pelo servidor. Minhas rotas funcionam tanto no SPA quanto como rotas de servidor de primeiro carregamento. Dupliquei o código do modelo e o código de rota, mas não me importo com isso, é um mal necessário.
MarsAndBack

8

Para empresas como google, amazon etc., cujos servidores estão funcionando com capacidade máxima no modo 24/7, reduzir o tráfego significa dinheiro real - menos hardware, menos energia, menos manutenção. Mudar o uso da CPU do servidor para o cliente compensa e os SPAs brilham. As vantagens sobrepeso desvantagens de longe. Portanto, o SPA ou não o SPA depende muito do caso de uso.

Apenas por mencionar outro caso de uso, provavelmente não tão óbvio (para desenvolvedores da Web), para SPAs: Atualmente, estou procurando uma maneira de implementar GUIs em sistemas embarcados e a arquitetura baseada em navegador parece atraente para mim. Tradicionalmente, não havia muitas possibilidades de UIs em sistemas embarcados - Java, Qt, wx, etc ou estruturas comerciais apropriadas. Alguns anos atrás, a Adobe tentou entrar no mercado com flash, mas parece não ter tanto sucesso.

Atualmente, como os "sistemas embarcados" são tão poderosos quanto os mainframes há alguns anos, uma interface do usuário baseada em navegador conectada à unidade de controle via REST é uma solução possível. A vantagem é que a enorme paleta de ferramentas para interface do usuário é gratuita. (por exemplo, Qt exige 20-30 $ por unidade vendida em taxas de royalties mais 3000-4000 $ por desenvolvedor)

Para essa arquitetura, o SPA oferece muitas vantagens - por exemplo, uma abordagem de desenvolvimento mais familiar para desenvolvedores de aplicativos de desktop, acesso reduzido ao servidor (geralmente na indústria automobilística, a interface do usuário e os problemas do sistema são hardware separado, onde a parte do sistema possui um sistema operacional RT).

Como o único cliente é o navegador interno, as desvantagens mencionadas, como disponibilidade de JS, log do lado do servidor e segurança, não contam mais.


1
A Amazon não está muito preocupada com a largura de banda ou a contagem de solicitações. Cada página tem cerca de 10 MB e mais de 200 solicitações.
Matthew Whited

3

2. Com o SPA, não precisamos usar consultas extras para o servidor para baixar páginas.

Ainda tenho que aprender muito, mas desde que comecei a aprender sobre o SPA, eu os amo.

Este ponto em particular pode fazer uma enorme diferença.

Em muitos aplicativos da Web que não são SPA, você verá que eles ainda irão recuperar e adicionar conteúdo às páginas que fazem solicitações de ajax. Então, acho que o SPA vai além, considerando: e se o conteúdo que será recuperado e exibido usando o ajax for a página inteira? e não apenas uma pequena parte de uma página?

Deixe-me apresentar um cenário. Considere que você tem 2 páginas:

  1. uma página com lista de produtos
  2. uma página para visualizar os detalhes de um produto específico

Considere que você está na página da lista. Então você clica em um produto para visualizar os detalhes. O aplicativo do lado do cliente acionará 2 solicitações de ajax:

  1. uma solicitação para obter um objeto json com os detalhes do produto
  2. uma solicitação para obter um modelo html no qual os detalhes do produto serão inseridos

Em seguida, o aplicativo do lado do cliente inserirá os dados no modelo html e os exibirá.

Depois, você volta para a lista (nenhuma solicitação é feita para isso!) E abre outro produto. Desta vez, haverá apenas uma solicitação de ajax para obter os detalhes do produto. O modelo html será o mesmo para que você não precise fazer o download novamente.

Você pode dizer que em um SPA não, quando você abre os detalhes do produto, faz apenas 1 solicitação e, nesse cenário, fizemos 2. Sim. Mas você obtém o ganho de uma perspectiva geral. Quando você navega por muitas páginas, o número de solicitações será menor. E os dados transferidos entre o lado do cliente e o servidor também serão mais baixos porque os modelos html serão reutilizados. Além disso, você não precisa baixar em todas as solicitações todos os arquivos css, imagens e javascript que estão presentes em todas as páginas.

Além disso, vamos considerar que a linguagem do lado do servidor é Java. Se você analisar as 2 solicitações que eu mencionei, 1 baixa dados (você não precisa carregar nenhum arquivo de visualização e chamar o mecanismo de renderização de visualização) e os outros downloads e modelo estático de html para que você possa ter um servidor da Web HTTP que possa recuperar diretamente sem precisar chamar o servidor de aplicativos Java, nenhum cálculo é feito!

Finalmente, as grandes empresas estão usando o SPA: Facebook, GMail, Amazon. Eles não jogam, eles têm os melhores engenheiros estudando tudo isso. Portanto, se você não vê as vantagens, pode confiar inicialmente nelas e esperar descobri-las no caminho.

Mas é importante usar bons padrões de design de SPA. Você pode usar uma estrutura como o AngularJS. Não tente implementar um SPA sem usar bons padrões de design, pois você pode acabar tendo uma bagunça.


1
O Facebook não é um SPA, na verdade, é um aplicativo no estilo MPA, eles estão usando o ReactJS aqui e ali para comentários, bate-papo etc. O Instagram é um bom exemplo para a página completa do SPA com o PWA ativado. O mesmo se aplica à Amazon, o YouTube ambos são aplicativos MPA.
Peter Húbek 13/10/1918

3

Desvantagens : Tecnicamente, o design e o desenvolvimento inicial do SPA são complexos e podem ser evitados. Outras razões para não usar este SPA podem ser:

  • a) Segurança: o aplicativo de página única é menos seguro em comparação com as páginas tradicionais devido ao script entre sites (XSS).
  • b) Vazamento de memória: o vazamento de memória no JavaScript pode até causar a desaceleração do poderoso computador. Como os sites tradicionais incentivam a navegar entre as páginas, qualquer vazamento de memória causado pela página anterior é quase limpo, deixando menos resíduos para trás.
  • c) O cliente deve ativar o JavaScript para executar o SPA, mas no aplicativo de várias páginas o JavaScript pode ser completamente evitado.
  • d) O SPA cresce no tamanho ideal, causando um longo tempo de espera. Por exemplo: trabalhando no Gmail com conexão mais lenta.

Além do acima, outras limitações arquiteturais são perda de dados de navegação, nenhum registro do histórico de navegação no navegador e dificuldade no teste funcional automatizado com selênio.

Este link explica as vantagens e desvantagens do aplicativo de página única.


12
Isto está incorreto. a) O XSS afeta as páginas geradas pelo servidor tão prontamente quanto os documentos gerados no cliente. Eu diria mais, já que existem soluções de mitigação XSS muito simples e eficazes no cliente. Se você não deseja permitir o XSS, não interprete o conteúdo enviado pelo usuário como HTML. Qualquer programador decente pode lidar com isso. A navegação é fácil usando qualquer uma das técnicas disponíveis (pushState, roteamento de hash, etc.). O AFT para um SPA construído corretamente é exatamente o mesmo que qualquer outro aplicativo da web. O resumo da sua resposta é que você não sabe como construir para o cliente.
Jason Miller

@JasonMiller: Concordo. Acabei de perceber que o resumo não é todo o contexto de todo o blog. Vou fazer alterações nele. Obrigado.
Vish

6
Os pontos aeb são completamente inválidos. Ambos têm mais a ver com programação ruim do que as características de um SPA, e ambos são perfeitamente possíveis com um site tradicional; As vulnerabilidades do XSS podem afetar seu site, mesmo se você não escrever uma linha de JS. Vazamentos de memória são tão possíveis no lado do servidor quanto no lado do cliente. Quanto ao ponto c, qualquer pessoa que desabilite o Javascript atualmente provavelmente encontrará um problema grave na Web em geral, esse é um IMHO que não é um problema.
precisa saber é

2

No meu desenvolvimento, encontrei duas vantagens distintas no uso de um SPA. Isso não quer dizer que o seguinte não possa ser alcançado em um aplicativo Web tradicional, apenas porque vejo benefícios incrementais sem introduzir desvantagens adicionais.

  • O potencial para menos solicitações do servidor, pois a renderização de novo conteúdo nem sempre é uma solicitação do servidor http para uma nova página html. Mas eu digo potencial, porque o novo conteúdo pode facilmente exigir uma chamada do Ajax para obter dados, mas esses dados podem ser incrementalmente mais leves que o próprio, além da marcação, proporcionando um benefício líquido.

  • A capacidade de manter o "Estado". Em seus termos mais simples, defina uma variável na entrada do aplicativo e ele estará disponível para outros componentes durante toda a experiência do usuário sem transmiti-lo ou configurá-lo para um padrão de armazenamento local. No entanto, o gerenciamento inteligente dessa capacidade é essencial para manter o escopo de nível superior organizado.

Além de exigir o JS (o que não é uma loucura exigir dos aplicativos da web), outras desvantagens observadas são, na minha opinião, não específicas do SPA ou podem ser mitigadas por bons hábitos e padrões de desenvolvimento.


1

Tente não considerar o uso de um SPA sem antes definir como abordará a segurança e a estabilidade da API no lado do servidor. Então você verá algumas das verdadeiras vantagens de usar um SPA. Especificamente, se você usar um servidor RESTful que implementa o OAUTH 2.0 para segurança, obterá duas separações fundamentais de preocupações que podem reduzir seus custos de desenvolvimento e manutenção.

  1. Isso moverá a sessão (e é segurança) para o SPA e aliviará o servidor de toda essa sobrecarga.
  2. Sua API se torna estável e facilmente extensível.

Sugerido anteriormente, mas não explicitado; Se seu objetivo é implantar aplicativos Android e Apple, a gravação de um SPA JavaScript envolto por uma chamada nativa para hospedar a tela em um navegador (Android ou Apple) elimina a necessidade de manter uma base de código da Apple e uma base de código do Android.


0

Entendo que essa é uma pergunta mais antiga, mas gostaria de acrescentar outra desvantagem dos aplicativos de página única:

Se você criar uma API que retorne resultados em uma linguagem de dados (como XML ou JSON) em vez de uma linguagem de formatação (como HTML), estará permitindo uma maior interoperabilidade de aplicativos, por exemplo, em aplicativos B2B (B2B). Essa interoperabilidade tem grandes benefícios, mas permite que as pessoas escrevam software para "extrair" (ou roubar) seus dados. Essa desvantagem específica é comum a todas as APIs que usam uma linguagem de dados, e não aos SPAs em geral (de fato, um SPA que solicita ao servidor HTML pré-renderizado evita isso, mas à custa de uma separação pobre de modelo / exibição). Esse risco exposto por essa desvantagem pode ser mitigado por vários meios, como limitação de solicitação e bloqueio de conexão, etc.


2
1.) Não ter uma API não significa que as páginas HTML não podem ser extraídas. 2.) Você pode impedir o uso indevido da sua API até certo ponto. 3.) Por ter uma API, é possível criar facilmente não apenas páginas da Web, mas também aplicativos móveis, o que, na minha opinião, supera em muito as desvantagens.
Honza Kalfus

1. Eu não disse que a não-API impedia a mineração de dados. Acabei de dizer que uma API pode facilitar a mineração de dados. 2. Foi para isso que minha última frase foi endereçada. 3. Há muitas vantagens em ter uma API, e eu pessoalmente prefiro uma combinação API / SPA para a maioria dos casos de uso que normalmente encontro. No entanto, eu só queria adicionar uma única desvantagem à lista (que em retrospecto eu deveria ter adicionado como um comentário, em vez de uma resposta completa).
magnus

Desculpe, mas se eu não entendi errado, você disse que "Essa interoperabilidade tem grandes benefícios, mas permite que as pessoas escrevam software para" extrair "(ou roubar) seus dados". Se eu alterasse um pouco sua frase, também poderia dizer que "os sites permitem que as pessoas escrevam software para" extrair "(ou roubar) seus dados". e esteja correto. Agora eu não estou dizendo que a sua ideia é incorreto, eu concordo com a mineração de ser mais fácil, eu só estou dizendo que não o que você escreveu é;)
Honza Kalfus

Acordado. Não estava claro o suficiente. Os dados incorporados no HTML são mineráveis. Dados incorporado em JSON / XML / etc também é mineable, apenas mais fácil
magnus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.