SSG usando Laravel
O que é SSG (Static Site Generation)
É o processo de gerar páginas estáticas (.html) de sua aplicação.
Muitos frameworks oferecem essa ferramenta (Hugo, Next.Js, Nuxt.Js e muitos outros). Aqui vou mostrar que também podemos fazer SSG de sua aplicação Laravel que já está online, usando o próprio Laravel.
Qual a utilidade disso?
Provavelmente sua aplicação está nesse momento processando o mesmo conteúdo para cada usuário que acessa sua homepage ou várias outras páginas do seu site, fazendo todo o processo de consumir dados no banco de dados ou cache, processá-los, gerar as views e renderizar um template para devolver ao usuário, de novo e de novo…
Após gerarmos páginas estáticas, esse processo acima não precisará mais acontecer a cada requisição em sua aplicação, pois após termos gerado um .html para cada página, nosso servidor nginx (ou qualquer outro) irá apenas retornar esse .html protinho para o usuário, sem a necessidade de nem enconstar na aplicação.
Como fazer SSG usando Laravel?
Mostrarei abaixo duas maneiras, as duas podem ser usadas ao mesmo tempo (eu uso, inclusive), pois cada uma atende uma necessidade diferente. Para ambas as maneiras, utilizo uma configuração de disco em config/filesystems.php para definir para onde vão os .html gerados:
| |
1. Geração automática em background job
Dessa maneira, um job irá realizar em background a geração das páginas estáticas que você predefinir.
| |
E pronto, você pode criar um comando para disparar esse job a cada novo deploy da sua aplicação e também criar events/observers/listeners para gerar novamente os .html a cada alteração de conteúdo.
2. Geração após o término de uma requisição
Dessa maneira, ao término de uma requisição que contenha nosso middleware, o conteúdo devolvido ao usuário será escrito em um .html em nosso disco.
| |
Registre esse middleware em $routeMiddleware no arquivo App\Http\Kernel`
| |
E adicione o middleware nas rotas que deseja páginas estáticas.
Por que também utilizar essa maneira, e não só definir todas as urls no background job mostrado anteriormente?
Imagine um blog com centenas ou milhares de posts, o job levaria vários minutos para terminar, e provavelmente, nem todos os blog posts recebem muitas requisições.
Esse é o cenário perfeito para usar esse middleware. Após o primeiro leitor receber a renderização do blog post, o .html daquela postagem será gerado e o próximo leitor não precisará esperar pelo processo de renderização novamente.
Configurando Nginx para responder os .html gerados
Com a configuração abaixo, o nginx irá sempre procurar um .html para as urls que tem os prefixos definidos. Caso não encontre, irá seguir o fluxo normal e mandar a requisição para sua aplicação.
| |
Conclusão
Após os passos acima a aplicação finalmente fica responsável pelo que mais importa, como o checkout e dashboard do usuário. O nginx pode ficar com o processo mais leve e repetitivo de devolver páginas estáticas para o usuário. Além de o tempo de cada requisição diminuir bastante para essas páginas geradas estaticamente.