Atomico использует модульную систему ES Modules как основу для организации кода. Компоненты, хуки и вспомогательные функции оформляются как отдельные модули и импортируются в нужных местах. Такая архитектура обеспечивает оптимизацию бандла, минимизацию избыточных зависимостей и предсказуемость сборки.
1. Явный экспорт
Компонент определяется и затем явно экспортируется из модуля. Это позволяет избирательно подключать нужные элементы проекта, избегая глобальных пространств имён.
2. Декларативный импорт
Импорты формируют структуру зависимостей. Atomico интегрируется с системой импортов браузера и инструментов сборки (Vite, Rollup, Webpack), сохраняя одинаковую семантику.
3. Независимость модулей
Компоненты не предполагают обязательного знания о месте использования. Локальные зависимости описываются через импорт, внешний контракт — через свойства и события.
Компонент определяется функцией и экспортируется по умолчанию или по имени. По умолчанию экспорт удобно использовать для модулей, содержащих один основной компонент. Именованный экспорт подходит для библиотек и модулей с несколькими сущностями.
Пример:
export default function MyButton() {
return <button>Кнопка</button>;
}
Альтернативный подход:
export function MyButton() {
return <button>Кнопка</button>;
}
Импорт компонента или функции определяет доступные зависимости:
import MyButton from "./button.js";
Именованный импорт обеспечивает более точный контроль:
import { useProp, useListener } from "atomico";
Использование именованных экспортов позволяет компоненту выбирать только необходимые хуки и утилиты.
Хуки формируют ядро реактивности Atomico. Их рекомендуется выделять в отдельные модули, что способствует разделению ответственности. Такая стратегия повышает переиспользуемость логики и снижает связанность компонентов.
Пример организации:
/hooks/use-toggle.js
export function useToggle(initial) {
const [state, setState] = useState(initial);
const toggle = () => setState(!state);
return [state, toggle];
}
/components/toggle-button.js
import { useToggle } from "../hooks/use-toggle.js";
export function ToggleButton() {
const [open, toggle] = useToggle(false);
return <button oncl ick={toggle}>{open ? "Открыто" : "Закрыто"}</button>;
}
Atomico предполагает, что дерево зависимостей должно быть компактным. Организация функционала по модулям облегчает:
При использовании TypeScript или JSDoc контракты компонентов и хуков оформляются в соответствующих декларациях. Это упрощает автодополнение, проверку типов и документацию.
Пример JSDoc над компонентом:
/**
* @prop {string} label
* @prop {boolean} disabled
*/
export function MyButton({ label, disabled }) {
return <button disabled={disabled}>{label}</button>;
}
Такая декларация влияет на понимание API компонента инструментами разработки.
Atomico совместим с динамическим импортом, что позволяет разделять код на чанки и загружать компоненты по требованию:
const { ModalComponent } = await import("./modal.js");
Стратегия подходит для маршрутизации, ленивой загрузки тяжёлых компонентов и оптимизации интерактивных зон.
Сборщики на основе ES Modules анализируют декларации модулей Atomico напрямую:
<script type="module">.Atomico не требует дополнительных плагинов для базового анализа модулей, что снижает сложность конфигурации.
Использование хуков в отдельных модулях способствует разделению логики и JSX-разметки. Компонент остаётся тонким слоем, связывающим состояние с DOM. Такая организация даёт возможность переиспользования состояния в разных компонентах и тестирования логики без рендера.
Модуль объявляет только те сущности, которые задумываются как часть API. Всё остальное остаётся внутренним. Это позволяет поддерживать стабильные контракты, даже при изменении внутреннего устройства компонентов.
Ключевые моменты:
Atomico допускает построение библиотек компонентов. В таком случае организация модулей включает уровни:
Каждый уровень формирует собственные декларации модулей. Такая структура облегчает развитие библиотек и интеграцию в существующие интерфейсы.
Компетентное использование деклараций модулей формирует устойчивую архитектуру. Проекты приобретают стабильность благодаря контролю экспортируемых сущностей, разделению логики и визуального слоя, оптимизации сборки и предсказуемости зависимостей.