Компонент Layout
Сначала создадим компонент Layout, который будет общим для всех страниц.
- Создайте корневую директорию с именем
components
. - Внутри
components
создайте файлlayout.js
со следующим содержимым:
export default function Layout({ children }) {
return <div>{children}</div>;
}
Затем откройте pages/posts/first-post.js
, добавьте импорт компонента Layout
и сделайте его самым внешним компонентом:
import Head from 'next/head';
import Link from 'next/link';
import Layout from '../../components/layout';
export default function FirstPost() {
return (
<Layout>
<Head>
<title>First Post</title>
</Head>
<h1>First Post</h1>
<h2>
<Link href="/">← Back to home</Link>
</h2>
</Layout>
);
}
Добавление CSS
Теперь добавим стили для компонента Layout
. Для этого воспользуемся CSS Modules, которые позволяют импортировать CSS-файлы в React-компоненты.
Создайте файл components/layout.module.css
со следующим содержимым:
.container {
max-width: 36rem;
padding: 0 1rem;
margin: 3rem auto 6rem;
}
Важно: Для использования CSS Modules имя CSS-файла должно заканчиваться на
.module.css
.
Чтобы использовать класс container
внутри components/layout.js
, необходимо:
- Импортировать CSS-файл и присвоить ему имя, например
styles
- Использовать
styles.container
в качествеclassName
Откройте components/layout.js
и замените его содержимое следующим:
import styles from './layout.module.css';
export default function Layout({ children }) {
return <div className={styles.container}>{children}</div>;
}
Если вы перейдёте по адресу http://localhost:3000/posts/first-post, то увидите, что текст теперь находится внутри центрированного контейнера:
Автоматическая генерация уникальных имён классов
Если вы посмотрите на HTML в инструментах разработчика браузера, то заметите, что div
, отрендеренный компонентом Layout
, имеет имя класса вида layout_container__...
:
Это особенность CSS Modules: они автоматически генерируют уникальные имена классов. Пока вы используете CSS Modules, вам не нужно беспокоиться о конфликтах имён классов.
Кроме того, функция code splitting в Next.js также работает с CSS Modules. Она гарантирует, что для каждой страницы загружается минимально необходимое количество CSS. Это приводит к уменьшению размера бандлов.
CSS Modules извлекаются из JavaScript-бандлов во время сборки и генерируют .css
файлы, которые автоматически загружаются Next.js.