{"id":11616,"date":"2021-01-13T18:41:03","date_gmt":"2021-01-13T21:41:03","guid":{"rendered":"https:\/\/geekblogti.wpengine.com\/?p=11616"},"modified":"2024-10-29T11:20:27","modified_gmt":"2024-10-29T14:20:27","slug":"o-que-e-next-js","status":"publish","type":"post","link":"https:\/\/www.geekhunter.com/pt/blog\/o-que-e-next-js\/","title":{"rendered":"Entendendo Next.js e aplicando suas funcionalidades"},"content":{"rendered":"\r\n<h2 class=\"wp-block-heading\" id=\"h-o-que-o-next-js\">O que \u00e9 o Next.js?<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Next.js \u00e9 um framework para <a href=\"https:\/\/geekblogti.wpengine.com\/como-aprender-react\/\" target=\"_blank\" rel=\"noreferrer noopener\">React<\/a>. O que isso quer dizer? O React \u00e9 uma biblioteca <strong><a href=\"https:\/\/www.geekhunter.com/pt/blog\/arrays-em-javascript\/\">Javascript<\/a><\/strong> para constru\u00e7\u00e3o de interfaces e o Next \u00e9 considerado um framework pois adiciona v\u00e1rias funcionalidades em cima do React.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Algumas funcionalidades do Next.js<\/strong>: renderiza\u00e7\u00e3o est\u00e1tica e pelo lado do servidor. Possui suporte ao Typescript e um servi\u00e7o de tratamento de rotas muito interessante, que vamos detalhar mais durante esse texto.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Muitas funcionalidades s\u00e3o mais percept\u00edveis com a nossa aplica\u00e7\u00e3o em produ\u00e7\u00e3o, pois o Next possui dois pontos principais em seu objetivo: <strong>tornar nossa aplica\u00e7\u00e3o React mais perform\u00e1tica e a quest\u00e3o da indexa\u00e7\u00e3o do conte\u00fado da p\u00e1gina pelos motores de busca<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Sobre esse ponto da indexa\u00e7\u00e3o, quando desenvolvemos nossas aplica\u00e7\u00f5es da maneira tradicional com React, toda nossa interface e toda chamada \u00e0 API se faz pelo lado do cliente (browser).<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ent\u00e3o, quando algum motor de busca ou crawler tentar indexar uma p\u00e1gina feita em React, geralmente n\u00e3o vai esperar que nossa aplica\u00e7\u00e3o fa\u00e7a o carregamento do Javascript, chamadas \u00e0 API e toda a constru\u00e7\u00e3o da p\u00e1gina.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ou seja, <strong>essa busca retorna vazia<\/strong> ou sem as informa\u00e7\u00f5es mais relevantes para que nossa aplica\u00e7\u00e3o consiga ser indexada.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Onde o Next.js se encaixa nesse cen\u00e1rio? Para gerar toda a p\u00e1gina para o browser, o Next utiliza um servidor Node.js. Usa-se Node.js nesse cen\u00e1rio apenas por entender Javascript nativamente.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Dessa forma, o Next consegue entregar a p\u00e1gina pronta para o Browser, ou seja, todo o HTML, CSS e Javascript. Esse comportamento chama-se <strong>Server-Side-Rendering<\/strong>.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"987\" height=\"643\" class=\"wp-image-11625\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js.png\" alt=\"o-que-e-next-js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js.png 987w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js-150x98.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js-100x65.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js-600x391.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js-450x293.png 450w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/fluxo-requisicao-next-js-829x540.png 829w\" sizes=\"(max-width: 987px) 100vw, 987px\" \/>\r\n<figcaption>Figura 1: Fluxo de requisi\u00e7\u00e3o do usu\u00e1rio com Next.js<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com essa funcionalidade, a p\u00e1gina \u00e9 retornada para o usu\u00e1rio toda montada. Pensando que esse usu\u00e1rio seja um motor de busca, todo o conte\u00fado da p\u00e1gina retorna, dispondo conte\u00fado para ser indexado.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\" id=\"h-integrando-o-typescript-ao-projeto-com-next-js\"><strong>Integrando o Typescript ao projeto com Next.js<\/strong><\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Antes de mais nada, \u00e9 importante entender que gerar um projeto com Next.js \u00e9 bem parecido com a cria\u00e7\u00e3o de um projeto React, por\u00e9m, o comando para criar seu projeto ser\u00e1:<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ser voc\u00ea estiver utilizando o yarn:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>yarn create next-app nome-do-seu-projeto<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Se voc\u00ea estiver utilizando o npm:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>npx create-next-app nome-do-seu-projeto<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ap\u00f3s criar seu projeto, assim como no React, voc\u00ea ver\u00e1 algo como um <em>boilerplate<\/em>, com algumas pastas e arquivos.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para integrar o Typescript em seus projetos, basta instalar os pacotes, como abaixo:<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Utilizando o yarn:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>yarn add typescript @types\/react @types\/node \u2013D<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Utilizando o npm:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>npm install typescript @types\/react @types\/node \u2013D<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ap\u00f3s a instala\u00e7\u00e3o desses pacotes, basta alterar os arquivos para ts ou tsx. Juntamente com isso, para fazer sua aplica\u00e7\u00e3o rodar, basta executar o comando <em>yarn dev<\/em> ou <em>npm run dev<\/em>, dependendo do gerenciador de pacotes que voc\u00ea esteja utilizando.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O arquivo <em>tsconfig.json<\/em> ser\u00e1 gerado automaticamente com todas as configura\u00e7\u00f5es necess\u00e1rias para utiliza\u00e7\u00e3o do Typescript.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\" id=\"h-como-funciona-a-constru-o-das-p-ginas-e-rotas\">Como funciona a constru\u00e7\u00e3o das p\u00e1ginas e rotas?<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A figura 2 mostra a estrutura de pastas ao iniciar um projeto Next.js na sua IDE. Veja que as altera\u00e7\u00f5es nos arquivos para utiliza\u00e7\u00e3o do Typescript e React (tsx) est\u00e3o prontas.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" class=\"wp-image-11624\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide.png\" alt=\"pastas-iniciais-ide\" width=\"204\" height=\"554\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide.png 283w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide-55x150.png 55w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide-37x100.png 37w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide-221x600.png 221w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide-166x450.png 166w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide-199x540.png 199w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-pastas-ide-150x407.png 150w\" sizes=\"(max-width: 204px) 100vw, 204px\" \/>\r\n<figcaption>Figura 2: Estrutura de pastas inicial de um projeto com o Next.js<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa vai ser basicamente a estrutura que voc\u00ea ver\u00e1 inicialmente. <strong>Uma informa\u00e7\u00e3o importante \u00e9 que a pasta com nome \u201cpages\u201d N\u00c3O pode ter seu nome alterado<\/strong>, pois, \u00e9 a partir dessa pasta que o Next far\u00e1 a busca por suas p\u00e1ginas. Colocar essa pasta dentro de outra pasta chamada \u201csrc\u201d \u00e9 o m\u00e1ximo que pode ser feito, como mostra a figura 3.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" class=\"wp-image-11626\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src.png\" alt=\"pasta-src-adicionada\" width=\"202\" height=\"495\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src.png 326w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src-61x150.png 61w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src-41x100.png 41w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src-245x600.png 245w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src-184x450.png 184w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src-220x540.png 220w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/pastas-ide-com-src-150x368.png 150w\" sizes=\"(max-width: 202px) 100vw, 202px\" \/>\r\n<figcaption>Figura 3: Inserindo a pasta \u201csrc\u201d ao projeto.<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\" id=\"h-roteamento-das-p-ginas\">Roteamento das p\u00e1ginas<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Uma funcionalidade bem legal do Next \u00e9 como ele trata o roteamento das p\u00e1ginas. N\u00e3o \u00e9 preciso realizar nenhum tipo de configura\u00e7\u00e3o ou alguma biblioteca para fazer o tratamento de rotas.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nesse sentido, basta criar uma p\u00e1gina dentro da pasta \u201cpages\u201d e o pr\u00f3prio Next.js vai entender que aquele arquivo \u201c.tsx \u201c \u00e9 uma rota acess\u00e1vel. Esse comportamento torna a cria\u00e7\u00e3o e roteamento das p\u00e1ginas muito mais f\u00e1cil.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ao criar um arquivo dentro da pasta \u201cpages\u201d, o Next.js automaticamente ir\u00e1 assumir que o nome daquele arquivo \u00e9 um endere\u00e7o acess\u00edvel da sua aplica\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Caso seja necess\u00e1rio criar algum arquivo ou alguma pasta dentro dessa pasta que n\u00e3o ser\u00e1 vista como um endere\u00e7o, basta acrescentar o \u201c_\u201d antes do nome do arquivo ou pasta, assim como \u00e9 com o arquivo \u201c<em>_app.tsx<\/em>\u201d.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ainda dentro das funcionalidades de rotas do Next, \u00e9 importante falar sobre <strong>rotas din\u00e2micas<\/strong>. Caso seja necess\u00e1rio passar algum par\u00e2metro ou um nome de algum produto, por exemplo, para a rota, basta incluir dois colchetes no nome da p\u00e1gina, como mostra a figura 4:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"123\" class=\"wp-image-11630\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/rotas-dinamicas-next-js.png\" alt=\"rotas-dinamicas-next.js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/rotas-dinamicas-next-js.png 630w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/rotas-dinamicas-next-js-150x29.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/rotas-dinamicas-next-js-100x20.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/rotas-dinamicas-next-js-600x117.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/rotas-dinamicas-next-js-450x88.png 450w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/>\r\n<figcaption>Figura 4: Utilizando rotas din\u00e2micas com o Next.js<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">&nbsp;<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Dessa forma, veja como ficou a estrutura de pastas:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"639\" height=\"264\" class=\"wp-image-11623\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/estrutura-de-pastas-atual-next-js.png\" alt=\"estrutura-de-pastas-atual-next-js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-de-pastas-atual-next-js.png 639w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-de-pastas-atual-next-js-150x62.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-de-pastas-atual-next-js-100x41.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-de-pastas-atual-next-js-600x248.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/estrutura-de-pastas-atual-next-js-450x186.png 450w\" sizes=\"(max-width: 639px) 100vw, 639px\" \/>\r\n<figcaption>Figura 5: Estrutura de pastas atual do projeto.<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Observe que o nome entre colchetes poderia ser qualquer outro, por\u00e9m, para representar o slug de algum produto de uma loja, usamos esse nome.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para recuperar esse par\u00e2metro, basta utilizar o <em>useRouter()<\/em> do pr\u00f3prio next\/router, como mostra a figura 6:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"701\" height=\"120\" class=\"wp-image-11627\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/recuperar-parametro.png\" alt=\"recuperar-parametro-next.js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/recuperar-parametro.png 701w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/recuperar-parametro-150x26.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/recuperar-parametro-100x17.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/recuperar-parametro-600x103.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/recuperar-parametro-450x77.png 450w\" sizes=\"(max-width: 701px) 100vw, 701px\" \/>\r\n<figcaption>Figura 6: Recuperando um par\u00e2metro da rota<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import { useRouter } from 'next\/router';\r\n \r\nexport default function product() {\r\n    const router = useRouter();\r\n \r\n    return &lt;h1&gt;{router.query.slug}&lt;\/h1&gt;\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\" id=\"h-tratamento-de-dados-vindos-de-uma-api\"><strong>Tratamento de dados vindos de uma API<\/strong><\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Em seguida, para mostrar como o Next trata requisi\u00e7\u00f5es que v\u00eam de uma API, vamos criar uma API de exemplo, utilizando o json-server, que j\u00e1 nos traz bastante funcionalidades.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">S\u00f3 para exemplificar, segue abaixo o c\u00f3digo da nossa API:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>{\r\n  \"categories\": [\r\n    { \"id\": \"teclados\", \"title\": \"Teclados\" },\r\n    { \"id\": \"notebooks\", \"title\": \"Notebooks\" },\r\n    { \"id\": \"armazenamento\", \"title\": \"SSD\" },\r\n    { \"id\": \"gabinetes\", \"title\": \"Gabinetes\" },\r\n    { \"id\": \"mouses\", \"title\": \"Mouses\" }\r\n  ],\r\n  \"products\": [\r\n    { \"id\": 1, \"title\": \"Teclado Mec\u00e2nico\", \"price\": 350, \"category_id\": \"teclados\", \"slug\": \"teclado-mecanico\"},\r\n    { \"id\": 2, \"title\": \"Mouse Gamer\", \"price\": 120.9, \"category_id\": \"mouses\", \"slug\": \"mouse-gamer\"},\r\n    { \"id\": 3, \"title\": \"SSD 512GB\", \"price\": 650.45, \"category_id\": \"ssd\", \"slug\": \"ssd-512gb\"},\r\n    { \"id\": 4, \"title\": \"Notebook Gamer\", \"price\": 7000, \"category_id\": \"notebooks\", \"slug\": \"notebook-gamer\"},\r\n    { \"id\": 5, \"title\": \"Monitor Gamer\", \"price\": 2000, \"category_id\": \"monitores\", \"slug\": \"monitor-gamer\"},\r\n    { \"id\": 6, \"title\": \"Gabinete Gamer\", \"price\": 500, \"category_id\": \"gabinetes\", \"slug\": \"gabinete-gamer\"}\r\n  ],\r\n  \"recommended\": [\r\n    { \"id\": 1, \"title\": \"Teclado Merc\u00e2nico\", \"price\": 350, \"category_id\": \"teclados\", \"slug\": \"teclado-mecanico\"},\r\n    { \"id\": 4, \"title\": \"Notebook Gamer\", \"price\": 7000, \"category_id\": \"notebooks\", \"slug\": \"notebook-gamer\"}\r\n  ]\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Como primeiro exemplo, vamos falar sobre o <strong>Client Side Fetching<\/strong>, para consumir essa API. Esse m\u00e9todo \u00e9 a maneira de buscar informa\u00e7\u00f5es de uma API do jeito mais tradicional poss\u00edvel no React: usando o <em>useEffect<\/em>, por exemplo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A estrat\u00e9gia de Client Side Fetching deve ser utilizada apenas quando n\u00e3o h\u00e1 a necessidade de que as informa\u00e7\u00f5es vindas da API sejam indexadas pelos motores de busca, pois, uma chamada vinda do useEffect s\u00f3 ser\u00e1 disparada no browser, ou seja, o conte\u00fado da p\u00e1gina n\u00e3o ser\u00e1 renderizado pelo lado do servidor. \u00c9 poss\u00edvel observar esse comportamento desabilitando o javascript do borwser.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com o javascript desabilitado, as informa\u00e7\u00f5es vindas da API atrav\u00e9s do <em>useEffect<\/em>, n\u00e3o ser\u00e3o exibidas em nenhum momento. Abaixo h\u00e1 um c\u00f3digo de uma implementa\u00e7\u00e3o desse conceito:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import React, { FormEvent, useEffect, useState } from 'react';\r\n \r\nimport api from '..\/service\/api';\r\n \r\ninterface IProducts {\r\n    id: number;\r\n    title: string;\r\n}\r\n \r\nexport default function Home() {\r\n    const [products, setProducts] = useState&lt;IProducts[]&gt;([]);\r\n \r\n\/\/ Chamada \u00e0 API utilizando o Client Side Fetching\r\n    useEffect(() =&gt; {\r\n        api.get('http:\/\/localhost:3333\/products').then(response =&gt; {\r\n          setProducts(response.data);\r\n        })\r\n    }, []);\r\n \r\n    return (\r\n        &lt;div&gt;\r\n          &lt;h1&gt;Products&lt;\/h1&gt;\r\n        \r\n          &lt;section&gt;\r\n            &lt;ul&gt;\r\n              {products.map(product =&gt; {\r\n                  return (\r\n                      &lt;li key={product.id}&gt;\r\n                        {product.title}\r\n                      &lt;\/li&gt;\r\n                    )\r\n                })}\r\n            &lt;\/ul&gt;\r\n          &lt;\/section&gt;\r\n        &lt;\/div&gt;\r\n      )\r\n}\r\n \r\nexport default Home;<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Na figura 7 voc\u00ea ver\u00e1 o resultado dessa chamada \u00e0 nossa API:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"354\" height=\"289\" class=\"wp-image-11619\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/chamada-a-api.png\" alt=\"cahamda-api-next.js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/chamada-a-api.png 354w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/chamada-a-api-150x122.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/chamada-a-api-100x82.png 100w\" sizes=\"(max-width: 354px) 100vw, 354px\" \/>\r\n<figcaption>Figura 7: Chamada \u00e0 API utilizando o Client Side Fetching<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Como \u00e9 poss\u00edvel verificar, essa chamada para o nosso backend funciona normalmente utilizando o Next.js, da mesma forma do que quando utilizamos o React sem esse framework. Mas, o que eu gostaria de mostrar \u00e9 o comportamento a seguir. Verifiquem, na figura 8, o resultado se n\u00f3s desabilitamos o Javascript do nosso navegador e damos um refresh na p\u00e1gina:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"807\" height=\"306\" class=\"wp-image-11622\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/desabilitar-javascript-next-js.png\" alt=\"desabilitar-javascript-next-js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/desabilitar-javascript-next-js.png 807w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/desabilitar-javascript-next-js-150x57.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/desabilitar-javascript-next-js-100x38.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/desabilitar-javascript-next-js-600x228.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/desabilitar-javascript-next-js-450x171.png 450w\" sizes=\"(max-width: 807px) 100vw, 807px\" \/>\r\n<figcaption>Figura 8: Sem retorno visual desabilitando o Javascript do browser.<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Observe que nenhuma informa\u00e7\u00e3o de nossa chamada utilizando o useEffect foi exibida em tela. Como explicado anteriormente, essa chamada ser\u00e1 executada apenas pelo lado do cliente.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Existe algum problema com esse tipo de chamada? Claro que n\u00e3o, por\u00e9m, \u00e9 importante apenas entender as estrat\u00e9gias de renderiza\u00e7\u00e3o dispon\u00edveis e em quais momentos elas podem se aplicar. Nesse caso, se for necess\u00e1ria a indexa\u00e7\u00e3o por motores de busca, essa n\u00e3o ser\u00e1 a melhor estrat\u00e9gia.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\" id=\"h-server-side-rendering\"><strong>Server Side Rendering<\/strong><\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Como j\u00e1 adiantado anteriormente, uma outra maneira de consumo de dados em uma API no Next.js, \u00e9 utilizando o Sever Side Rendering. Essa estrat\u00e9gia nos oferece a possibilidade de apresentar todos os dados de uma s\u00f3 vez para o cliente. Isso implica em carregar todos os dados primeiramente no lado do servidor, nesse caso, utilizando um servidor Node.js (lembra o fluxo que a gente apresentou no in\u00edcio desse artigo?), e assim todo o conte\u00fado da p\u00e1gina estar\u00e1 dispon\u00edvel para ser exibido para o cliente de uma s\u00f3 vez.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">S\u00f3 para exemplificar melhor esse comportamento, vamos executar nosso <em>json-server<\/em> utilizando um par\u00e2metro \u201c<em>-d 2000<\/em>\u201d, para simular um delay de 2 segundos em nossa chamada ao backend.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O comando ficar\u00e1 assim:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>npx json-server server.json -p 3333 -d 2000<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com esse delay na chamada ao nosso backend, vai ser poss\u00edvel observar que o t\u00edtulo da nossa p\u00e1gina, no caso, \u201cProducts\u201d, exibir\u00e1 2 segundos antes do conte\u00fado da chamada para a nossa API.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-11621\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/delay-backend.png\" alt=\"\" width=\"201\" height=\"79\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/delay-backend.png 437w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/delay-backend-150x59.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/delay-backend-100x39.png 100w\" sizes=\"(max-width: 201px) 100vw, 201px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Se desabilitarmos o Javascript do navegador, vamos ver que o conte\u00fado nunca ser\u00e1 exibido, como exemplificado na se\u00e7\u00e3o anterior. Para contornar esse comportamento, o Next.js oferece a funcionalidade de Server Side Rendering.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\" id=\"h-como-funciona-na-pr-tica-o-server-side-rendering-em-next-js\">Como funciona na pr\u00e1tica o Server Side Rendering em Next.js<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para come\u00e7ar, vamos tirar toda a chamada feita pelo <em>useEffect<\/em> do nosso c\u00f3digo:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import React from 'react';\r\n \r\nimport api from '..\/service\/api';\r\n \r\ninterface IProducts {\r\n    id: number;\r\n    title: string;\r\n}\r\n \r\nexport default function Home() {\r\n    return (\r\n      &lt;div&gt;\r\n        &lt;h1&gt;Products&lt;\/h1&gt;\r\n      \r\n        &lt;section&gt;\r\n          &lt;ul&gt;\r\n            {products.map(product =&gt; {\r\n                return (\r\n                    &lt;li key={product.id}&gt;\r\n                      {product.title}\r\n                    &lt;\/li&gt;\r\n                  )\r\n              })}\r\n          &lt;\/ul&gt;\r\n        &lt;\/section&gt;\r\n      &lt;\/div&gt;\r\n    )\r\n  }\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora vamos utilizar uma fun\u00e7\u00e3o chamada getServerSideProps. Ao utilizarmos essa fun\u00e7\u00e3o, o Next.js, far\u00e1 a pr\u00e9 renderiza\u00e7\u00e3o da p\u00e1gina usando o retorno dessa fun\u00e7\u00e3o. \u00c9 poss\u00edvel acessar qualquer retorno dessa fun\u00e7\u00e3o em nosso componente, atrav\u00e9s de propriedades.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Vamos transferir nossa chamada \u00e0 API para essa fun\u00e7\u00e3o, fazendo algumas altera\u00e7\u00f5es para utiliz\u00e1-la com o formado async await, que \u00e9 uma sintaxe mais moderna. Al\u00e9m da chamada \u00e0 API, como estamos utilizando Typescript, vamos tipar essa fun\u00e7\u00e3o para que possamos retornar as propriedades que precisamos. Por isso vamos importar, de dentro do Next.js, a tipagem GetServerSideProps e no retorno da fun\u00e7\u00e3o j\u00e1 vamos ter dispon\u00edvel nossas props.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>export const getServerSideProps: GetServerSideProps = async () =&gt; {\r\n  const response = await api.get('http:\/\/localhost:3333\/products');\r\n \r\n  const products = await response.data;\r\n \r\n  return {\r\n    props: {\r\n      \r\n    }\r\n  }\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Por\u00e9m, se buscarmos alguma informa\u00e7\u00e3o \u00e0 ser retornada dessas props n\u00e3o vamos encontrar nada. Por isso, vamos criar uma interface chamada ProductsProps, para explicitarmos qual ou quais propriedades queremos retornar dessa fun\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>interface IProducts {\r\n    id: number;\r\n    title: string;\r\n}\r\n \r\ninterface ProductProps {\r\n  products: IProducts[];\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Essa propriedade ser\u00e1 um array de produtos e ser\u00e1 o par\u00e2metro de retorno de GetServerSideProps.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>export const getServerSideProps: GetServerSideProps&lt;ProductProps&gt; = async () =&gt; {\r\n  const response = await api.get('http:\/\/localhost:3333\/products');\r\n \r\n  const products = await response.data;\r\n \r\n  return {\r\n    props: {\r\n      \r\n    }\r\n  }\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\" id=\"h-propriedades-para-retorno\">Propriedades para retorno<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Quando fazemos isso, j\u00e1 temos dispon\u00edvel nossas propriedades para retorno, como mostra a figura 9:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"891\" height=\"266\" class=\"wp-image-11629\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/retorno-funcao-gerserversideprops.png\" alt=\"retorno-funcao-gerserversideprops\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-funcao-gerserversideprops.png 891w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-funcao-gerserversideprops-150x45.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-funcao-gerserversideprops-100x30.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-funcao-gerserversideprops-600x179.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-funcao-gerserversideprops-450x134.png 450w\" sizes=\"(max-width: 891px) 100vw, 891px\" \/>\r\n<figcaption>Figura 9: Exibindo as propriedades de retorno da fun\u00e7\u00e3o getServerSideProps.<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para utilizarmos essa propriedade, precisamos passar como par\u00e2metro para nosso componente, que nesse caso \u00e9 o Home. Precisamos tipar essa propriedade, para deixar claro que tipo de par\u00e2metro estamos repassando para nosso componente.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>export default function Home({ products }: ProductProps) {\r\n    return (\r\n      &lt;div&gt;\r\n        &lt;h1&gt;Products&lt;\/h1&gt;\r\n      \r\n        &lt;section&gt;\r\n          &lt;ul&gt;\r\n            {products.map(product =&gt; {\r\n                return (\r\n                    &lt;li key={product.id}&gt;\r\n                      {product.title}\r\n                    &lt;\/li&gt;\r\n                  )\r\n              })}\r\n          &lt;\/ul&gt;\r\n        &lt;\/section&gt;\r\n      &lt;\/div&gt;\r\n    )\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com isso podemos observar o comportamento da p\u00e1gina bem diferente. Ao realizarmos a chamada para nossa API, vemos que toda a p\u00e1gina demora os 2 segundos, ou seja, toda a p\u00e1gina carrega de uma s\u00f3 vez. Esse comportamento \u00e9 o que desejamos quando precisamos indexar nossas p\u00e1ginas para algum motor de busca, como o Google, por exemplo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com a p\u00e1gina sendo gerada pelo lado do servidor, nossa aplica\u00e7\u00e3o n\u00e3o vai mais depender do Javascript estar habilitado. Tudo j\u00e1 foi criado e passado para o cliente. Observe o comportamento no v\u00eddeo seguinte:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-11620\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/comportamento-video.png\" alt=\"\" width=\"210\" height=\"79\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/comportamento-video.png 286w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/comportamento-video-150x57.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/comportamento-video-100x38.png 100w\" sizes=\"(max-width: 210px) 100vw, 210px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Apenas uma observa\u00e7\u00e3o. \u00c9 recomendado utilizar esse m\u00e9todo apenas quando \u00e9 necess\u00e1rio gerar algum conte\u00fado din\u00e2mico para o cliente ou que precisa estar dispon\u00edvel para os motores de busca.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Voc\u00ea vai precisar avaliar a necessidade da sua aplica\u00e7\u00e3o e qual experi\u00eancia voc\u00ea quer oferecer para seus usu\u00e1rios, pois, como \u00e9 poss\u00edvel observar, toda a p\u00e1gina demorou os 2 segundos para aparecer.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\" id=\"h-static-site-generation\"><strong>Static Site Generation<\/strong><\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Um outro m\u00e9todo de <em>data fetching<\/em> dentro do Next.js \u00e9 o <strong>Static Site Generation<\/strong>. Traduzindo ao p\u00e9 da letra, seria algo como \u201cGera\u00e7\u00e3o de Sites Est\u00e1ticos\u201d. Basicamente, p\u00e1ginas est\u00e1ticas, s\u00e3o p\u00e1ginas que n\u00e3o ter\u00e3o atualiza\u00e7\u00f5es constantes.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Onde seria aplic\u00e1vel ou em qual cen\u00e1rio seria poss\u00edvel obter algum benef\u00edcio desse m\u00e9todo? Imagina que voc\u00ea possui um blog ou um ecommerce que em determinada p\u00e1gina n\u00e3o precisa de atualiza\u00e7\u00e3o constante.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O comportamento dela seria algo como, fazer uma chamada \u00e0 API e depois exibir aquele conte\u00fado para todos os usu\u00e1rios por um determinado tempo sem atualiza\u00e7\u00e3o.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ap\u00f3s a p\u00e1gina ser carregada ou ter feito alguma requisi\u00e7\u00e3o ao banco de dados, nenhuma outra chamada ao banco ou qualquer outra requisi\u00e7\u00e3o \u00e0 API ser\u00e1 feita at\u00e9 o pr\u00f3ximo \u201cciclo\u201d de atualiza\u00e7\u00e3o, que \u00e9 totalmente configur\u00e1vel, como veremos mais adiante.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Dessa forma, a p\u00e1gina ser\u00e1 servida de forma totalmente est\u00e1tica. H\u00e1 um ganho relevante de performance utilizando essa forma de servir p\u00e1ginas.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\" id=\"h-e-como-implementar-o-site-est-tico-com-next-js\">E como implementar o site est\u00e1tico com Next.js<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O princ\u00edpio para implementa\u00e7\u00e3o \u00e9 quase igual ao Server Side Rendering. Para n\u00e3o apagar o conte\u00fado criado at\u00e9 aqui, pois, ficar\u00e1 dispon\u00edvel para voc\u00ea baixar e consultar no GitHub, vamos criar um outro componente para exemplificar o comportamento da nossa p\u00e1gina.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Vamos criar um componente chamado \u201ccategories\u201d. Esse componente exibir\u00e1 todas as categorias de produtos cadastrados em nossa API. Acredito que n\u00e3o seja necess\u00e1rio explicar detalhadamente o c\u00f3digo abaixo, pois, \u00e9 basicamente o mesmo c\u00f3digo apresentado na se\u00e7\u00e3o anterior, por\u00e9m, agora estamos chamando uma fun\u00e7\u00e3o chamada getStaticProps, que possui o tipo GetStaticProps, importado de dentro de Next.js.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import React from 'react';\r\nimport { GetStaticProps } from 'next';\r\n \r\nimport api from '..\/service\/api';\r\n \r\nimport { Container } from '..\/..\/styles\/Dashboard\/styles';\r\n \r\ninterface ICategories {\r\n    id: number;\r\n    title: string;\r\n}\r\n \r\ninterface CategoryProps {\r\n  categories: ICategories[];\r\n}\r\n \r\nexport default function categories({ categories }: CategoryProps) {\r\n    return (\r\n        &lt;Container&gt;\r\n            &lt;h1&gt;Categories&lt;\/h1&gt;\r\n        \r\n            &lt;section&gt;\r\n            &lt;ul&gt;\r\n                {categories.map(categorie =&gt; {\r\n                    return (\r\n                        &lt;li key={categorie.id}&gt;\r\n                        {categorie.title}\r\n                        &lt;\/li&gt;\r\n                    )\r\n                })}\r\n            &lt;\/ul&gt;\r\n            &lt;\/section&gt;\r\n        &lt;\/Container&gt;\r\n    )\r\n}\r\n \r\nexport const getStaticProps: GetStaticProps&lt;CategoryProps&gt; = async () =&gt; {\r\n    const response = await api.get('http:\/\/localhost:3333\/categories');\r\n    const categories = await response.data;\r\n \r\n    return {\r\n        props: {\r\n            categories,\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ap\u00f3s a implementa\u00e7\u00e3o da nossa fun\u00e7\u00e3o getStaticProps, nossa p\u00e1gina categories est\u00e1 sendo gerada totalmente de forma est\u00e1tica. Em ambiente de desenvolvimento \u00e9 dif\u00edcil reproduzir esse comportamento, pois, estamos utilizando um delay de 2 segundos em nossa chamada \u00e0 API. Mas em ambiente de produ\u00e7\u00e3o, essa p\u00e1gina seria carregada totalmente de forma est\u00e1tica, gerando um ganho de performance muito significativo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Na figura 10 podemos ver nossa p\u00e1gina.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"811\" height=\"380\" class=\"wp-image-11628\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/retorno-api.png\" alt=\"retorno-api-next.js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-api.png 811w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-api-150x70.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-api-100x47.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-api-600x281.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/retorno-api-450x211.png 450w\" sizes=\"(max-width: 811px) 100vw, 811px\" \/>\r\n<figcaption>Figura 10: Retorno da nossa API utilizando o m\u00e9todo Static Site Generation<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ok, j\u00e1 temos nossa p\u00e1gina est\u00e1tica sendo gerada, mas e se eu quiser que o conte\u00fado dessa p\u00e1gina seja atualizado com alguma informa\u00e7\u00e3o ou que alguma informa\u00e7\u00e3o seja retirada? Nesse momento, caso alguma informa\u00e7\u00e3o, por exemplo, seja acrescentada \u00e0 nossa API, essa p\u00e1gina n\u00e3o seria atualizada em tempo real, lembre-se que ela est\u00e1 sendo gerada estaticamente.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Por exemplo, ao acrescentar mais uma categoria em nossa API, nossa p\u00e1gina n\u00e3o faria uma nova chamada a API para atualizar o conte\u00fado exibido e permaneceria desatualizada em rela\u00e7\u00e3o ao conte\u00fado armazenado no banco de dados. A figura 11 mostra que acrescentamos mais uma categoria em nossa API:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-11618\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/acrescentando-item-api.png\" alt=\"acrescentando-item-api-next.js\" width=\"618\" height=\"219\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/acrescentando-item-api.png 821w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/acrescentando-item-api-150x53.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/acrescentando-item-api-100x36.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/acrescentando-item-api-600x213.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/acrescentando-item-api-450x160.png 450w\" sizes=\"(max-width: 618px) 100vw, 618px\" \/>\r\n<figcaption>Figura 11: Acrescentando um item na API<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\" id=\"h-getstaticprops\"><em>GetStaticProps<\/em><\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para contornar esse comportamento, a fun\u00e7\u00e3o do tipo <em>GetStaticProps<\/em>, oferece uma propriedade chamada \u201crevalidate\u201d. Essa propriedade \u00e9 utilizada para informar \u00e0 nossa fun\u00e7\u00e3o quando o conte\u00fado da p\u00e1gina deve ser atualizado em segundos. Por exemplo, no c\u00f3digo a seguir, inserimos 5, para indicar que queremos que o conte\u00fado da p\u00e1gina seja revalidado ou atualizado a cada 5 segundos.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>export const getStaticProps: GetStaticProps&lt;CategoryProps&gt; = async () =&gt; {\r\n    const response = await api.get('http:\/\/localhost:3333\/categories');\r\n    const categories = await response.data;\r\n \r\n    return {\r\n        props: {\r\n            categories,\r\n        },\r\n        revalidate: 5,\r\n    }\r\n}\r\n<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Em ambiente de desenvolvimento \u00e9 dif\u00edcil reproduzir o comportamento do revalidate, por\u00e9m, em um ambiente de produ\u00e7\u00e3o, o Next.js far\u00e1 a atualiza\u00e7\u00e3o da p\u00e1gina totalmente de forma autom\u00e1tica, sem qualquer outra a\u00e7\u00e3o nossa. <strong>Isso \u00e9 extremamente \u00fatil no dia a dia para ganhar performance em nossas aplica\u00e7\u00f5es.\u00a0<\/strong><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">S\u00f3 para se ter uma ideia de performance, imagina que sua aplica\u00e7\u00e3o tenha 1000 acessos em um intervalo de sessenta segundos. Ao inv\u00e9s de mil chamadas \u00e0 sua API, seriam apenas 12.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">\u00c9 um ganho gigante em performance. Ressaltando que, \u00e9 sempre importante avaliar as necessidades dos usu\u00e1rios que v\u00e3o utilizar sua aplica\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\" id=\"h-conclus-o\">Conclus\u00e3o<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Por fim, nesse artigo tivemos uma vis\u00e3o geral sobre o que \u00e9 o Next.js e onde ele pode se encaixar em nossos projetos. O Next.js \u00e9 uma ferramenta muito vers\u00e1til e pode ser utilizada na grande maioria de seus projetos.\u00a0<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Tamb\u00e9m apresentamos algumas fun\u00e7\u00f5es e seus comportamentos, como o Client Side Fetching, que apesar do nome bonito, \u00e9 uma chamada \u00e0 API da forma tradicional feita no React.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O Server Side Rendering, que \u00e9 a gera\u00e7\u00e3o de conte\u00fado sendo feita pelo lado do servidor Node.js que o Next.js possui, que apresenta a p\u00e1gina totalmente pronta de uma s\u00f3 vez para o cliente.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">E por \u00faltimo, foi apresentado a fun\u00e7\u00e3o Static Site Generation, que gera as p\u00e1ginas de forma est\u00e1tica, oferecendo um ganho de performance bastante interessante.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para extrair ao m\u00e1ximo de benef\u00edcios dos recursos oferecidos pelo Next.js, \u00e9 sempre importante avaliar o cen\u00e1rio em que sua aplica\u00e7\u00e3o vai ser utilizada e se algum dos recursos aqui apresentados faz sentido e em quais momentos. Nesse sentido, o bom senso e um bom planejamento s\u00e3o sempre bem-vindos nessas horas.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Reposit\u00f3rio do GitHub: <a href=\"https:\/\/github.com\/AlbertDev33\/Artigo-para-geekhunter\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https:\/\/github.com\/AlbertDev33\/Artigo-para-geekhunter<\/a><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Refer\u00eancias: <a href=\"https:\/\/nextjs.org\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Next.js by Vercel &#8211; The React Framework<\/a><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Leia mais sobre as fun\u00e7\u00f5es apresentadas nesse artigo aqui: <a href=\"https:\/\/nextjs.org\/docs\/basic-features\/data-fetching\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Basic Features: Data Fetching | Next.js<\/a><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bit.ly\/3nKdyOR\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"200\" class=\"wp-image-11634\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2021\/01\/cta-next-js.png\" alt=\"cta-banner-next.js\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/cta-next-js.png 720w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/cta-next-js-150x42.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/cta-next-js-100x28.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/cta-next-js-600x167.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/cta-next-js-450x125.png 450w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><\/figure>\r\n","protected":false},"excerpt":{"rendered":"<p>O que \u00e9 o Next.js? Next.js \u00e9 um framework para React. O que isso quer dizer? O React \u00e9 uma biblioteca Javascript para constru\u00e7\u00e3o de interfaces e o Next \u00e9 considerado um framework pois adiciona v\u00e1rias funcionalidades em cima do React. Algumas funcionalidades do Next.js: renderiza\u00e7\u00e3o est\u00e1tica e pelo lado do servidor. Possui suporte ao [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":11635,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-11616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimiento-de-software"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Next.js: O que \u00e9 e onde encaixar em meus projetos<\/title>\n<meta name=\"description\" content=\"Quer saber mais sobre Next.js e onde ele se encaixa melhor em seus projetos? Ent\u00e3o leia esse artigo para tirar todas as suas d\u00favidas!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Entendendo Next.js e aplicando suas funcionalidades\" \/>\n<meta property=\"og:description\" content=\"O que \u00e9 o Next.js? Next.js \u00e9 um framework para React. O que isso quer dizer? O React \u00e9 uma biblioteca Javascript para constru\u00e7\u00e3o de interfaces e o Next \u00e9\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Geekhunter\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geekhunterbr\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-13T21:41:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-29T14:20:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/next-js.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"GeekHunter\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:site\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"GeekHunter\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/\"},\"author\":{\"name\":\"GeekHunter\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/2557a9c634f56710131feb2f9a024e19\"},\"headline\":\"Entendendo Next.js e aplicando suas funcionalidades\",\"datePublished\":\"2021-01-13T21:41:03+00:00\",\"dateModified\":\"2024-10-29T14:20:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/\"},\"wordCount\":2768,\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/next-js.jpg\",\"articleSection\":[\"Desenvolvimiento de software\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/\",\"name\":\"Next.js: O que \u00e9 e onde encaixar em meus projetos\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/next-js.jpg\",\"datePublished\":\"2021-01-13T21:41:03+00:00\",\"dateModified\":\"2024-10-29T14:20:27+00:00\",\"description\":\"Quer saber mais sobre Next.js e onde ele se encaixa melhor em seus projetos? Ent\u00e3o leia esse artigo para tirar todas as suas d\u00favidas!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/o-que-e-next-js\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/next-js.jpg\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/next-js.jpg\",\"width\":1920,\"height\":1280,\"caption\":\"next.js\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/o-que-e-next-js\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mundo TI\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Desenvolvimiento de software\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/desenvolvimiento-de-software\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Entendendo Next.js e aplicando suas funcionalidades\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"name\":\"Blog de TI\",\"description\":\"Dicas para o RH e profissionais da \u00e1rea TI\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\",\"name\":\"GeekHunter\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"width\":300,\"height\":300,\"caption\":\"GeekHunter\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/x.com\\\/geekhunterbr\",\"https:\\\/\\\/www.instagram.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geekhunter-brasil\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GeekHunterOfficial\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/2557a9c634f56710131feb2f9a024e19\",\"name\":\"GeekHunter\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ceb73d64e2eebbb4571c11285d1838bf094fa59a5dfc51be91146149b751f94d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ceb73d64e2eebbb4571c11285d1838bf094fa59a5dfc51be91146149b751f94d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ceb73d64e2eebbb4571c11285d1838bf094fa59a5dfc51be91146149b751f94d?s=96&d=mm&r=g\",\"caption\":\"GeekHunter\"},\"description\":\"Artigos escritos pela equipe de conte\u00fado da GeekHunter.\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/author\\\/geekhunter\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Next.js: O que \u00e9 e onde encaixar em meus projetos","description":"Quer saber mais sobre Next.js e onde ele se encaixa melhor em seus projetos? Ent\u00e3o leia esse artigo para tirar todas as suas d\u00favidas!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/","og_locale":"pt_BR","og_type":"article","og_title":"Entendendo Next.js e aplicando suas funcionalidades","og_description":"O que \u00e9 o Next.js? Next.js \u00e9 um framework para React. O que isso quer dizer? O React \u00e9 uma biblioteca Javascript para constru\u00e7\u00e3o de interfaces e o Next \u00e9","og_url":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/","og_site_name":"Blog Geekhunter","article_publisher":"https:\/\/www.facebook.com\/geekhunterbr\/","article_published_time":"2021-01-13T21:41:03+00:00","article_modified_time":"2024-10-29T14:20:27+00:00","og_image":[{"width":1920,"height":1280,"url":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/next-js.jpg","type":"image\/jpeg"}],"author":"GeekHunter","twitter_card":"summary_large_image","twitter_creator":"@geekhunterbr","twitter_site":"@geekhunterbr","twitter_misc":{"Escrito por":"GeekHunter","Est. tempo de leitura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#article","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/"},"author":{"name":"GeekHunter","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/2557a9c634f56710131feb2f9a024e19"},"headline":"Entendendo Next.js e aplicando suas funcionalidades","datePublished":"2021-01-13T21:41:03+00:00","dateModified":"2024-10-29T14:20:27+00:00","mainEntityOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/"},"wordCount":2768,"publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/next-js.jpg","articleSection":["Desenvolvimiento de software"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/","name":"Next.js: O que \u00e9 e onde encaixar em meus projetos","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#primaryimage"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/next-js.jpg","datePublished":"2021-01-13T21:41:03+00:00","dateModified":"2024-10-29T14:20:27+00:00","description":"Quer saber mais sobre Next.js e onde ele se encaixa melhor em seus projetos? Ent\u00e3o leia esse artigo para tirar todas as suas d\u00favidas!","breadcrumb":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.geekhunter.com/pt/blog\/o-que-e-next-js\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#primaryimage","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2021\/01\/next-js.jpg","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2021\/01\/next-js.jpg","width":1920,"height":1280,"caption":"next.js"},{"@type":"BreadcrumbList","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/o-que-e-next-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.geekhunter.com/pt/blog\/"},{"@type":"ListItem","position":2,"name":"Mundo TI","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/"},{"@type":"ListItem","position":3,"name":"Desenvolvimiento de software","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/desenvolvimiento-de-software\/"},{"@type":"ListItem","position":4,"name":"Entendendo Next.js e aplicando suas funcionalidades"}]},{"@type":"WebSite","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","name":"Blog de TI","description":"Dicas para o RH e profissionais da \u00e1rea TI","publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.geekhunter.com/pt/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization","name":"GeekHunter","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","width":300,"height":300,"caption":"GeekHunter"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geekhunterbr\/","https:\/\/x.com\/geekhunterbr","https:\/\/www.instagram.com\/geekhunterbr\/","https:\/\/www.linkedin.com\/company\/geekhunter-brasil\/","https:\/\/www.youtube.com\/@GeekHunterOfficial"]},{"@type":"Person","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/2557a9c634f56710131feb2f9a024e19","name":"GeekHunter","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/ceb73d64e2eebbb4571c11285d1838bf094fa59a5dfc51be91146149b751f94d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ceb73d64e2eebbb4571c11285d1838bf094fa59a5dfc51be91146149b751f94d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ceb73d64e2eebbb4571c11285d1838bf094fa59a5dfc51be91146149b751f94d?s=96&d=mm&r=g","caption":"GeekHunter"},"description":"Artigos escritos pela equipe de conte\u00fado da GeekHunter.","url":"https:\/\/www.geekhunter.com\/pt\/blog\/author\/geekhunter\/"}]}},"_links":{"self":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/11616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/comments?post=11616"}],"version-history":[{"count":0,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/11616\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media\/11635"}],"wp:attachment":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media?parent=11616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/categories?post=11616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/tags?post=11616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}