Executando verificação de segurança...
15

Como defender o fim do padrão SPA + REST?

Contexto

Recentemente tive o privilégio de conversar com um programador com quase 40 anos de carreira em tecnologia que já escreveu livros e deu palestras sobre o assunto. Alguém com muita experiência, certamente. Enquanto conversava com ele, me espantei quando ele começou a dizer que advogava pelo fim dos SPAs e do REST, dizendo que eles só resolviam problemas que eles mesmos criavam.

Ele afirmava que hoje a internet como um todo, navegadores e protocolos, já estão muito mais modernos e não carecem das funcionalidades que não existiam na época em que os SPAs foram inventados. Para ele, deveria haver um movimento de volta para o monorepo SSR, ainda que implementando componentes frontend modernos para enriquecer a UX.

Aquilo não era totalmente novo pra mim: já tinha encontrado outras pessoas com essa mesma ideia. Pela minha experiência, por algum motivo que não compreendi totalmente até hoje, pythonistas têm aversão a frontend. Ele, por coincidência, era justamente um especialista em Python e entusiasta do HTMX. Não por acaso você vai ver um pythonista sempre indo para o Vue quando é obrigado a fazer front, já que das 3 principais frameworks ele é o único progressivo e que aproveita mais dos recursos nativos do JS ao invés de reinventar a roda como fazem o React e o Angular.

Como enxergo

Se o ponto de quem advoga pelo fim dos SPAs é que eles são desnecessários para websites simples, meu ponto é que isso não significa que sejam piores para estes cenários. Em projetos onde o frontend é basicamente CRUD com forms e tables (como era a internet antigamente), sim, um HTMX vai dar conta. Isso não significa que um projeto full CSR não seria uma boa escolha. Isto porque:

É falsa a premissa de que um SPA é mais lento

Um SPA só demora para carregar no loading inicial do bundle, e a partir daí é cacheado pelo navegador até que a versão do projeto mude. Toda atualização de tela é instantânea. Um projeto SSR, por outro lado, terá carregamentos e dependerá da conexão para toda troca de página e para muitas atualizações da DOM. Antes que se possa reclamar do bundle size disso: um SPA grande terá apenas alguns megas, o que para a internet de hoje é um tamanho irrisório. Além disso, todos frameworks de SPA (e mesmo o Next) implementam lazy-loading de páginas e componentes, então o bundle inicial nunca é o projeto inteiro: o usuário espera o carregamento apenas do que ele precisa ver.

Inclusive, se experiência pessoal conta, na empresa onde trabalho passamos por uma refatoração de 3 projetos legados em Angular 12 para 3 projetos em Next 14. São projetos com praticamente o mesmo número de páginas e funcionalidades, mas apenas com design diferente (além da própria stack, obviamente). Os 3 projetos Next são muito mais lentos em qualquer troca de página, enquanto os 3 projetos Angular não apresentam delay perceptível em qualquer troca de página ou atualização de DOM.

Optar por um não-SPA significa se comprometer com a visão de que aquele projeto nunca evoluirá ao ponto de necessitar de mais recursos

É uma aposta que se faz para anos e arrisca uma eventual refatoração completa e manutenção de um legado. Todos sabemos como um negócio (com sua natureza e necessidades) evolui rapidamente e pode ser bem diferente em poucos anos. Abrir mão de um gerenciamento de estado global significa, na prática, duas coisas:

  1. depender do local-storage, session-storage e cookies para manter estado entre componentes, o que limita a estrutura de dados que você poderá guardar a apenas "JSON-serializables";
  2. transmitir estado entre páginas apenas via query-params, o que limita em muito o tipo de informação que pode ser transmitida.

SPA + REST torna um sistema mais eficiente

Usar o REST significa que uma mesma página não terá que ser inteiramente re-computada pelo servidor (que está ocupado com outras N requisições simultâneas). Por exemplo: em uma página de um SPA onde é necessária, além do template, a consulta de 3 tabelas diferentes para hidratá-lo, caso apenas um dos dados precise ser atualizado, o SPA buscará apenas aquele dado específico e re-renderizará a DOM (que já está carregada localmente) com ele. Um não-SPA teria que recomputar todo o conteúdo da página, perdendo este poder de buscar apenas a informação necessária de forma granular.

