Установка Next.js

При использовании Next.js в вашем проекте больше не нужно загружать скрипты react и react-dom с unpkg.com. Вместо этого вы можете установить эти пакеты локально с помощью npm или предпочитаемого менеджера пакетов.

Примечание: Для работы с Next.js на вашем компьютере должна быть установлена Node.js версии 18.17.0 или выше (см. минимальные требования). Вы можете скачать её здесь.

Для этого создайте новый файл в той же директории, где находится ваш index.html, с именем package.json и пустым объектом {}.

package.json
{}

В терминале выполните следующую команду в корне вашего проекта:

Terminal
npm install react@latest react-dom@latest next@latest

После завершения установки вы должны увидеть зависимости проекта в файле package.json:

package.json
{
  "dependencies": {
    "next": "^14.0.3",
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  }
}

Не беспокойтесь, если у вас более новые версии, чем указано выше — главное, чтобы пакеты next, react и react-dom были установлены.

Вы также заметите новый файл package-lock.json, содержащий точные версии установленных пакетов.

Вернувшись к файлу index.html, удалите следующий код:

  1. Теги <html> и <body>.
  2. Элемент <div> с id="app".
  3. Скрипты react и react-dom, так как они теперь установлены через NPM.
  4. Скрипт Babel, потому что Next.js включает компилятор для преобразования JSX в валидный JavaScript.
  5. Тег <script type="text/jsx">.
  6. Методы document.getElementById() и ReactDom.createRoot().
  7. Часть React. в функции React.useState(0).

После удаления добавьте следующий импорт в начало файла:

index.html
import { useState } from 'react';

Ваш код должен выглядеть так:

index.html
import { useState } from 'react';
 
function Header({ title }) {
  return <h1>{title ? title : 'Default title'}</h1>;
}
 
function HomePage() {
  const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton'];
 
  const [likes, setLikes] = useState(0);
 
  function handleClick() {
    setLikes(likes + 1);
  }
 
  return (
    <div>
      <Header title="Develop. Preview. Ship." />
      <ul>
        {names.map((name) => (
          <li key={name}>{name}</li>
        ))}
      </ul>
 
      <button onClick={handleClick}>Like ({likes})</button>
    </div>
  );
}

Поскольку в файле остался только JSX, вы можете изменить его расширение с .html на .js или .jsx.

Создание первой страницы

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

Вот как создать первую страницу в Next.js:

  1. Создайте папку app и переместите в неё файл index.js.
  2. Переименуйте index.js в page.js — это будет главная страница приложения.
  3. Добавьте export default к компоненту <HomePage>, чтобы Next.js понимал, какой компонент рендерить как основной.
app/page.js
import { useState } from 'react';
 
function Header({ title }) {
  return <h1>{title ? title : 'Default title'}</h1>;
}
 
export default function HomePage() {
  // ...
}

Запуск сервера разработки

Теперь запустим сервер разработки, чтобы видеть изменения в реальном времени. Добавьте скрипт "next dev" в package.json:

package.json
{
  "scripts": {
    "dev": "next dev"
  },
  "dependencies": {
    "next": "^14.0.3",
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  }
}

Запустите npm run dev в терминале. Вы заметите две вещи:

  1. При переходе на localhost:3000 появится ошибка:
Сообщение об ошибке Next.js: Вы импортируете компонент, требующий useState. Это работает только в клиентском компоненте...

Это происходит потому, что Next.js использует React Server Components — новую функцию, позволяющую рендерить React на сервере. Серверные компоненты не поддерживают useState, поэтому нужно использовать клиентский компонент.

В следующей главе мы обсудим различия между серверными и клиентскими компонентами и исправим эту ошибку.

  1. В папке app автоматически создался файл layout.js — основной макет приложения. Здесь можно разместить UI-элементы, общие для всех страниц (например, навигацию, подвал и т.д.).
/app/layout.js
export const metadata = {
  title: 'Next.js',
  description: 'Generated by Next.js',
};
 
export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}

Итоги

Уже на этом этапе можно оценить преимущества Next.js:

  • Убраны скрипты React и Babel — вам больше не нужно думать о сложной настройке инструментов.
  • Создана первая страница.

Дополнительные материалы: