O que é SPA, SSG e SSR

Static Site Generation (SSG)

É a geração das páginas estaticamente no momento que a nossa aplicação ocorre o build. Quando me refiro a página estática para aqueles que não têm conhecimento, estou dizendo que nenhum servidor interfere na montagem daquela página, e também que o lado do cliente não interfere.

Por conta das páginas pré-renderizadas o tempo de carregamento é muito mais rápido.

Outra vantagem é a segurança, já que a página é estática e não tem interação direta com o servidor

Abaixo mostro um exemplo utilizando NextJS, já que é um framework React que tem suporte a SSG.

// page.tsx

import ListaTodos from './components/ListaTodos';

export default async function Home() {
  const res = await fetch('https://jsonplaceholder.typicode.com/todos');

  const todos = await res.json();
  return (
    <div>
      <h1>Lista de Produtos</h1>
      <ListaTodos todos={todos} />
    </div>
  );
}

O conteúdo mostrado para o usuário ao acessar a página será de HTML puro. No código acima o async direto no componente HOME para efetuar a busca dos dados, assim ele buscará durante o tempo do build sendo gerado uma página estática.

O fetch gera conteúdo antes do deploy fazendo ele ser estático automaticamente.

// components/ListaTodos.tsx

export default function ListaTodos({ todos }) {
  return (
    <ul>
      {todos.map((todo) => (
        <li key={todo.id}>{todo.title}</li>
      ))}
    </ul>
  );
}

A partir da versão 13 do Next.JS (com o APP Router) não é mais preciso usar o getStaticProps para gerar páginas estáticas. O SSG simplifica e integra diretamente no componente da página. Ao usar o fetch direto no componente, ele gera as páginas estaticamente por padrão.

Nota: Código feito usando a versão 14 do Next.JS

Single Page Application (SPA)

Quando o usuário navegar por uma aplicação na qual ela carrega uma única pagina HTML. Que dinamicamente tem seu conteúdo atualizado no decorrer que o usuário a utiliza, sem precisar ter um recarregamento completo da página do servidor. Abaixo mostro uma aplicação SPA com roteamento.

import React from 'react';
import { BrowserRouter as Router, Route, Routes, Link } from 'react-router-dom';

function Home() {
  return <h1>Página Inicial</h1>;
}

function Contact() {
  return <h1>Contato</h1>;
}

function App() {
  return (
    <Router>
      <nav>
        <Link to="/">Início</Link> <Link to="/contact">Contato</Link>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/contact" element={<Contact />} />
      </Routes>
    </Router>
  );
}

export default App;

Ao utilizar o Router ele gerencia o roteamento do lado do cliente e observar a url para renderizar o componente correto sem ter a necessidade de recarregar a página. O Routes e Route definem as rotas da aplicação e quais componentes devem ser renderizados em cada uma.

A um outro conceito chamado MPA que é quando o usuário navega entre uma página e outra e toda vez ocorre uma requisição para o servidor solicitando a nova página HTML.

Dependendo do projeto e do grau de complexidade da aplicação o ideal é utilizar o SPA. Por exemplo em casos na qual é necessária uma navegação frequente como aplicações interativas ou dashboards operacionais/administrativos. Aplicações com necessitam de atualizações em tempo real como um sistema de rastreamento veicular.

Portanto antes de iniciar seu projeto análise com calma qual arquitetura será necessária utilizar.

Server-Side Rendering (SSR)

O SSR é uma técnica de renderização de conteúdo que as aplicações web usam. O servidor gera a página (HTML) antes de enviá-la para o cliente (Navegador), assim melhorando o desempenho da página em questão, pois o conteúdo já está pronto para ser mostrado no browser.

Uma das vantagens de se usar o SSR é o SEO, que os motores de busca consideram muito importante, pois entregam a página já montada para o navegador, permitindo uma melhor indexação. Outra vantagem importante é a otimização por conta da página já carregar com o conteúdo do lado do servidor. Sendo assim melhorando a experiência principalmente daqueles que possuem conexões lentas.

É possível implementar o SSR utilizando ExpressJS e NodeJS, e também apenas com o NextJS. Abaixo mostro um exemplo utilizando NextJS.

import React from 'react';

const currentTime = new Date().toLocaleTimeString();

function App() {
  return (
    <div>
      <p>Hora atual do servidor: {currentTime}</p>
    </div>
  );
}

export default App;

Ao fazer uma requisição em uma função assíncrona, o NextJS entende que o conteúdo deve ser renderizado do lado do servidor cada vez que ocorre uma requisição. No exemplo acima, o servidor executa a lógica de pegar a hora atual, monta um HTML e envia para o cliente, que mostra no front (Navegador).