Em um dado momento, este programador com quem conversava disse que os SPAs que inauguraram o problema dos longos loading spinners em uma tela e que isso não existia antes. Ora, é óbvio que um projeto onde o servidor consegue apenas servir a tela inteira de uma vez não apresentará loading spinners: ao trocar de página, enquanto a página seguinte não é inteiramente renderizada e servida o usuário fica preso naquele estado. Um SPA, entretanto, consegue exibir imediatamente tudo que não depende de um carregamento específico que hidradará apenas uma seção, preenchendo aquele espaço em branco com um spinner ou um skeleton. Isso, como é sabido, é importantíssimo para a UX por evitar rage clicks e por ocupar o usuário com seções que ele pode querer ver enquanto espera.

Um Web App não é apenas uma interface para manipular o banco de dados

O nome disso é Insomnia ou Postman. Segregar um sistema em dois repositórios diferentes permite que cada um foque em responsabilidades diferentes: o backend na manipulação e consistência dos dados; o frontend na apresentação do negócio e no direcionamento do usuário. Embutir os dois em um mono repo significa jogar para um mesmo repositório dois projetos distintos (cada um com suas dependências e pipes de qualidade específicas), o que aumenta a complexidade, não o contrário.

Quando muitos advogam pela segregação de responsabilidade entre camadas de um backend, que se comunicarão apenas por contratos, por que a mesma ideia não se aplicaria para dois projetos tão distintos na natureza? Enxergar a view como apenas mais uma camada do backend significa ter em mente apenas os tipos de templates que existiam há 15 anos.

Conclusão

Todo programador deveria saber que na nossa área a única coisa que é sempre mentira é que uma única solução será sempre verdade. Em nenhum momento defendo que SPA + REST é o melhor jeito de se programar. Se eu tivesse que chutar, acredito que o padrão REST tenha se tornado a lingua franca do desenvolvimento web apenas porque é o que mais acomodou a separação entre backend e frontend para que pudessem evoluir de maneira independente.

De qualquer modo, para defender que o JS é apenas um adicional irrelevante para um sistema e que o REST mais prejudica do que beneficia num projeto é preciso antes provar que não existe nenhum caso onde um projeto SPA poderia ser completamente reescrito desta forma sem aumentar sua complexidade e preservando todos seus comportamentos. Será que sem o conceito de SPA o Facebook, Instagram ou o Spotify existiriam da mesma forma? Ainda que o produto final fosse possível de ser replicado integralmente desta forma, o código necessário seria maior ou menor; mais complexo ou menos complexo? Um código escalável e organizado é tão importante quanto a viabilidade do produto final. Então, para além da afirmação de que "é possível reescrever muitos apps sem ser como SPA", eu coloco uma questão: "e o que ganhariamos com isso? O usuário, a empresa ou mesmo o programador ganharia algo com isso?".

Apesar de tudo, minha experiência não é tão vasta assim (e certamente bem menor que a do nosso colega com 40 anos de carreira). Em frontend, minha experiência se limita a SPAs em Angular e Next. Na verdade, já tive que trabalhar em um projeto mono-repo não-SPA, Django+Vue, e quando olho para trás não enxergo nenhum ganho nisso. É possível que existam outras frameworks e/ou estratégias que resolvam estes problemas que apontei. Adoraria aprender mais sobre.

Qual sua opinião sobre o assunto? Discorda de algo que eu disse? Tem algum material para indicar que tenha bons argumentos para defender o fim dos SPAs?

Carregando publicação patrocinada...
5

Eu acho que o "defender o fim do padrão SPA + REST?" é um exagero gritante.

Nossa área tende a ser alvejada constantemente com balas de prata, panaceias que solucionam tudo, o que é curioso, porque profissionais que teoricamente trabalham com lógica, deveriam ser menos propensos a isso, pelo menos na media.

Pra mim o maior sinal de um profissional maduro (e por extensão de uma equipe madura) é reconhecer as Ferramentas certas, não só para o que se está tentando solucionar, mas para o time e para o mercado, e com o avanço de ferramentas de IA Generativas isso vai ficar ainda mais necessário.

Vou te contar uma historia real, que pode ser anedotica, mas geralmente a experiencia é:

Eu conheci um rapaz que tinha começado uma startup que era baseada num app, ele tinha contatos no ramo, uma boa validação de mercado e de concorrentes.

