Руководство для начинающих по работе с Next.js

Руководство для начинающих по работе с Next.js

Next.js — это мощный фреймворк для разработки веб-приложений на React, который предоставляет множество удобных функций и возможностей для создания современных, быстрых и масштабируемых веб-сайтов. Данное руководство поможет начинающим разработчикам освоить основы работы с Next.js и начать создавать свои первые проекты.

Что такое Next.js?

Next.js — это фреймворк для React, разработанный компанией Vercel. Он предоставляет ряд преимуществ для разработчиков:

  • Серверный рендеринг (SSR) и статическая генерация (SSG)
  • Автоматическая оптимизация кода
  • Встроенная поддержка TypeScript
  • Быстрая разработка с горячей перезагрузкой
  • Простая маршрутизация на основе файловой системы
  • Встроенная поддержка CSS и Sass

Установка и настройка Next.js

Для начала работы с Next.js необходимо выполнить следующие шаги:

  1. Убедиться, что на компьютере установлен Node.js (версия 10.13 или выше)
  2. Открыть терминал и выполнить команду для создания нового проекта: npx create-next-app@latest my-next-app
  3. Перейти в папку проекта: cd my-next-app
  4. Запустить сервер разработки: npm run dev

После выполнения этих шагов, новое Next.js приложение будет доступно по адресу http://localhost:3000.

Структура проекта Next.js

Типичная структура проекта Next.js выглядит следующим образом:

  • pages/: Директория для страниц приложения
  • public/: Директория для статических файлов
  • styles/: Директория для CSS файлов
  • components/: Директория для React компонентов
  • package.json: Файл с зависимостями и скриптами
  • next.config.js: Конфигурационный файл Next.js

Создание страниц в Next.js

В Next.js страницы создаются как React компоненты в директории pages/. Каждый файл в этой директории автоматически становится доступным как маршрут.

Пример создания простой страницы:

jsx

// pages/index.js
function HomePage() {
return

Добро пожаловать на главную страницу!

}

export default HomePage

Эта страница будет доступна по адресу /.

Маршрутизация в Next.js

Next.js использует систему маршрутизации на основе файловой системы. Это означает, что структура файлов и папок в директории pages/ определяет маршруты приложения.

Примеры маршрутизации:

  • pages/index.js/
  • pages/about.js/about
  • pages/blog/[id].js/blog/:id (динамический маршрут)

Динамические маршруты

Next.js поддерживает динамические маршруты, которые позволяют создавать страницы с параметрами. Для этого используются квадратные скобки в имени файла.

Пример динамического маршрута:

jsx

// pages/posts/[id].js
import { useRouter } from ‘next/router’

function Post() {
const router = useRouter()
const { id } = router.query

return

Пост: {id}

}

export default Post

Эта страница будет соответствовать маршрутам вида /posts/1, /posts/2 и т.д.

Компоненты Link и Image

Next.js предоставляет специальные компоненты для оптимизации навигации и загрузки изображений:

  • Link: Для создания ссылок между страницами
  • Image: Для оптимизированной загрузки изображений

Пример использования компонента Link:

jsx

import Link from ‘next/link’

function NavBar() {
return (

)
}

export default NavBar

Пример использования компонента Image:

jsx

import Image from ‘next/image’

function Logo() {
return (
Логотип
)
}

export default Logo

Стили в Next.js

Next.js поддерживает различные способы стилизации компонентов:

  • CSS модули
  • Sass
  • Styled-components
  • Встроенные стили

Пример использования CSS модулей:

jsx

// styles/Home.module.css
.container {
padding: 0 2rem;
}

// pages/index.js
import styles from ‘../styles/Home.module.css’

function HomePage() {
return (

Добро пожаловать!

)
}

export default HomePage

API маршруты

Next.js позволяет создавать API маршруты внутри приложения. Для этого нужно создать файлы в директории pages/api/.

Пример API маршрута:

jsx

// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ message: ‘Привет от API!’ })
}

Этот API будет доступен по адресу /api/hello.

Серверный рендеринг (SSR) и статическая генерация (SSG)

Next.js поддерживает два основных метода генерации страниц: серверный рендеринг (SSR) и статическую генерацию (SSG).

Серверный рендеринг (SSR)

При серверном рендеринге HTML генерируется на сервере для каждого запроса. Для использования SSR необходимо экспортировать асинхронную функцию getServerSideProps:

jsx

export async function getServerSideProps(context) {
// Получение данных из API или базы данных
const res = await fetch(‘https://api.example.com/data’)
const data = await res.json()

return {
props: { data }, // Будет передано компоненту страницы как props
}
}

Статическая генерация (SSG)

При статической генерации HTML генерируется во время сборки. Для использования SSG необходимо экспортировать функцию getStaticProps:

jsx

export async function getStaticProps() {
// Получение данных из API или базы данных
const res = await fetch(‘https://api.example.com/data’)
const data = await res.json()

return {
props: { data }, // Будет передано компоненту страницы как props
revalidate: 60, // Опционально: повторная генерация страницы каждые 60 секунд
}
}

Оптимизация производительности

Next.js предоставляет ряд инструментов для оптимизации производительности приложения:

  • Автоматическое разделение кода
  • Предварительная загрузка страниц
  • Оптимизация изображений
  • Кэширование и повторная валидация статического контента

Развертывание Next.js приложения

Существует несколько способов развертывания Next.js приложения:

  1. Vercel (рекомендуемый способ, так как Vercel разрабатывает Next.js)
  2. Netlify
  3. AWS
  4. Собственный сервер
Читайте также  Веб 3.0 не сможет обойтись без традиционного SEO.

Для развертывания на Vercel достаточно связать репозиторий с проектом и Vercel автоматически настроит все необходимое.

Расширенные возможности Next.js

Next.js предоставляет ряд расширенных возможностей для опытных разработчиков:

  • Кастомный сервер
  • Middleware
  • Интернационализация (i18n)
  • Абсолютные импорты и псевдонимы модулей
  • Поддержка TypeScript

Работа с данными в Next.js

Next.js предоставляет несколько способов работы с данными:

  • Fetching данных на стороне сервера с помощью getServerSideProps
  • Fetching данных во время сборки с помощью getStaticProps
  • Клиентский fetching данных с использованием хуков React или библиотек, таких как SWR

Пример использования SWR для клиентского fetching данных:

jsx

import useSWR from ‘swr’

const fetcher = (…args) => fetch(…args).then(res => res.json())

function Profile() {
const { data, error } = useSWR(‘/api/user’, fetcher)

if (error) return

Ошибка загрузки

if (!data) return

Загрузка…

return

Привет, {data.name}!

}

Тестирование Next.js приложений

Для тестирования Next.js приложений можно использовать различные инструменты:

  • Jest для модульного тестирования
  • React Testing Library для тестирования компонентов
  • Cypress для end-to-end тестирования

Пример модульного теста с использованием Jest:

jsx

// __tests__/index.test.js
import { render, screen } from ‘@testing-library/react’
import Home from ‘../pages/index’

describe(‘Home’, () => {
it(‘renders a heading’, () => {
render()

const heading = screen.getByRole(‘heading’, {
name: /welcome to next\.js!/i,
})

expect(heading).toBeInTheDocument()
})
})

Интеграция с CMS

Next.js легко интегрируется с различными системами управления контентом (CMS):

  • Headless CMS (Contentful, Strapi, Sanity)
  • WordPress (с использованием WPGraphQL)
  • Ghost

Пример интеграции с Contentful:

jsx

import { createClient } from ‘contentful’

const client = createClient({
space: process.env.CONTENTFUL_SPACE_ID,
accessToken: process.env.CONTENTFUL_ACCESS_TOKEN,
})

export async function getStaticProps() {
const res = await client.getEntries({ content_type: ‘blogPost’ })

return {
props: {
posts: res.items,
},
}
}

Безопасность в Next.js

При разработке приложений на Next.js важно уделять внимание безопасности. Некоторые аспекты безопасности, о которых следует помнить:

  • Использование HTTPS
  • Защита от XSS-атак
  • Настройка заголовков безопасности
  • Безопасное хранение секретов и конфиденциальных данных

Next.js автоматически настраивает некоторые заголовки безопасности, но разработчикам следует дополнительно настроить их в соответствии с требованиями проекта.

SEO-оптимизация в Next.js

Next.js предоставляет отличные возможности для SEO-оптимизации благодаря серверному рендерингу и статической генерации. Вот некоторые ключевые аспекты SEO в Next.js:

  • Использование компонента Head для управления метатегами
  • Генерация карты сайта (sitemap)
  • Настройка robots.txt
  • Оптимизация загрузки изображений
  • Улучшение производительности страниц

Пример использования компонента Head для улучшения SEO:

jsx

import Head from ‘next/head’

function IndexPage() {
return (


Моя SEO-оптимизированная страница

Добро пожаловать на мою страницу

)
}

export default IndexPage

Работа с формами в Next.js

Обработка форм в Next.js может быть реализована как на стороне клиента, так и на стороне сервера. Вот пример обработки формы на стороне клиента:

jsx

import { useState } from ‘react’

function ContactForm() {
const [name, setName] = useState(»)
const [email, setEmail] = useState(»)
const [message, setMessage] = useState(»)

const handleSubmit = async (e) => {
e.preventDefault()
const res = await fetch(‘/api/contact’, {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ name, email, message }),
})
if (res.ok) {
alert(‘Сообщение отправлено!’)
}
}

return (

setName(e.target.value)}
placeholder=»Имя»
required
/>
setEmail(e.target.value)}
placeholder=»Email»
required
/>


)
}

