Mithril — это современный минималистичный JavaScript-фреймворк для создания одностраничных приложений (SPA). Одной из ключевых особенностей его использования является возможность строить приложения с модульной архитектурой, что обеспечивает удобство поддержки, расширяемость и тестируемость кода. Модульная архитектура предполагает разделение приложения на логически обособленные компоненты и сервисы, каждый из которых выполняет строго определённую роль.
Компоненты в Mithril — это основной строительный
блок приложения. Каждый компонент представляет собой объект с
обязательным методом view, который возвращает виртуальный
DOM (vDOM). Компоненты могут быть как простыми, так и сложными,
включающими в себя другие компоненты.
const Header = {
view: () => m("header", m("h1", "Пример заголовка"))
};
const Footer = {
view: () => m("footer", "© 2025 Компания")
};
Ключевые принципы работы с компонентами:
m.stream.Для управления данными и бизнес-логикой создаются отдельные сервисы. Сервис — это объект или модуль, который не зависит от представления (view) и отвечает за обработку данных, коммуникацию с сервером и управление состоянием.
Пример сервиса для работы с API:
const UserService = {
users: [],
load: () => m.request({ method: "GET", url: "/api/users" })
.then(result => UserService.users = result)
};
Принципы организации сервисов:
Рекомендованная структура для крупного Mithril-приложения:
/app
/components
Header.js
Footer.js
UserList.js
/services
UserService.js
/views
HomeView.js
UsersView.js
/routes.js
/app.js
Такое разделение помогает поддерживать чистую архитектуру и упрощает масштабирование приложения.
Компоненты должны получать данные через сервисы, избегая прямой работы с API или состоянием других компонентов. Например:
const UserList = {
oninit: () => UserService.load(),
view: () => m("ul", UserService.users.map(user => m("li", user.name)))
};
Особенности взаимодействия:
m.redraw() для обновления
представления.Mithril предоставляет встроенный роутер, который легко интегрируется с модульной архитектурой. Каждый маршрут связывается с конкретным view:
m.route(document.body, "/", {
"/": HomeView,
"/users": UsersView
});
Для обмена данными между компонентами используют:
Пример callback:
const Button = {
view: ({attrs}) => m("button", {onclick: attrs.onClick}, "Нажми меня")
};
const Counter = {
count: 0,
view: () => m("div",
m(Button, {onClick: () => Counter.count++}),
m("span", `Счёт: ${Counter.count}`)
)
};
Модульная архитектура в Mithril обеспечивает управляемость, масштабируемость и читаемость кода. Принципы разделения на компоненты, сервисы и views позволяют строить сложные приложения, оставаясь в рамках лёгкого и минималистичного фреймворка.