Pra fazer o app ele contratou um colega que amava flutter pra desenvolver, o rapaz tinha aprendido flutter e flutter era a melhor coisa do mundo, React Native era horrível, Expo ia destruir a ideia, Nativo era inútil...Era flutter no céu e o google na terra.

Ele fez o app, o app ta rodando, muito bem por sinal e esse colega conseguiu um emprego alocado em outro estado e foi embora.

Dai começou a jornada do dono da startup, primeiro ele descobriu que precisava do código fonte, que não tinha sido entregue, depois disso ele tinha que achar algum dev flutter... ele ficou meses até finalmente fechar com uma empresa em outro estado para dar manutenção. Tempo que os concorrente usaram para melhorar o produto, tempo que ele perdeu oportunidades e dinheiro numa fase vital do negócio dele.

Flutter é ruim? nem de longe. Só era a tecnologia errada, na hora errada.

3

Com certeza. As ferramentas e estratégias para atacar um problema sempre vão depender do problema. Na nossa área realmente é muito fácil ser entusiasta de uma tecnologia/prática específica e acabar virando messias daquilo.

Outra coisa muito importante na hora de decidir uma stack: a facilidade de contratar mão de obra. Ainda que um conjunto de tecnologias seja o ideal para um projeto, deve-se pensar que o negócio não pode ficar refém daqueles desenvolvedores que conseguiu encontrar naquele momento.

1
1

Muita massa essa sua análise. Há muitas variáveis que se devem considerar na decisão de um ínicio de projeto, principalmente startups. às vezes o melhor não é o mais adequado, e ás vezes você prescisa abrir mão do seu favoritimos, do mais moderna, de maior uso, pra tomar decisões que casem com a fase do negócio, a maturidade, a agilidade, e disponibilidade de devs. Quando você abre a sua mente pra isso, tomar decisões maduras se tornam fruto de uma visão "holística" das coisas.

Muitas startups prototipam o front em uma stack diferente da que vai ir em produção. E aí eu acredito que Django e Vue seja uma boa opção

4

Oi @GheistLycis,

Eu sou o interlocutor mencionado no artigo e, por conta disso, acho importante esclarecer alguns pontos que podem gerar mal-entendidos.

Antes de tudo, é importante separar conceitos diferentes para não colocar todas as controvérsias no mesmo balaio.

Um conceito fundamental é o REST. REST é um estilo arquitetural descrito na dissertação de Roy Fielding, um dos autores das RFCs que definiram o protocolo HTTP — parte essencial do que chamamos de Web.

Quando ele escreveu essa dissertação (e as primeiras RFCs da Web), JSON ainda não existia. Mas o HTML já existia, assim como todo o conjunto de ideias que compõem os sistemas hipermídia (hypermedia): documentos com diferentes representações interligados por meio de URLs.

Os clientes que acessavam esses sistemas — chamados de User Agents — eram, principalmente, os navegadores (browsers).

Nesse ponto da história, a Web já funcionava perfeitamente com sua arquitetura REST (embora o termo ainda não tivesse sido cunhado), com servidores e clientes se comunicando sem necessidade de JavaScript ou JSON (que sequer existia).

Com o tempo, a Web evoluiu de um sistema hipermídia para uma plataforma de aplicações. Essa evolução foi rápida — mais rápida do que os servidores e navegadores conseguiam acompanhar.

Essas limitações impediam o desenvolvimento de certos tipos de aplicação, até que o Google implementou um “hack” usando uma extensão peculiar do JavaScript chamada XMLHttpRequest para seu cliente de e-mail, o Gmail. Assim nasceu uma revolução no desenvolvimento Web. Vale notar: o nome do objeto é XML — não JSON.

Esse recurso, junto com o surgimento da excelente engine V8, possibilitou uma Web muito mais dinâmica, onde aplicações com interfaces complexas — como Onshape, Figma, Miro e Google Docs — passaram a ser inteiramente implementadas em JavaScript, no cliente, com altíssima responsividade.

Foi aí que surgiram as primeiras SPAs (Single-Page Applications). Pareciam uma ideia genial! Finalmente, desenvolver para a Web se parecia com desenvolver para desktop. O backend poderia ser apenas uma interface para o armazenamento, enquanto tudo rodava no cliente. E o JSON nascia como um formato leve para transportar dados, sem se preocupar com semântica.