export default ContactForm

Управление состоянием в Next.js

Для управления состоянием в Next.js приложениях можно использовать различные подходы:

  • Локальное состояние с использованием хуков React (useState, useReducer)
  • Контекст React для глобального состояния
  • Библиотеки управления состоянием (Redux, MobX, Recoil)

Пример использования контекста React для управления темой приложения:

jsx

// contexts/ThemeContext.js
import { createContext, useState, useContext } from ‘react’

const ThemeContext = createContext()

export function ThemeProvider({ children }) {
const [theme, setTheme] = useState(‘light’)

return (

{children}

)
}

export function useTheme() {
return useContext(ThemeContext)
}

// pages/_app.js
import { ThemeProvider } from ‘../contexts/ThemeContext’

function MyApp({ Component, pageProps }) {
return (



)
}

export default MyApp

// components/ThemeToggle.js
import { useTheme } from ‘../contexts/ThemeContext’

function ThemeToggle() {
const { theme, setTheme } = useTheme()

return (

)
}

export default ThemeToggle

Оптимизация изображений в Next.js

Next.js предоставляет встроенный компонент Image для оптимизации изображений. Он автоматически оптимизирует изображения, изменяет их размер и форматирует для улучшения производительности.

Пример использования компонента Image:

jsx

import Image from ‘next/image’

function MyImage() {
return (
Профиль пользователя
)
}

export default MyImage

Кэширование в Next.js

Next.js предоставляет несколько способов кэширования для улучшения производительности:

  • Кэширование статических страниц
  • Кэширование динамических маршрутов с помощью Incremental Static Regeneration (ISR)
  • Кэширование API-маршрутов
Читайте также  Дзен удалил более миллиона публикаций с недостоверной информацией

Пример использования ISR для кэширования динамической страницы:

jsx

