Construindo um site com Next.js e React: Tutorial passo a passo
O artigo é um tutorial sobre como construir um site de busca de filmes com Next.js e React, abordando suas principais funcionalidades e personalização de layout.
react
25 mar 2023

Next.js é um framework React que permite a construção de sites e aplicações web com renderização do lado do servidor (SSR) e geração de páginas estáticas.
É uma ferramenta poderosa para a construção de aplicações escaláveis e de alto desempenho, além de oferecer uma experiência de desenvolvimento moderna e intuitiva.
Neste tutorial, vamos construir um site simples usando Next.js e React, passo a passo. Ao final do tutorial, teremos uma aplicação que exibe informações sobre alguns filmes e permite a pesquisa por título.
Passo 1: Preparando o ambiente
Antes de começar a construir o site, é necessário ter o ambiente de desenvolvimento configurado.
Para isso, é necessário ter o Node.js instalado na máquina. Caso não tenha, é possível baixá-lo em https://nodejs.org.
Com o Node.js instalado, é necessário criar um novo projeto Next.js. Para isso, abra o terminal e navegue até o diretório em que deseja criar o projeto.
Em seguida, execute o seguinte comando:
npx create-next-app nome-do-projeto
Substitua "nome-do-projeto" pelo nome que desejar dar ao seu projeto.
Passo 2: Criando as páginas
O Next.js utiliza o conceito de rotas para a criação de páginas.
Para criar uma nova página, é necessário criar um novo arquivo na pasta "pages" do projeto, com o nome da rota desejada.
Para o nosso exemplo, vamos criar duas páginas: a página inicial ("/") e a página de pesquisa ("/search").
Crie os arquivos "index.js" e "search.js" dentro da pasta "pages".
No arquivo "index.js", adicione o seguinte código:
import Head from 'next/head'
export default function Home() {
return (
<div>
<Head>
<title>Meu site Next.js</title>
</Head>
<h1>Bem-vindo ao meu site Next.js</h1>
</div>
)
}No arquivo "search.js", adicione o seguinte código:
import Head from 'next/head'
import { useState } from 'react'
export default function Search() {
const [searchTerm, setSearchTerm] = useState('')
const [movies, setMovies] = useState([])
const handleSearch = async (e) => {
e.preventDefault()
const res = await fetch(`https://www.omdbapi.com/?s=${searchTerm}&apikey=API_KEY`)
const data = await res.json()
setMovies(data.Search)
}
return (
<div>
<Head>
<title>Busca de filmes</title>
</Head>
<h1>Busca de filmes</h1>
<form onSubmit={handleSearch}>
<input type="text" value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} />
<button type="submit">Buscar</button>
</form>
{movies.map((movie) => (
<div key={movie.imdbID}>
<h2>{movie.Title}</h2>
<img src={movie.Poster} alt={movie.Title} />
</div>
))}
</divPasso 3: Estilizando as páginas
Agora que temos as páginas criadas, é hora de estilizá-las. O Next.js permite a utilização de diversos pré-processadores CSS, como Sass e Less, além do CSS puro.
Para este tutorial, vamos utilizar o CSS puro para estilizar as nossas páginas. Para isso, crie um novo arquivo "styles.css" na pasta "public".
Em seguida, adicione o seguinte código:
body {
font-family: sans-serif;
margin: 0;
}
h1 {
font-size: 36px;
margin-bottom: 20px;
}
form {
margin-bottom: 20px;
}
input[type="text"] {
padding: 10px;
border: none;
border-radius: 5px;
margin-right: 10px;
}
button[type="submit"] {
padding: 10px;
border: none;
border-radius: 5px;
background-color: #0070f3;
color: #fff;
cursor: pointer;
}
img {
max-width: 100%;
height: auto;
}Passo 4: Adicionando conteúdo
Agora que temos as páginas criadas e estilizadas, é hora de adicionar conteúdo.
Para este tutorial, vamos utilizar a API do OMDb (Open Movie Database) para exibir informações sobre alguns filmes.
Para utilizar a API, é necessário obter uma chave de acesso. Para isso, acesse o site https://www.omdbapi.com/ e siga as instruções para obter a sua chave.
Com a chave de acesso em mãos, substitua "API_KEY" pelo valor da sua chave no arquivo "search.js", na linha que faz a requisição à API:
const res = await fetch(`https://www.omdbapi.com/?s=${searchTerm}&apikey=API_KEY`)Em seguida, adicione alguns filmes à página inicial, no arquivo "index.js":
import Head from 'next/head'
export default function Home() {
const movies = [
{
Title: "The Shawshank Redemption",
Year: "1994",
imdbID: "tt0111161",
Type: "movie",
Poster: "https://m.media-amazon.com/images/I/51S+CtFQJ+L._AC_SY580_.jpg"
},
{
Title: "The Godfather",
Year: "1972",
imdbID: "tt0068646",
Type: "movie",
Poster: "https://m.media-amazon.com/images/I/51UVwvC-+NL._AC_SY580_.jpg"
},
{
Title: "The Dark Knight",
Year: "2008",
imdbID: "tt0468569",
Type: "movie",
Poster: "https://m.media-amazon.com/images/I/51w5y5U5F-L._AC_SY580_.jpg"
}
]
return (
<div>
<Head>
<title>Meu site Next.js</title>
</Head>
<h1>Bem-vindo ao meu site Next.js</h1>
{movies.map((movie) => (
<div key={movie.imdbID}>
<h2>{movie.Title}</h2>
<img src={movie.Poster} alt={movie.Title} />
</div>
))}
</div>
)
}
``Passo 5: Adicionando busca de filmes
Agora que já temos alguns filmes na página inicial, vamos adicionar a funcionalidade de busca de filmes.
Para isso, crie um novo arquivo "search.js" na pasta "pages". Em seguida, adicione o seguinte código:
import { useState } from 'react'
import Head from 'next/head'
export default function Search() {
const [searchTerm, setSearchTerm] = useState('')
const [movies, setMovies] = useState([])
const handleSearch = async (e) => {
e.preventDefault()
const res = await fetch(`https://www.omdbapi.com/?s=${searchTerm}&apikey=API_KEY`)
const data = await res.json()
setMovies(data.Search || [])
}
return (
<div>
<Head>
<title>Buscar filmes - Meu site Next.js</title>
</Head>
<h1>Buscar filmes</h1>
<form onSubmit={handleSearch}>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
placeholder="Digite o nome do filme"
/>
<button type="submit">Buscar</button>
</form>
{movies.map((movie) => (
<div key={movie.imdbID}>
<h2>{movie.Title}</h2>
<img src={movie.Poster} alt={movie.Title} />
</div>
))}
</div>
)
}Note que utilizamos o hook "useState" para controlar o valor do campo de busca e a lista de filmes encontrados.
Também utilizamos a propriedade "onSubmit" do formulário para fazer a requisição à API e atualizar a lista de filmes.
Passo 6: Navegação entre as páginas
Agora que temos duas páginas criadas, é importante permitir a navegação entre elas.
Para isso, vamos utilizar o componente "Link" do Next.js.
No arquivo "index.js", adicione o seguinte código para criar um link para a página de busca:
import Link from 'next/link'
export default function Home() {
return (
<div>
<Head>
<title>Meu site Next.js</title>
</Head>
<h1>Bem-vindo ao meu site Next.js</h1>
<Link href="/search">
<a>Buscar filmes</a>
</Link>
...
</div>
)
}E no arquivo "search.js", adicione o seguinte código para criar um link de volta para a página inicial:
import Link from 'next/link'
export default function Search() {
return (
<div>
<Head>
<title>Buscar filmes - Meu site Next.js</title>
</Head>
<h1>Buscar filmes</h1>
<Link href="/">
<a>Voltar para a página inicial</a>
</Link>
...
</div>
)
}Passo 7: Finalizando o projeto
Por fim, podemos adicionar alguns ajustes finais ao projeto, como uma navegação mais completa, uma página de erro personalizada e a adição de um favicon.
1. Criando um layout com navegação
Vamos criar um arquivo "Layout.js" na pasta "components". Nele, vamos definir a estrutura do layout com a barra de navegação e o conteúdo da página.
import Link from 'next/link'
export default function Layout({ children }) {
return (
<div>
<nav>
<Link href="/">
<a>Início</a>
</Link>
<Link href="/search">
<a>Buscar filmes</a>
</Link>
</nav>
<main>
{children}
</main>
</div>
)
}Em seguida, vamos utilizar o componente "Layout" nas páginas "index.js" e "search.js".
Para isso, basta importá-lo e envolver o conteúdo da página com ele.
No arquivo "index.js", por exemplo, ficará assim:
import Head from 'next/head'
import Layout from '../components/Layout'
export default function Home() {
return (
<Layout>
<Head>
<title>Meu site Next.js</title>
</Head>
<h1>Bem-vindo ao meu site Next.js</h1>
...
</Layout>
)
}2. Criando uma página de erro personalizada
Vamos criar um arquivo "_error.js" na pasta "pages". Nele, podemos criar uma página de erro personalizada para o nosso site.
export default function Error() {
return (
<div>
<h1>Ops! Ocorreu um erro.</h1>
<p>Tente novamente mais tarde.</p>
</div>
)
}3. Adicionando um favicon
Por último, vamos adicionar um favicon para o nosso site.
Para isso, crie um arquivo "favicon.ico" na pasta "public" e adicione o seguinte código no arquivo "Head" das páginas:
<Head> <title>Meu site Next.js</title> <link rel="icon" href="/favicon.ico" /> </Head>
Pronto! Agora temos um site completo com navegação, busca de filmes, layout, página de erro personalizada e favicon.
Lembre-se de substituir a API_KEY utilizada no exemplo pela sua própria chave de API do OMDB.
Conclusão
Em resumo, o Next.js é uma ferramenta poderosa para o desenvolvimento web moderno, que permite construir sites e aplicações web de forma eficiente e organizada.
Neste tutorial, aprendemos como criar um site simples de busca de filmes utilizando as principais funcionalidades do Next.js e como personalizar o layout do site com CSS.
Com o conhecimento adquirido, é possível explorar suas funcionalidades e construir projetos mais avançados.
A documentação oficial do Next.js é uma fonte valiosa de informações e exemplos, e a comunidade está sempre disposta a ajudar.