Com o Node.js, então, bastava aprender uma linguagem: JavaScript.

O problema começou quando essa abordagem se tornou a única forma possível de se desenvolver para a Web.

Se é verdade que, para fazer um Miro, Figma ou Google Sheets, rodar tudo no cliente é vantajoso (se não a única opção) — quais são as vantagens dessa abordagem para uma aplicação corporativa que, na prática, é apenas um CRUD um pouco mais sofisticado?

Evitar recarregar a página inteira ao clicar em “Salvar” porque isso seria “lento”? Honestamente, quantas vezes você viu um spinner girando na tela enquanto a API demora para responder? De que adianta reimplementar em JavaScript algo que qualquer navegador moderno já faz “de fábrica” — renderizar um HTML pronto — se o tempo total para receber e processar um JSON (deserializar, injetar no DOM, renderizar via JS) é o mesmo?

Sim, o ecossistema de JS (e TS) evoluiu muito. Mas os navegadores também evoluíram — e os protocolos idem (já leu sobre HTTP/3 e QUIC e suas capacidades de comunicação assíncrona e paralela?).

Se usarmos a Web como ela foi concebida — com navegadores e servidores modernos, boa arquitetura (cache, CDNs, workers, microfronts etc.) — é bem provável que o seu projeto precise de muito menos JavaScript do que você imagina.

É claro que não estou dizendo que dá para desenvolver tudo na Web sem JS (embora esse seja meu sonho). JavaScript é — e continuará sendo — necessário em vários pontos. A questão é: precisamos usar JS para tudo? Precisamos reimplementar, em JS, coisas que o navegador já faz?

Deixo um desafio: tente desenhar suas aplicações Web sempre se perguntando:

“Como eu faria isso funcionar em um navegador com o JavaScript completamente desabilitado?”

A discussão sobre monólito vs. microserviços, mencionada pelo @GheistLycis, é independente dessa aqui — e grande demais para caber neste comentário. Posso falar sobre isso depois: já tive sucesso com um projeto em microserviços, e no projeto atual estou fazendo o caminho inverso (microserviços → monólito). Cada caso pede uma arquitetura diferente. O importante é refletir profundamente sobre o problema antes de decidir.

Por fim, gostaria de dizer que alguns comentários deste post refletem muito bem o que tentei explicar (por exemplo, o do @thiagoandre).

Aos que pedem exemplos práticos: eles ainda são poucos, porque essa discussão — que propõe um “retorno às origens” — é relativamente recente (surgiu por volta da pandemia) e nasceu de forma “tumultuada”, muito por causa do tom irreverente da turma do HTMX, principal proponente dessa abordagem.

Para quem quiser se aprofundar, seguem algumas referências:

  • Fielding’s Dissertation — dissertação que introduz o conceito de REST.
  • Hypermedia Systems — livro gratuito dos criadores do HTMX, que fundamenta vários conceitos abordados aqui (como HATEOAS).
  • A Web é uma API — slides da minha palestra sobre a ideia de criar APIs que também funcionem como aplicações Web. Faz par com meu projeto Toy, que apresentarei como tutorial na Python Brasil 2025 em outubro. Há também o vídeo dessa palestra.

Esse texto foi revisado e as ênfases foram dadas pelo ChatGPT.

3

Meu irmão que artigo ! Vim pela curiosidade por que gosto dessas discussões e sempre aprendo algo mas achei bem sensato e na verdade penso que é bem isso. NÃO EXISTE A MELHOR E UNICA SUFICIENTE SOLUÇÃO! A solução depende do cenário, do contexto, do orçamento disponível e principalmente do problema a ser resolvido, e essa é a beleza da coisa. Com quase 20 anos de carreira (o que nao é muita coisa) a única certeza que eu tenho é que tudo depende rsrsrs pior coisa é ser fanboy de tecnologia ou se obrigar a usar apenas a x ou y, mas penso que o desafio é manter a mente aberta sem perder o foco.

2

Ainda acho que SSR tradicional faz muito sentido. Aliás, faz mais sentido na maioria dos casos.
Com ele, o desenvolvimento é mais ágil: um repo, um build, um deploy. Menos npm e menos dependência de terceiros = menor superfície de ataque e menos CVEs.
A equipe pode ser menor e mais generalista, o que reduz custo e complexidade.