export async function getStaticProps() {
const res = await fetch(‘https://api.example.com/data’)
const data = await res.json()

return {
props: { data },
revalidate: 60, // Страница будет перегенерироваться каждые 60 секунд
}
}

Интернационализация (i18n) в Next.js

Next.js предоставляет встроенную поддержку интернационализации. Для её настройки необходимо добавить конфигурацию в файл next.config.js:

javascript

// next.config.js
module.exports = {
i18n: {
locales: [‘en’, ‘fr’, ‘ru’],
defaultLocale: ‘en’,
},
}

Затем можно использовать хук useRouter для доступа к текущей локали и изменения языка:

jsx

import { useRouter } from ‘next/router’

function LanguageSwitcher() {
const router = useRouter()

return (

)
}

export default LanguageSwitcher

Типизация с TypeScript в Next.js

Next.js имеет встроенную поддержку TypeScript. Для использования TypeScript в проекте Next.js нужно переименовать файлы с расширением .js на .ts или .tsx (для файлов с JSX).

Пример типизированного компонента:

typescript

import { FC } from ‘react’

interface Props {
name: string;
age: number;
}

const Person: FC = ({ name, age }) => {
return (

{name}

Возраст: {age}

)
}

export default Person

Работа с API в Next.js

Next.js позволяет создавать API-маршруты внутри приложения. Эти маршруты могут быть использованы для создания полноценного API или для обработки запросов с клиентской части приложения.

Пример API-маршрута для обработки POST-запроса:

javascript

// pages/api/submit-form.js
export default function handler(req, res) {
if (req.method === ‘POST’) {
// Обработка данных формы
const { name, email, message } = req.body
// Здесь может быть логика сохранения данных в базу данных
res.status(200).json({ message: ‘Форма успешно отправлена’ })
} else {
res.setHeader(‘Allow’, [‘POST’])
res.status(405).end(`Method ${req.method} Not Allowed`)
}
}

Аутентификация в Next.js

Next.js можно интегрировать с различными системами аутентификации. Популярным выбором является NextAuth.js — библиотека для аутентификации, специально разработанная для Next.js.

Пример настройки NextAuth.js:

javascript

// pages/api/auth/[…nextauth].js
import NextAuth from ‘next-auth’
import Providers from ‘next-auth/providers’

export default NextAuth({
providers: [
Providers.Google({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
}),
Providers.GitHub({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
],
database: process.env.DATABASE_URL,
})

Кастомные серверы в Next.js

Хотя Next.js предоставляет встроенный сервер, иногда может потребоваться использование кастомного сервера. Это может быть полезно для дополнительных настроек или интеграции с существующим бэкендом.

Пример кастомного сервера с Express:

javascript

const express = require(‘express’)
const next = require(‘next’)

const dev = process.env.NODE_ENV !== ‘production’
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare().then(() => {
const server = express()

server.get(‘/custom’, (req, res) => {
res.send(‘Кастомный маршрут’)
})

server.all(‘*’, (req, res) => {
return handle(req, res)
})

server.listen(3000, (err) => {
if (err) throw err
console.log(‘> Ready on http://localhost:3000’)
})
})

Оптимизация производительности в Next.js

Next.js предоставляет множество инструментов для оптимизации производительности приложения:

  • Автоматическое разделение кода
  • Предварительная загрузка страниц
  • Оптимизация изображений
  • Оптимизация шрифтов
  • Минимизация JavaScript

Пример оптимизации загрузки шрифтов:

jsx

import { Inter } from ‘@next/font/google’

const inter = Inter({ subsets: [‘latin’] })

export default function MyApp({ Component, pageProps }) {
return (




)
}

Развертывание Next.js приложения

Существует несколько способов развертывания Next.js приложения:

  1. Vercel (рекомендуемый способ, так как Vercel разрабатывает Next.js)
  2. Netlify
  3. AWS (с использованием Elastic Beanstalk или EC2)
  4. Heroku
  5. Docker

Пример конфигурации для развертывания на Heroku:

json

{
«scripts»: {
«dev»: «next»,
«build»: «next build»,
«start»: «next start -p $PORT»
}
}

Мониторинг и аналитика в Next.js

Для мониторинга производительности и сбора аналитики в Next.js приложениях можно использовать различные инструменты:

  • Google Analytics
  • Sentry для отслеживания ошибок
  • Vercel Analytics для приложений, развернутых на Vercel

Пример интеграции Google Analytics:

jsx

import Script from ‘next/script’

export default function MyApp({ Component, pageProps }) {
return (
<>