При работе с Chakra UI организация структуры проекта играет ключевую роль в поддерживаемости, масштабируемости и повторном использовании компонентов. Библиотека сама по себе не навязывает строгой архитектуры, однако оптимальная структура позволяет избежать хаоса в больших приложениях.
src и её
составные частиБазовая структура проекта на React с Chakra UI обычно выглядит следующим образом:
src/
├─ components/
├─ pages/
├─ theme/
├─ hooks/
├─ utils/
├─ assets/
├─ App.js
└─ index.js
Объяснение:
components/ – хранение
переиспользуемых UI-компонентов. Каждый компонент оформляется отдельной
папкой с файлами .jsx и .css или
.ts/.tsx, если используется TypeScript.pages/ – отдельные страницы
приложения, чаще всего для роутинга. Например,
HomePage.jsx, ProfilePage.jsx.theme/ – кастомизация Chakra UI:
цвета, шрифты, размеры и глобальные стили.hooks/ – пользовательские хуки для
работы с состоянием или бизнес-логикой.utils/ – вспомогательные функции,
форматтеры, константы.assets/ – изображения, иконки и другие
статические ресурсы.App.js и
index.js – точка входа, конфигурация
ChakraProvider и роута приложения.Chakra UI предоставляет компоненты низкого уровня (Box,
Flex, Stack) и высокоуровневые
(Button, Input, Modal).
Рекомендуется разделять:
PrimaryButton.jsx, CustomInput.jsx.Input и Button.Такой подход соответствует методологии Atomic Design и повышает повторное использование компонентов.
Chakra UI позволяет гибко настраивать тему через объект
extendTheme:
import { extendTheme } from "@chakra-ui/react";
const theme = extendTheme({
colors: {
brand: {
50: "#f5f7ff",
100: "#e0e7ff",
500: "#4f46e5",
900: "#1e1b4b"
}
},
fonts: {
heading: "Inter, sans-serif",
body: "Inter, sans-serif"
},
components: {
Button: {
variants: {
solid: {
bg: "brand.500",
color: "white",
_hover: { bg: "brand.600" }
}
}
}
}
});
export default theme;
Тема подключается в index.js через
ChakraProvider:
import React from "react";
import ReactDOM from "react-dom/client";
import { ChakraProvider } from "@chakra-ui/react";
import App from "./App";
import theme from "./theme";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<ChakraProvider theme={theme}>
<App />
</ChakraProvider>
);
Это обеспечивает единый стиль по всему приложению и упрощает изменения дизайна.
Chakra UI использует props для стилей, что позволяет минимизировать количество отдельных CSS-файлов. Например:
import { Box, Text, Button } from "@chakra-ui/react";
function Card({ title, description }) {
return (
<Box borderWidth="1px" borderRadius="lg" p={4} boxShadow="md">
<Text fontSize="xl" fontWeight="bold">{title}</Text>
<Text mt={2}>{description}</Text>
<Button mt={4} colorScheme="brand">Подробнее</Button>
</Box>
);
}
Для сложных и повторяющихся стилей можно использовать style
props, chakra factory или систему
sx.
Часто полезно разделять:
Пример структуры:
components/
├─ Card/
│ ├─ Card.jsx // презентационный компонент
│ └─ CardContainer.jsx // контейнер с логикой загрузки данных
Такое разделение повышает тестируемость и переиспользуемость компонентов.
Chakra UI можно интегрировать с любым роутером, чаще всего используется React Router:
src/
├─ pages/
│ ├─ HomePage.jsx
│ └─ ProfilePage.jsx
├─ App.js
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import HomePage from "./pages/HomePage";
import ProfilePage from "./pages/ProfilePage";
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/profile" element={<ProfilePage />} />
</Routes>
</Router>
);
}
Каждая страница использует переиспользуемые компоненты из
components и стилизуется через Chakra UI, обеспечивая
консистентный интерфейс.
Пользовательские хуки позволяют инкапсулировать логику работы с состоянием, API или формами:
hooks/
├─ useAuth.js
├─ useFetch.js
Утилиты включают вспомогательные функции и константы:
utils/
├─ formatDate.js
├─ constants.js
Такое разделение упрощает поддержку и повторное использование кода.
Для больших приложений рекомендуется:
index.js внутри папок для реэкспорта
компонентов.Эти практики позволяют поддерживать проект чистым и управляемым, даже при увеличении числа страниц, компонентов и сложной бизнес-логике.