Em performance, SSR aguenta bem com cache, CDN e otimização de banco.
E se o projeto crescer a ponto de precisar de recursos mais avançados (tempo real, offline, UI pesada), é porque ele já dá retorno financeiro e pode bancar uma equipe mais especializada.

Outro ponto que já sofri inúmeras vezes com SPAs, é a regra de negócio ser espalhada pelo front e no back. Um SSR tradicional pode evita duplicar regras em dois lugares diferentes.

SPA faz mais sentido (para mim) quando há interação tipo editores complexos, colaboração em tempo real, ou uso offline.
Pra maioria dos sistemas, SSR já entrega uma UX muito boa. E convenhamos, 95% dos sistemas desenvolvidos no mundo são de pequeno a médio porte e que foram criado por 4, 3 ou até 1 dev.

E hoje em dia, os frameworks já estão bem maduros e trazendo soluções robustas para sanar os gaps dos SSRs. Trabalho com o Laravel e em conjunto com Livewire, Alpine, Inertia ou HTMX e tá sensacional.

1

Eu concordo plenamente com isso.

Eu já utilizei React e NextJS para criar alguns WebApps ao mesmo tempo que também tinha que desenvolver o backend com NodeJS, Python ou PHP.

Depois de fazer uma análise profunda, não vi a menor necessidade de construir aplicações com o frontend desacoplado do backend, uma vez que criava as soluções na maioria das vezes sozinho, não era um projeto que iria ter uma alta carga de requisição...

Hoje estou usando uma única Stack (Django completo no backend e no frontend com Django template) estou integrando algumas tecnologias como o AlpineJS e outras libs para dar o mínimo de dinamismo as UI.

Percebo que a minha produtividade aumentou muito, diminui a complexidade do ambiente de desenvolvimento, e o debug do Django integra tanto o frontend quanto o backend.

Claro que sim existirá casos onde o backend será criado para prover endpoint para "N", aplicações, nesse caso uso o Django Rest Framework.

1

Se for ver por esse lado, um low code com uma IA resolve ainda melhor, não precisa nem de programador, nem de modelagem de banco de dados e 1 clique tá publicado. Existe um motivo pelo qual empresas grandes adotam certos padrões e pode ter certeza que não é pelo gosto pessoal do dev. Para as outras, até um wordpress bem configuradinho resolve. Tornar seu trabalho mais fácil não é uma métrica de qualidade, depois a empresa cresce e começa a jornada para refazer o sistema que só o cara que desenvolveu entende o código e os inúmeros puxadinhos e padrões inventados.

1

Tem de tomar cuidado com esses programadores 20 anos mais de carreira kkkkk.
Eu tenho 30 anos de carreira como programador e consigo entender que depende muito de varios fatores para que uma estratégia como SSR, SPA ou outras seja adotada se nao tomar cuidado com esse pessoal daq a pouco vcs vao estar programando em BASIC com MSDOS de novo hahahahah. Sucesso a todos.

0
  • "o desenvolvimento é mais ágil: um repo, um build, um deploy." Não entendi a lógica de como ter um build e um deploy deixa o desenvolvimento mais ágil. Não é como se em um sistema com back e front separados toda atualização em um implicasse em atualização no outro (exceto especificamente para mudanças nos acordos de API). Na verdade, como eu disse no post, nestes cenários, ter duas pipes separadas que possam rodar em paralelo faz o deploy mais rápido pois cada pipe executa apenas em cima do código que deve assegurar a qualidade. Em um mono repo, uma mudança na camada de view vai triggar uma pipe que vai analisar (SAST, DAST, testes, etc) ela e todo o resto do sistema desnecessariamente, consumindo mais tempo e dinheiro.
  • "Menos npm e menos dependência de terceiros = menor superfície de ataque e menos CVEs." De acordo. Entretanto, fico pensando em quão grande realmente seria essa diferença. Um projeto Angular, por exemplo, em 90% dos casos vai necessitar apenas de uma lib de UI além dele próprio. Ter um mar de deps de terceiros é algo característico do React.
  • "A equipe pode ser menor e mais generalista, o que reduz custo e complexidade." De acordo. Porém, isso não é válido apenas para monorepos SSR. Mesmo que os backenders de plantão torçam o nariz pra essa realidade, muitos projetos hoje nascem tendo o front/UX como centro do produto e necessitam de apenas um CRUD básico, então ao invés de terem um time de backend eles simplesmente plugam o firebase e supabase pra ter toda API pronta. Ou seja, esse mesmo argumento hoje já vale também a favor do SPA sem um repo pra backend.
  • "SSR aguenta bem com cache, CDN e otimização de banco." As 3 práticas são válidas pra qualquer sistema web e beneficiam igualmente um SPA. Se anular o efeito destes 3 e isolar apenas o comportamente específico de SPA vs SSR, o SSR ainda vai ter mais latência para servir conteúdo, já que o SPA já tem tudo carregado localmente e busca apenas informações de forma granular (ainda mais granular se estivermos considerando GraphQL).
  • "SSR tradicional pode evitar duplicar regras em dois lugares diferentes." De acordo. Existem casos específicos onde vejo vantagem nisso, mas no geral é um impecilho, de fato.

