Home Blogs Um guia para a Regeneração Estática Incremental
Applications

Um guia para a Regeneração Estática Incremental

About The Author

Outline

Para compreender a Geração Estática Incremental, deixe a explicação ser guiada por um cenário em que uma página solicitada pelo utilizador não foi pré-renderizada enquanto exportava o website de forma estática. Nesse caso, uma página de retorno é servida enquanto os dados são carregados. Além disso, após a conclusão de construir a página com os dados obtidos, a página é então armazenada em cache no servidor. Qualquer utilizador que pedisse a página, em seguida, saltaria sobre as fases de recuperação e carregamento, e veria diretamente a página construída. Excelente!

A regeneração é inspirada no conceito de obsoleta enquanto revalida, em que os dados obsoletos são atualizados a intervalos regulares de segundos de revalidação. Para páginas que têm o valor staleWhileRevalidateSeconds configurado, elas seriam reconstruídas após intervalos regulares do valor configurado.

Consulte os guias detalhados no ISR em: Regeneração estática incremental: Os seus benefícios e as suas falhas e Um guia completo para regeneração estática incremental (ISR) com Next.js.

Introdução ao ISG em Nuxt.js com Layer0 (agora Edgio)

Esta seção descreverá como implementar ISG com Layer0 e Nuxt.js. As etapas incluem configurar um aplicativo de texto com leader0, criar rotas dinâmicas de página e api e, finalmente, usar configurações de leader0 para ver o ISG em ação.

Configurar a aplicação Nuxt.js com Layer0

Crie uma aplicação Nuxt.js com o seguinte comando:

				
					npm create nuxt-app layer0-nuxt-isg-example

				
			
  • Para escolher estrutura de servidor personalizada, selecione Nenhum
  • Para escolher o modo de renderização, selecione Universal (SSR)(Nota: No caso de você já ter um aplicativo de texto, basta manter as configurações acima, e seria bom ir.)
  • Instale a CLI do Layer0:
				
					npm i -g @layer0/cli
				
			
  • Em nuxt.config.js , adicione laier0/nuxt/module ao buildModules:
				
					module.exports = {
  ...
  buildModules: [['@layer0/nuxt/module', { layer0SourceMaps: true }]],
  ...
}
				
			
  • Execute o seguinte para integrar perfeitamente o Nuxt 2 com Layer0 (Edgio):
				
					layer0 init
				
			

Execute o aplicativo Nuxt.js localmente no Layer0

				
					layer0 dev
				
			

Criando rotas dinâmicas de página e API

1. Configure rotas dinâmicas de página

Nuxt torna super fácil criar páginas dinâmicas. Para configurar uma rota dinâmica, crie um ficheiro _slug.vue na pasta de algumas rotas no diretório de páginas da aplicação.

Para obter o parâmetro dinâmico slug, Nuxt fornece um gancho de busca de dados asyncData que tem acesso ao objeto de contexto. Por exemplo, nas páginas seguintes/algumas-rotas/_slug.vue página dinâmica, pode-se obter o slug via params.slug para fazer chamadas de busca de dados antes que a página seja renderizada.

				
					export default {
  mounted() {
    // For a client side transition, fetch the page again to cache it on the edge
    if (typeof window !== 'undefined') {
      fetch(`/some-route/${this.slug}`)
    }
  },
  async asyncData({ req, params, redirect }) {
    let link = undefined
    // If in browser (i.e. on client side)
    if (typeof window !== 'undefined') {
      link = window.location.origin
    }
    // If on server side (either on Layer0 or on local)
    else {
      let hostURL = req ? req.headers.host : process.env.API_URL
      // You have access to req.headers.host when running npm run dev
      // You have access to process.env.API_URL on Layer0 env after deployment, but there is no req header
      // Why's that? It's an added benefit of being on Layer0, as the project is compiled with target: 'static',
      // Which removes the req object from asyncData in nuxt to produce a full static application.
      // This rather is the beauty to ISG with Nuxt.js and Layer0, that you can combine full static site with
      // server side capabilities
      if (hostURL) {
        hostURL = hostURL.replace('http://', '')
        hostURL = hostURL.replace('https://', '')
        if (hostURL.includes('localhost:')) {
          link = `http://${hostURL}`
        } else {
          link = `https://${hostURL}`
        }
      }
    }
    let resp = await fetch(`${link}/api/some-route/${params.slug}.json`)
    if (!resp.ok) {
      redirect(404, '/error-page')
    }
    let data= await resp.json()
    return {
      data,
      slug: params.slug
    }
  },
}
				
			

2. Configure rotas dinâmicas da api

Para configurar rotas dinâmicas de api, o nuxt fornece um middleware de servidor também pode estender o Express que permite a criação de endpoints REST. Por exemplo, o seguinte server-middleware/rest.js irá buscar e retornar dados para todos os endpoints que começam com /api/some-route/ e terminam em .json.

				
					const express = require('express')
const app = express()

app.use(express.json())
app.all('/api/some-route/:slug.json', (req, res) => {
const slug = req.params.slug
// some data fetching calls from the slug
res.json({ data: 'data' })
})

module.exports = app
				
			

Edgio ISG goodies

Para o ISG, use o comando routes.js (criado automaticamente pelo comando init leader0) e adicione a rota para as páginas dinâmicas /some-route/_slug.vue e a rota dinâmica da api /api/some-route/:slug.json como abaixo:

				
					// This file was added by layer0 init.
// You should commit this file to source control.
let example = "test " + qa
const { Router } = require("@layer0/core/router")
const { nuxtRoutes } = require("@layer0/nuxt")
const IF_PRODUCTION = process.env.NODE_ENV === 'production'
module.exports = new Router()
  .match("/service-worker.js", ({ serviceWorker }) => {
    serviceWorker(".nuxt/dist/client/service-worker.js");
  })
  .get("/some-route/:slug", ({ cache }) => {
    cache({
      edge: {
        maxAgeSeconds: 60 * 60 * 24 * 365, // keep the incrementally generated page for a year
      },
      browser: false,
    })
    if (IF_PRODUCTION)
      serveStatic('dist/some-route/:slug.html', {
      // When the user requests a page that is not already statically rendered, fall back to SSR.
        onNotFound: () => renderWithApp(),
      })
    else renderWithApp()
  })
  .get('/api/some-route/:slug.json', ({ serveStatic, cache, renderWithApp }) => {
    cache({
      edge: {
        maxAgeSeconds: 60 * 60 * 24, // cache at the edge for 24 hours
      },
    })
    if (IF_PRODUCTION)
      serveStatic('dist/some-route/:slug.json', {
      // When the user requests a page that is not already statically rendered, fall back to SSR.
        onNotFound: () => renderWithApp(),
      })
    else renderWithApp()
  })
  .use(nuxtRoutes)
				
			

Testes e Implantação

  • Para testar localmente como o aplicativo faria na produção, execute o seguinte:
				
					layer0 build && layer0 run --production
				
			
Para implantar, execute:
				
					layer0 deploy
				
			
  • Celebre! 🎉

Exemplo: Geração estática incremental com Nuxt.js e Edgio

Com o Layer0, é mais fácil do que nunca implementar a Geração Estática Incremental para diferentes propósitos com diferentes frameworks. O seguinte procura implementar o ISG com o Nuxt.js via Layer0.