Chakra UI полностью совместим с Next.js и обеспечивает удобное создание компонентов с готовой системой стилей. Для начала необходимо установить библиотеку и ее зависимости:
npm install @chakra-ui/react @emotion/react @emotion/styled framer-motion
После установки нужно создать обертку для приложения в файле
pages/_app.js или pages/_app.tsx:
import { ChakraProvider } from "@chakra-ui/react";
function MyApp({ Component, pageProps }) {
return (
<ChakraProvider>
<Component {...pageProps} />
</ChakraProvider>
);
}
export default MyApp;
Это обеспечит доступ к Chakra UI во всем приложении, включая страницы и компоненты.
Next.js активно использует SSR, что требует корректной работы Chakra
UI при рендеринге на сервере. Для предотвращения мерцаний стилей
необходимо использовать компонент ColorModeScript. Его
подключение осуществляется в файле pages/_document.js:
import { ColorModeScript } from "@chakra-ui/react";
import { Html, Head, Main, NextScript } from "next/document";
import theme from "../theme";
export default function Document() {
return (
<Html lang="ru">
<Head />
<body>
<ColorModeScript initialColorMode={theme.config.initialColorMode} />
<Main />
<NextScript />
</body>
</Html>
);
}
Такой подход гарантирует, что цветовая схема (светлая или тёмная) будет корректно загружаться на сервере и применяться при первичном рендеринге.
Chakra UI позволяет кастомизировать тему приложения. Создается
отдельный файл theme.js:
import { extendTheme } from "@chakra-ui/react";
const theme = extendTheme({
config: {
initialColorMode: "light",
useSystemColorMode: true,
},
styles: {
global: {
body: {
fontFamily: "Inter, sans-serif",
bg: "gray.50",
color: "gray.800",
},
},
},
colors: {
brand: {
50: "#e3f2f9",
100: "#c5e4f3",
500: "#3182ce",
900: "#1a365d",
},
},
});
export default theme;
extendTheme позволяет расширять базовую тему Chakra,
добавлять свои палитры, глобальные стили, шрифты и конфигурации цветовой
схемы.
Chakra UI предоставляет готовые компоненты, совместимые с SSR и маршрутизацией Next.js. Пример использования кнопки и сетки:
import { Box, Button, Grid } from "@chakra-ui/react";
import Link from "next/link";
export default function HomePage() {
return (
<Box p={8}>
<Grid templateColumns="repeat(3, 1fr)" gap={6}>
<Box bg="brand.100" p={4} borderRadius="md">
<Link href="/about">
<Button colorScheme="brand">О нас</Button>
</Link>
</Box>
<Box bg="brand.100" p={4} borderRadius="md">
<Button colorScheme="brand">Контакты</Button>
</Box>
<Box bg="brand.100" p={4} borderRadius="md">
<Button colorScheme="brand">Блог</Button>
</Box>
</Grid>
</Box>
);
}
Важно использовать компонент Link Next.js совместно с
Chakra UI, чтобы сохранить клиентскую навигацию и избегать перезагрузки
страницы.
При использовании динамических маршрутов
(pages/[slug].js) Chakra UI корректно работает с
асинхронной загрузкой данных. Пример с getStaticProps:
import { Box, Heading, Text } from "@chakra-ui/react";
export async function getStaticProps() {
const posts = await fetch("https://jsonplaceholder.typicode.com/posts")
.then(res => res.json());
return {
props: { posts },
};
}
export default function PostsPage({ posts }) {
return (
<Box p={8}>
{posts.slice(0, 10).map(post => (
<Box key={post.id} mb={4} p={4} borderWidth="1px" borderRadius="md">
<Heading size="md">{post.title}</Heading>
<Text mt={2}>{post.body}</Text>
</Box>
))}
</Box>
);
}
Использование Chakra UI здесь гарантирует, что визуальные компоненты сохранят стили при генерации страниц на сервере.
Chakra UI интегрируется с Next.js для динамического переключения тем. Пример переключателя темы:
import { useColorMode, Button } from "@chakra-ui/react";
export default function ThemeToggle() {
const { colorMode, toggleColorMode } = useColorMode();
return (
<Button onCl ick={toggleColorMode} mt={4}>
Переключить на {colorMode === "light" ? "тёмную" : "светлую"} тему
</Button>
);
}
Компонент ColorModeScript в _document.js и
useColorMode обеспечивают согласованное управление цветовой
схемой как на сервере, так и на клиенте.
Link и
динамические маршруты полностью поддерживаются.Box и Flex как базовые
строительные блоки интерфейса для максимальной гибкости.forwardRef, чтобы они
полностью поддерживали фокус, рефы и работу с формами Next.js.extendTheme для единообразного
дизайна и соблюдения брендовых цветов.react-hook-form) для быстрого построения интерактивных
страниц.Chakra UI в связке с Next.js обеспечивает мощный инструмент для создания производительных и стилизованных приложений с поддержкой SSR, динамических маршрутов и полной кастомизацией интерфейса.