Enfim, meu ponto todo no post foi tentar mostrar duas coisas:

  1. É errado dizer que monorepos SSR satisfazem as necessidades de todos projetos modernos;
  2. Dizer que um projeto é possível de ser realizado em monorepo SSR é diferente de dizer que ele vai ser melhor por isso.
1

Sobre o deploy, quando digo velocidade de desenvolvimento, estou falando sobre a velocidade de entrega e não do tempo do deploy. Há casos de que verifico a API e ela está ok e o front está com erro de type no build, ou a API não passou nos testes - Preciso retornar a tesk pro dev para que ele ajuste.

Gosto de alguns pontos de vista que você expõe, porém, nos projetos em que eu participai e participo como Tech Lead tenho mais tração e validação rápida nos projetos com stacks monorepo SSR. Pode ser uma particularidade das skills da minha equipe maaaaaas, olhando para o mercado, em que temos que desenvolver, validar produto, em pouquíssimo tempo, monorepo SSR é mais vantajoso.

E na real, RARAMENTE um projeto nasce com necessidades robustas no UI. RARAMENTE um projeto já nasce com a nescessidade de integração de APIs com várias interfaces (Web, App, Desktop e outros).

Não acredito que o SPA é lento, ele tem a possibilidade de entregar uma melhor usabilidade, bate menos em rotas como o "/me" tem mais versatilidade. Mas como falei, projetos de empresas pequenas e médias são CRUDs em sua grande maioria, e pra mim, nesse cenário um framework backend já brilha.

2

O modelo SPA + REST nasceu em um tempo em que os navegadores eram limitados e o servidor só conseguia renderizar HTML estático. Hoje esse cenário mudou completamente. Continuar separando frontend e backend em dois projetos distintos é insistir em uma complexidade que não traz ganho real. Essa arquitetura cria redundância — dados trafegam via HTTP entre duas camadas que poderiam se comunicar diretamente. Serialização, validações duplicadas e inconsistências de versão viram o dia a dia. No fim, é mais código, mais build, mais deploy e mais chance de erro.

A ideia de que SPAs são mais rápidos também não se sustenta. O carregamento inicial é pesado, o navegador precisa interpretar megabytes de JavaScript, hidratar a página e reconstruir o DOM. Enquanto isso, um SSR moderno entrega HTML pronto e interativo em milissegundos, aproveitando cache, fragmentos e streaming. O usuário vê conteúdo real muito antes — e sem depender de bundles, hydration e loaders intermináveis. A percepção de velocidade, que é o que importa, é muito melhor.

Além disso, SPAs trouxeram problemas que o SSR já tinha resolvido há décadas: estados inconsistentes, race conditions, duplicação de lógica e a necessidade de reinventar o controle de sessão no cliente. Hoje temos tecnologias como HTMX, Viewi, Livewire e Inertia que permitem criar interfaces ricas e interativas sem mover a aplicação inteira para o navegador. O resultado é código mais limpo, menos dependências e manutenção mais simples.

Separar projetos também não é o mesmo que separar responsabilidades. Podemos ter uma arquitetura limpa, modular e testável dentro de um mesmo repositório — com deploy atômico, versionamento coeso e comunicação direta entre camadas. O mito da “separação por stack” só aumenta a fricção entre times e torna cada ajuste um problema de integração.

