Next.js: O Framework React do Futuro

image: Nextjs Banner

porGabriel Dürr M., São Paulo - SP

Next.js atualmente é considerado um dos frameworks mais populares do mercado. Graças a sua rapidez e robustez de recursos, o framework também é conhecido por sua versatilidade e flexibilidade, muito poderoso e viável para criação de sites de e-commerce, landing pages, sites de marketing, websites estáticos e com foco em SEO – da criação à garantia de escalabilidade. O Next.js oferece recursos para criação de APIs dentro do próprio projeto, cache, otimização de imagens, etc.

Configuração inicial:

Crie um projeto Next.js:

npx create-next-app@latest

Com TypeScript adicione a flag --ts

npx create-next-app@latest --ts

OBS: Ainda há a opção de pode usar um gerenciador de pacotes (NPM, Yearn, PNPM ...):

Fluxo de desenvolvimento:

A criação de páginas acontece de forma bem simples, todos arquivos dentro da pasta pages (com exceção de arquivos de config), são transformado em páginas/rotas.

image: Estrutura de pastas



E todos arquivos dentro da pasta API são transformados em rotas APIs.

image: Fluxo rotas API

Estilização com CSS Modules:


Além da estilização Global, contamos com recurso chamado CSS modules que nos permite criar estilizações a nível de component, ou seja, o estilo é aplicado somente no escopo do component, sem quer que se preocupar com conflitos de nome de classes na nossa aplicação.

É uma grande vantagem adicionar um pré-processador como SASS para trabalhar em conjunto com css modules e criarmos estilos em cascata e mais complexos...

Primeiro devemos criar uma pasta que irá conter o index do component, e criar arquivo de estilização no formato nome do arquivo + extensão module.css, ficando dessa forma por ex.: input.module.css

    • Por convenção e organização utilizamos o mesmo nome do component, adicionando apenas a extensão module.css
image: pasta com css modules

    • Criamos as estilizações, tendo cada estilização com a sintaxe de classe:

.bg {
     display: flex;
     justify-content: center;
     margin: 5% auto;
     width: 600px;
     height: 300px;
     color: #fff;
     background-color: #000;
}
gbdx-logo


    • Importamos o arquivo de estilização no formato de export default, uma convenção é utilizar o nome styles, e utilizamos a estilização do component através da propriedade className do React, acessando a prop da estilização criada no arquivo module.css.

import styles from "./box-container.module.css";

type BoxContainerProps = {
	children?: ReactNode;
};

export const BoxContainer = ({ children }: BoxContainerProps) => {
	return <div className={styles.bg}>{children}</div>;
};
gbdx-logo

    • Resultado final:
image: resutado css

Principais funcionalidades do Next.js:

    • Renderização no lado do Servidor (SSR).

import { GetServerSideProps } from "next";

export const getServerSideProps: GetServerSideProps = async () => {
	const fetchUserApi = {
		name: "Gabriel",
		alias: "gbdx",
		age: 23,
	};

	return {
		props: {
			fetchUserApi,
		},
	};
};
gbdx-logo

Ao utilizar a função SSR, ela será executada a cada requisição feita no client pelo usuário, ou seja, sempre que a página for aberta/atualizada, o servidor do next.js irá buscar pelos dados de uma API por ex., e fornecer esses novos dados para aplicação.

Devemos utilizar essa função em casos que exista uma real necessidade, como por ex.: bloqueio de conteúdos que só podem ser visualizados com acesso especial. Para dados que não seja necessário que os dados sejam atualizados a cada requisição, podemos usufruir da geração de páginas estáticas e assim ter ganhos incomparáveis em relação ao carregamento das páginas.

    • Geração de páginas estáticas (SSG).

import { GetStaticProps } from "next";

export const getStaticProps: GetStaticProps = async ({ params }) => {
	const res = await fetch(`https://site-deployed/page/${params.id}`);

	const data = await res.json();

	return {
		props: {
			data,
		},
	};
};
gbdx-logo

Essa funcionalidade com toda certeza é a cereja do bolo do next.js, com ela conseguimos gerar páginas estáticas pré-renderizadas no momento de build, e assim iram ser renderizadas pelo client sem que o usuário espere o carregamento 🤩. Porém se houver atualizações dos dados, o conteúdo so é refletido na página fazendo um novo build.

    • Geração de páginas estáticas de forma incremental (ISG).

import { GetStaticProps } from "next";

export const getStaticProps: GetStaticProps = async ({ params }) => {
	const res = await fetch(`https://site-deployed/page/${params.id}`);

	const data = await res.json();

	const thirtySeconds = 30 * 1000;

	return {
		props: {
			data,
		},
		revalidate: thirtySeconds,
	};
};
gbdx-logo

Podemos gerar páginas estáticas, com conteúdo sendo atualizado de forma incremental a cada período de tempo. Ou seja, irá atualizar automaticamente sem precisar fazer um novo build para que os novos dados sejam refletidos no página. Para isso utilizamos a prop revalidate definindo o tempo em segundos, e o next.js fica responsável de atualizar o conteúdo sempre que atingir a contagem do tempo definido

    • Utilizando páginas estáticas dinâmicas com: getStaticPaths + Static Site Generation (SSG)
image: Pastas com arquivo de rota dinâmica do Next.js

import { GetStaticPaths } from "next";

export const getStaticPaths: GetStaticPaths = async () => {
	const res = await fetch("https://site-deployed/page");

	const data = await res.json();

	const paths = data.map(post => ({
		params: { id: post.id.toString() },
	}));

	return {
		paths,
		fallback: false,
	};
};
gbdx-logo

Quando precisamos gerar páginas estáticas que são acessadas de forma dinâmica através de parâmetros da url, precisamos informar para o Next.js todas as rotas existentes da aplicação, para quando realizarmos o build ele criar a rota para todas páginas.

Para resolver esse problema, utilizamos a função getStaticPaths que será responsável por gerar todas as rotas. Essa função deve retornar um objeto com uma propriedade chamada params, e essa propriedade contém uma matriz/lista de objetos. Dentro de cada objeto fornecemos o nome da rota para a propriedade que é o mesmo nome que colocamos no arquivo de rota dinâmica, como nesse ex.: [uid] , que poderia ser chamado de [slug], etc.

Podemos recuperar o valor digitado no parâmetro da url, na função do getStaticProps e utilizarmos um filtro no nosso fetch que irá buscar e gerar todas páginas estáticas para o uuid/slug do getStaticPaths. Assim teremos todas páginas com todas rotas definidas de forma estáticas, e essa página será exibida dinamicamente conforme sua rota.

import { GetStaticProps } from "next";

export const getStaticProps: GetStaticProps = async ({ params }) => {
	const queryApiWithParamsId = params.id;

	const res = await fetch(`https://site-deployed/page/${queryApiWithParamsId}`);

	const data = await res.json();

	return {
		props: {
			data,
		},
	};
};
gbdx-logo

Conclusão

Em resumo, o Next.js é uma ferramenta essencial para desenvolver aplicativos React mais sofisticados, pois oferece recursos avançados como SSR e SSG. Com sua estrutura otimizada para o desenvolvimento de aplicativos escaláveis, o Next.js torna a construção de aplicativos web ainda mais fácil e produtiva.

Se você está procurando uma maneira eficiente de criar aplicativos React poderosos, visite a documentação oficial do NEXT.Js e evolua com o framework.

postagens recentes
Jest: torne seu código mais seguro e confiável
imagem: jest
Guia ReactJS 18 para iniciantes
Reactjs banner.
my logo

© Desenhado e Desenvolvido por Gabriel Dürr M. 🖤