Использование CSS в вашем приложении
Next.js предоставляет несколько способов использования CSS в вашем приложении, включая:
CSS Modules
CSS Modules локально ограничивают область видимости CSS, генерируя уникальные имена классов. Это позволяет использовать один и тот же класс в разных файлах без риска конфликтов имен.
Чтобы начать использовать CSS Modules, создайте новый файл с расширением .module.css
и импортируйте его в любой компонент внутри директории app
:
.blog {
padding: 24px;
}
import styles from './blog.module.css'
export default function Page() {
return <main className={styles.blog}></main>
}
import styles from './blog.module.css'
export default function Layout() {
return <main className={styles.blog}></main>
}
Global CSS
Вы можете использовать глобальные стили для применения CSS-правил ко всему приложению.
Создайте файл app/global.css
и импортируйте его в корневой layout, чтобы применить стили ко всем маршрутам вашего приложения:
body {
padding: 20px 20px 60px;
max-width: 680px;
margin: 0 auto;
}
// Эти стили применяются ко всем маршрутам приложения
import './global.css'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
// Эти стили применяются ко всем маршрутам приложения
import './global.css'
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
Важно: Глобальные стили можно импортировать в любой layout, страницу или компонент внутри директории
app
. Однако, поскольку Next.js использует встроенную поддержку таблиц стилей React для интеграции с Suspense, в настоящее время стили не удаляются при переходе между маршрутами, что может привести к конфликтам. Рекомендуется использовать глобальные стили только для действительно глобального CSS, а для ограниченных стилей — CSS Modules.
Внешние таблицы стилей
Таблицы стилей, опубликованные внешними пакетами, можно импортировать в любом месте директории app
, включая компоненты:
import 'bootstrap/dist/css/bootstrap.css'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body className="container">{children}</body>
</html>
)
}
import 'bootstrap/dist/css/bootstrap.css'
export default function RootLayout({ children }) {
return (
<html lang="en">
<body className="container">{children}</body>
</html>
)
}
Важно: В React 19 также можно использовать
<link rel="stylesheet" href="..." />
. Подробнее см. в документации Reactlink
.
Порядок и объединение стилей
Next.js оптимизирует CSS во время production-сборки, автоматически объединяя (чанкуя) таблицы стилей. Порядок вашего CSS зависит от порядка импорта стилей в вашем коде.
Например, base-button.module.css
будет расположен перед page.module.css
, так как <BaseButton>
импортируется до page.module.css
:
import { BaseButton } from './base-button'
import styles from './page.module.css'
export default function Page() {
return <BaseButton className={styles.primary} />
}
import { BaseButton } from './base-button'
import styles from './page.module.css'
export default function Page() {
return <BaseButton className={styles.primary} />
}
Рекомендации
Для предсказуемого порядка CSS:
- Старайтесь ограничивать импорт CSS одним JavaScript или TypeScript entry-файлом
- Импортируйте глобальные стили и Tailwind-стили в корне приложения
- Используйте CSS Modules вместо глобальных стилей для вложенных компонентов
- Используйте единое соглашение по именованию для CSS-модулей, например
<name>.module.css
вместо<name>.tsx
- Выносите общие стили в общие компоненты, чтобы избежать дублирования импортов
- Отключайте линтеры или форматтеры, автоматически сортирующие импорты, такие как ESLint
sort-imports
- Вы можете использовать опцию
cssChunking
вnext.config.js
для управления объединением CSS
Разработка vs Продакшен
- В режиме разработки (
next dev
) обновления CSS применяются мгновенно благодаря Fast Refresh - В продакшене (
next build
) все CSS-файлы автоматически объединяются в минифицированные и чанкованные.css
файлы, обеспечивая загрузку минимального количества CSS для маршрута - В продакшене CSS загружается даже при отключенном JavaScript, но в разработке JavaScript необходим для Fast Refresh
- Порядок CSS может отличаться в разработке, всегда проверяйте сборку (
next build
), чтобы убедиться в окончательном порядке CSS