Em resumo, SPA + REST é uma solução para um problema que a web moderna já resolveu. Não é uma evolução, é um desvio histórico. Hoje faz mais sentido unir as camadas novamente, aproveitando o que cada lado tem de melhor — o servidor cuidando da lógica e o navegador da interação — em um fluxo contínuo e integrado. Isso não é um retrocesso, é um retorno à eficiência.

1

Poderia, por gentileza, me passar exemplos de projetos feitos em HTMX, Viewi, Livewire e Inertia que tem todos estes comportamentos que você mencionou?

2

Acredito que este tipo tipo de visão desconsidera uma infinidade de variáveis.
Quando se trata de um site público, que precisa ser indexado pelo Google, inúmeras métricas são avaliadas. Uma das principais hoje em dia é INP que substituiu o FID como métrica de performance. Isso significa que não basta o site "carregar" rápido, toda a experiência de navegação é considerada. Um site SSR tem um carregamento inicial extremamente rápido, isso é fato, ainda mais quando combinado com cache na borda etc. Porém, é o próximo clique do usuário, como fica? Se a cada interação você tiver que trazer todo o html novamente a experiência de navegação fica muito prejudicada. No final, não se trata apenas de dar ou não dar para fazer mas sim a fluidez de toda a experiência do usuário durante sua sessão. Recentemente com o lançamento do material design 3 Expressive, por exemplo, o Google trouxe testes e benchmarks de como uma simples mudança na no cálculo da animação e das micro interações (trocando o easing tradicional para animação baseada em física) pode reter mais o usuário.
Saindo já do campo "usuário" temos também a especialidade do desenvolvedor. Claro que projeto pequeno um fullstack resolve mas, em projetos grandes, um Front end e um back end totalmente especialistas vão entregar uma qualidade final muito superior do que um generalista.
Achar que SSR resolve problemas de regras de negócio no Front, gerenciamento de estado e tudo mais, também é um erro enorme. No Front você está lidando com o estado e regras da interface e não do negócio. Se está misturando, significa que o sistema foi mal arquitetado. Se está se preocupando com replicar validação do Front e back, significa que não está usando um padrão de open api / json schema robusto que expõe as regras.
Infelizmente, o que mais conheço são programadores "experientes" que falam que tudo isso é frescura, mas que não fazem ideia do que é arquitetar um sistema distribuído e com vários níveis de tolerância a falha, otimizações de performance na casa dos ms, acompanhamento p90, p99 etc.

2
1

SPA + REST já morreu, só esqueceram de avisar o pessoal.
O modelo atual é o HTML-first, enriquecido com JS, e isso é exatamente o que Nuxt, Next, Astro e companhia já fazem há tempo. SSR e CSR não são mais polos opostos, é tudo híbrido agora.

O ponto que quase ninguém toca: se todo o seu sistema é o "webapp", algo está profundamente errado. O navegador é só a GUI. Qualquer coisa séria envolve backend real, processamento, domínio, persistência, integração. E se você já tem tudo isso do lado do servidor, qual o sentido de serializar tudo em JSON pra re-hidratar no cliente, quando você pode simplesmente mandar o HTML pronto, cacheável, indexável e já otimizado?

A web amadureceu. O retorno ao servidor não é nostalgia, é eficiência. O SPA foi uma resposta ao que os navegadores não conseguiam fazer. Agora eles conseguem. O futuro é simples de novo, e elegante.

Um abraço e bons estudos!

1

Interessante. O que você disse, de forma geral, é bem parecido com o que meu colega mencionado no post me disse. Consegue lembrar de exemplos de projetos feitos assim que mostrem como isso de fato acontece? Uma das coisas que sustentou minha descrença com o que meu colega dizia é que ele não conseguia mencionar nenhum projeto grande que teve êxito com essa estratégia, mas apenas UIs simples que serviam como interface pra CRUD. Obrigado!

0
1

Sim, o tabnews é feito em Next com SSR. Isto só é possível justamente porque é um projeto simples do tipo blog que existe há decadas. A UI não passa de forms e tables, como mencionei no meu post.

No final do meu post, inclusive, escrevo:

De qualquer modo, para defender que o JS é apenas um adicional irrelevante para um sistema e que o REST mais prejudica do que beneficia num projeto é preciso antes provar que não existe nenhum caso onde um projeto SPA poderia ser completamente reescrito desta forma sem aumentar sua complexidade e preservando todos seus comportamentos.

