CSS Modules и глобальные стили
Next.js поддерживает различные типы таблиц стилей, включая:
CSS Modules
Next.js имеет встроенную поддержку CSS Modules с использованием расширения .module.css
.
CSS Modules локально ограничивают область видимости CSS, автоматически создавая уникальные имена классов. Это позволяет использовать одинаковые имена классов в разных файлах без риска конфликтов. Такое поведение делает CSS Modules идеальным способом включения CSS на уровне компонентов.
Пример
CSS Modules можно импортировать в любой файл внутри директории app
:
import styles from './styles.module.css'
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return <section className={styles.dashboard}>{children}</section>
}
import styles from './styles.module.css'
export default function DashboardLayout({ children }) {
return <section className={styles.dashboard}>{children}</section>
}
.dashboard {
padding: 24px;
}
CSS Modules работают только для файлов с расширениями .module.css
и .module.sass
.
В production-сборке все файлы CSS Modules автоматически объединяются в несколько минифицированных и разделённых на части .css
файлов.
Эти .css
файлы представляют горячие пути выполнения в вашем приложении, гарантируя загрузку минимально необходимого количества CSS для отрисовки приложения.
Глобальные стили
Глобальные стили можно импортировать в любой layout, страницу или компонент внутри директории app
.
Важно знать: Это отличается от директории
pages
, где глобальные стили можно импортировать только внутри файла_app.js
.
Например, рассмотрим таблицу стилей с именем app/global.css
:
body {
padding: 20px 20px 60px;
max-width: 680px;
margin: 0 auto;
}
В корневом layout (app/layout.js
) импортируйте таблицу стилей global.css
, чтобы применить стили ко всем маршрутам вашего приложения:
// Эти стили применяются ко всем маршрутам приложения
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>
)
}
Внешние таблицы стилей
Таблицы стилей, опубликованные внешними пакетами, можно импортировать в любом месте директории 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>
)
}
Важно знать: Внешние таблицы стилей должны быть импортированы напрямую из npm-пакета или загружены и размещены вместе с вашей кодовой базой. Вы не можете использовать
<link rel="stylesheet" />
.
Порядок и объединение
Next.js оптимизирует CSS во время production-сборки, автоматически разделяя (объединяя) таблицы стилей. Порядок CSS определяется порядком, в котором вы импортируете таблицы стилей в код вашего приложения.
Например, base-button.module.css
будет упорядочен перед page.module.css
, так как <BaseButton>
импортируется первым в <Page>
:
import { BaseButton } from './base-button'
import styles from './page.module.css'
export function Page() {
return <BaseButton className={styles.primary} />
}
import { BaseButton } from './base-button'
import styles from './page.module.css'
export function Page() {
return <BaseButton className={styles.primary} />
}
Для поддержания предсказуемого порядка мы рекомендуем следующее:
- Импортируйте CSS-файл только в один JS/TS файл.
- Если используете глобальные имена классов, импортируйте глобальные стили в том же файле в желаемом порядке применения.
- Предпочитайте CSS Modules глобальным стилям.
- Используйте единообразное соглашение по именованию для ваших CSS Modules. Например, используйте
<name>.module.css
вместо<name>.tsx
.
- Используйте единообразное соглашение по именованию для ваших CSS Modules. Например, используйте
- Выносите общие стили в отдельный общий компонент.
- Если используете Tailwind, импортируйте таблицу стилей в начале файла, предпочтительно в Root Layout.
Важно знать: Порядок CSS ведёт себя по-разному в режиме разработки, всегда проверяйте preview-деплойменты, чтобы убедиться в окончательном порядке CSS в production-сборке.
Дополнительные возможности
Next.js включает дополнительные функции для улучшения опыта работы со стилями:
- При локальном запуске с
next dev
, локальные таблицы стилей (глобальные или CSS Modules) используют Fast Refresh для мгновенного отражения изменений при сохранении. - При сборке для production с
next build
, CSS-файлы объединяются в меньшее количество минифицированных.css
файлов для уменьшения количества сетевых запросов, необходимых для загрузки стилей. - Если вы отключите JavaScript, стили всё равно будут загружаться в production-сборке (
next start
). Однако JavaScript всё ещё необходим дляnext dev
, чтобы включить Fast Refresh.