Mithril — это современный легковесный фронтенд-фреймворк для создания одностраничных приложений (SPA), построенный на принципах виртуального DOM и реактивного программирования. Его ядро минимально, но при этом предоставляет все необходимые средства для построения эффективного интерфейса.
Компонент в Mithril представляет собой объект с методом
view. В простейшем случае это может быть:
const Hello = {
view: () => m("div", "Привет, Mithril!")
};
Для рендеринга компонента используется функция m.mount
или m.render:
m.mount(document.body, Hello);
m.mount связывает компонент с DOM-элементом и
автоматически управляет обновлениями.m.render выполняет одноразовую отрисовку без привязки к
состоянию.m()Основная функция создания элементов в Mithril — m(). Она
поддерживает несколько сигнатур:
m("tag", { атрибуты }, children)
Примеры:
m("button", { onclick: () => alert("Нажато") }, "Кликни меня")
m("ul", m("li", "Элемент 1"), m("li", "Элемент 2"))
Mithril поддерживает реактивное обновление через простые объекты и функции:
let count = 0;
const Counter = {
view: () => m("button", { onclick: () => { count++; } }, `Счётчик: ${count}`)
};
m.mount(document.body, Counter);
Для корректного обновления интерфейса необходимо явно вызывать
m.redraw(), если изменение происходит вне событий
Mithril:
setInterval(() => {
count++;
m.redraw();
}, 1000);
Mithril имеет встроенный роутер. Его настройка проста:
m.route(document.body, "/home", {
"/home": Home,
"/about": About
});
m.route связывает DOM с маршрутизатором.Маршрут можно динамически получать внутри компонентов:
console.log(m.route.get()); // текущий путь
m.route.set("/about"); // смена маршрута
Mithril содержит встроенный модуль m.request для
AJAX-запросов:
m.request({
method: "GET",
url: "/api/data"
})
.then(data => console.log(data))
.catch(err => console.error(err));
GET, POST,
PUT, DELETE.Для работы с формами используется обычный синтаксис HTML с привязкой событий:
let value = "";
const InputForm = {
view: () => m("input[type=text]", {
value,
oninput: e => value = e.target.value
})
};
oninput позволяет обновлять состояние в реальном
времени.value обеспечивает двустороннюю связь
данных.Mithril поддерживает стандартные хуки жизненного цикла:
oninit(vnode) — вызывается при инициализации
компонента.oncreate(vnode) — после добавления DOM.onupdate(vnode) — после обновления.onremove(vnode) — перед удалением компонента.Пример:
const Timer = {
oninit: vnode => { vnode.state.count = 0; },
oncreate: vnode => {
vnode.state.interval = setInterval(() => {
vnode.state.count++;
m.redraw();
}, 1000);
},
onremove: vnode => clearInterval(vnode.state.interval),
view: vnode => m("div", `Таймер: ${vnode.state.count}`)
};
Mithril отлично интегрируется с современными возможностями Jav * aScript:
import m from "mithril";
import Component from "./component.js";
view.const User = {
view: ({ attrs: { name, age } }) => m("div", `${name}, ${age}`)
};
m.request:const fetchData = async () => {
try {
const data = await m.request("/api/data");
console.log(data);
} catch(e) {
console.error(e);
}
};
const attrs = { class: "btn", type: "button" };
m("button", { ...attrs, onclick: () => alert("Нажато") }, "Кнопка")
Mithril позволяет строить сложные интерфейсы через вложенные компоненты:
const App = {
view: () => m("div", [
m(Header),
m(MainContent),
m(Footer)
])
};
Mithril отличается высокой производительностью за счет:
Использование key помогает контролировать повторное
использование DOM-элементов при рендеринге списков:
m("ul", items.map(item => m("li", { key: item.id }, item.name)))
Mithril легко интегрируется с современными сборщиками и инструментами:
Mithril сочетает компактность и гибкость, позволяя создавать SPA с минимальными зависимостями, при этом используя все современные возможности ECMAScript: модули, async/await, деструктуризацию, стрелочные функции и spread-операторы. Его простота не ограничивает функциональность, а жизненные циклы, виртуальный DOM и встроенные инструменты для роутинга и HTTP делают его мощным инструментом для фронтенд-разработки.