Até onde entendo, não é possível ter uma UI reativa apenas com SSR. O Next é o que mais se aproxima disso, mas justamente porque permite fazer um projeto híbrido. Hoje mantenho 3 web apps B2B em Next e afirmo que 90% dos componentes que escrevemos são forçados a serem client-side.

1

Talvez seja apenas uma questão de definição.

Ninguém está defendendo o fim do client-side, o que se discute é o fim do padrão "enviar JSON por REST e renderizar tudo em JS".

O que muita gente (eu incluso) defende é justamente o oposto: clientes cada vez mais ricos, autônomos e inteligentes, que não dependam de REST para existir. Aplicações inteiras podem (e devem) ser empacotadas com Service Workers, usando SQLite e o Canvas via wasm para persistência e renderização de verdade..

Isso é client-first, não SPA..

1

Não sou a favor e nem contra, pois nem da área web eu sou, ahaahaha.

Mas uma coisa q percebi é q se a tecnologia ainda existe, é pq é um desses 3 motivos: projeto legado q está em funcionamento (tipo sistemas em cobol), entusiastas (pessoas q gostam de manter aquela tecnologia) e pq ainda é útil.

1

Eu gosto do debate extremo para nos trazer prismas. No dia a dia eu tenho preferido trabalhar de forma híbrida.
Os cruds normalmente tenho feito lista e form carregando individualmente e os comportamentos em ajax.
Se é uma tela mais complexa, eu vejo caso a caso. Isso tem muita ligação com o texto que postei aqui esses dias.
Eu, pessoalmente (de novo), não tenho boa experiência com SPAs e, sinceramente, todos os sistemas que integro que são SPAs tem APIs bem problemáticas.
Essa “coisa” de usar a mesma API para a interface do sistema e para API externa só me trouxe dor de cabeça. Sempre que integro com sistema assim, sempre tenho dor de cabeça. Então nunca trabalhei com esse modelo para evitar as dores de cabeça estando do outro lado também.

No final, eu realmente acredito que junto com experiência a gente acumula muito trauma e camadas de proteção, isso acaba refletindo em nossas aplicações como um todo.

Quantas vezes precisou trocar o banco de dados de uma aplicação?
Quantas vezes aquelas duas ou três situações que você enche o código para caso precise, realmente aconteceram?

Eu tenho abdicado de alguns, vários, conceitos e programado orientado aos projetos. Hoje tenho uma estrutura minha onde desenvolvi tudo do zero de forma muito simples. Isso acontece muito comigo, usar aquela library magnífica que tem 5000 funcionalidades que eu não uso, 2 que uso e 3 que o cliente fica frustrado por não ser possível ter.

Criei meus select com filtro, que funciona lindamente no desktop e mobile.

Fiz meu draggable, sortable, diálogo e com eles eu posso extender o que precisar. E não tenho mais trabalho por isso, bem contrário, meu código é limpo e posso estender até onde precisar.

Acha que eu não faço coisas complexas? Faço bastante, mas não preciso tornar meu código um emaranhado de coisas para mostrar valor. A qualidade tá na entrega, na manutenibilidade, no tempo resposta em casos de erro e na confiança dos meus clientes.

1
0
-2

Eu sou a favor da troca do rest pelo graphql, por inúmeras vantagens, mas tambem discordo que o spa seja lento. Ao contrario, nos permite trabalhar com microfrontend.
.

2

Vim do PHP. Já estou acostumado a toda hora ter um "especialista' em outra linguagem falar mal do PHP. Como disseram. Melhor ferramenta é aquela que voce sabe usar e que resolve o problema que quer resolver. Nao existe solução nem ferramenta milagrosa

2

Eu também vim do php, mas conhecer outras ferramentas faz parte da profissão, ser curioso faz parte da profissão, ter conhecimento e ferramental pra resolver problemas faz parte da profissão. Até um cozinheiro precisa de novas receitas. Vai ter as preferidas dele? Sim, mas atuar como pedra em um lugar que deveria ser água...acho que está no recipiente errado.

1

Já fui dev em PHP há mais de 10 anos atrás, trabalhando com CodeIgniter ou PHP puro (cheguei a estudar Laravel na época, mas desanimei). De lá para cá, trabalhei tanto com projetos em .Net que virou minha zona de conforto atualmente, mesmo sabendo que PHP seria melhor para maioria dos casos com apenas um CodeIgniter.