Документация Mithril.js 2
Что такое Mithril.js?
Mithril.js — это современный клиентский JavaScript-фреймворк для создания одностраничных приложений (SPA). Он компактный (8.9 KiB в gzip), быстрый и предоставляет готовые инструменты для маршрутизации и XHR.
Размер загрузки
Mithril.js (8.9 KiB)Vue + Vue-Router + Vuex + fetch (40 KiB)React + React-Router + Redux + fetch (64 KiB)Angular (135 KiB)Производительность
Mithril.js (6.4 ms)Vue (9.8 ms)React (12.1 ms)Angular (11.5 ms)Mithril.js используется такими компаниями, как Vimeo и Nike, а также проектами с открытым исходным кодом, такими как Lichess.
Если вы опытный разработчик и хотите узнать, как Mithril.js соотносится с другими фреймворками, смотрите страницу сравнения фреймворков.
Mithril.js поддерживает IE11, Firefox ESR и последние две версии Firefox, Edge, Safari и Chrome. Полифилы не требуются.
Ищете документацию v1? Нажмите здесь.
С чего начать
Простой способ попробовать Mithril.js — это подключить его через CDN и следовать этому руководству. Оно охватывает большую часть API (включая маршрутизацию и XHR), но займет всего 10 минут.
Давайте создадим HTML-файл для выполнения инструкций:
<body>
<script src="https://unpkg.com/mithril/mithril.js"></script>
<script>
var root = document.body;
// Здесь будет ваш код!
</script>
</body>Чтобы упростить процесс, вы можете попробовать Mithril.js прямо здесь. Это живая песочница с предварительно загруженным Mithril.js, которая, кстати, тоже реализована на Mithril.
var root = document.body;
// Ваш код здесь
m.mount(root, {
view: function () {
return m('h1', 'Try me out');
},
});
Hello world
Начнем с малого: выведем текст на экран. Напечатайте его вручную — так материал усвоится лучше.
var root = document.body;
m.render(root, 'Hello world');Теперь давайте изменим текст на что-нибудь другое. Добавьте эту строку кода под предыдущей:
m.render(root, 'My first app');Как видите, вы используете один и тот же код как для создания, так и для обновления HTML-кода. Mithril.js автоматически определяет наиболее эффективный способ обновления текста, а не слепо воссоздает его с нуля.
Живой пример
var root = document.body;
m.render(root, 'Hello World');
DOM-элементы
Давайте обернем текст в тег <h1>.
m.render(root, m('h1', 'My first app'));Функция m() может использоваться для создания любой HTML-структуры, которую вы хотите. Итак, если вам нужно добавить класс к <h1>:
m('h1', { class: 'title' }, 'My first app');Если вы хотите иметь несколько элементов:
[m('h1', { class: 'title' }, 'My first app'), m('button', 'A button')];И так далее:
m('main', [
m('h1', { class: 'title' }, 'My first app'),
m('button', 'A button'),
]);Живой пример
var root = document.body;
m.render(root, [
m('main', [
m('h1', { class: 'title' }, 'My first app'),
m('button', 'A button'),
]),
]);
Примечание: Если вы предпочитаете синтаксис <html>, его можно использовать через плагин Babel.
// HTML синтаксис через JSX плагин Babel
<main>
<h1 class="title">My first app</h1>
<button>A button</button>
</main>Компоненты
Компонент Mithril.js — это объект с функцией view. Вот код выше в виде компонента:
var Hello = {
view: function () {
return m('main', [
m('h1', { class: 'title' }, 'My first app'),
m('button', 'A button'),
]);
},
};Чтобы активировать компонент, мы используем m.mount.
m.mount(root, Hello);Как и ожидалось, это создает следующую разметку:
<main>
<h1 class="title">My first app</h1>
<button>A button</button>
</main>Функция m.mount похожа на m.render, но, в отличие от нее, она активирует систему автоматической перерисовки Mithril.js. Чтобы понять, что это значит, давайте добавим несколько событий:
var count = 0; // добавлена переменная
var Hello = {
view: function () {
return m('main', [
m('h1', { class: 'title' }, 'My first app'),
// изменена следующая строка
m(
'button',
{
onclick: function () {
count++;
},
},
count + ' clicks'
),
]);
},
};
m.mount(root, Hello);Мы определили событие onclick на кнопке, которое увеличивает значение переменной count. Теперь мы также отображаем значение этой переменной в тексте кнопки.
Теперь вы можете обновить текст кнопки, нажав на кнопку. Поскольку мы использовали m.mount, вам не нужно вручную вызывать m.render, чтобы применить изменения в переменной count к HTML; Mithril.js делает это за вас.
Если вам интересно узнать о производительности, то Mithril.js очень быстро выполняет обновления рендеринга, потому что он затрагивает только те части DOM, которые ему абсолютно необходимы. Итак, в нашем примере выше, когда вы нажимаете кнопку, текст в ней — это единственная часть DOM, которую Mithril.js фактически обновляет.
Живой пример
var root = document.body;
var count = 0; // добавлена переменная
var Hello = {
view: function () {
return m('main', [
m(
'h1',
{
class: 'title',
},
'My first app'
),
m(
'button',
{
onclick: function () {
count++;
},
},
count + ' clicks'
),
]);
},
};
m.mount(root, Hello);
Маршрутизация
Маршрутизация — это просто переход между экранами в приложении с несколькими экранами.
Давайте добавим заставку, которая появляется перед нашим счетчиком кликов. Сначала мы создадим компонент для нее:
var Splash = {
view: function () {
return m('a', { href: '#!/hello' }, 'Enter!');
},
};Как видите, этот компонент просто отображает ссылку на #!/hello. Символ #! называется hashbang и часто используется в одностраничных приложениях для обозначения пути маршрута (например, /hello).
Теперь, когда у нас будет несколько экранов, мы будем использовать m.route вместо m.mount.
m.route(root, '/splash', {
'/splash': Splash,
'/hello': Hello,
});Функция m.route по-прежнему обладает той же функциональностью автоматической перерисовки, что и m.mount, а также включает в себя отслеживание URL-адреса; другими словами, она позволяет Mithril.js знать, что делать, когда он видит #! в URL-адресе.
"/splash" сразу после root означает, что это маршрут по умолчанию, то есть если хеш-банг в URL-адресе не указывает на один из определенных маршрутов (/splash и /hello в нашем случае), то Mithril.js перенаправляет на маршрут по умолчанию. Итак, если вы откроете страницу в браузере и ваш URL-адрес будет https://localhost, то вы будете перенаправлены на https://localhost/#!/splash.
Кроме того, как и следовало ожидать, нажатие на ссылку на заставке перенесет вас на экран счетчика кликов, который мы создали ранее. Обратите внимание, что теперь ваш URL-адрес будет указывать на https://localhost/#!/hello. Вы можете перемещаться вперед и назад к заставке, используя кнопки "назад" и "вперед" в браузере.
Живой пример
var root = document.body;
var count = 0;
var Hello = {
view: function () {
return m('main', [
m(
'h1',
{
class: 'title',
},
'My first app'
),
m(
'button',
{
onclick: function () {
count++;
},
},
count + ' clicks'
),
]);
},
};
var Splash = {
view: function () {
return m(
'a',
{
href: '#!/hello',
},
'Enter!'
);
},
};
m.route(root, '/splash', {
'/splash': Splash,
'/hello': Hello,
});
XHR
По сути, XHR — это просто метод взаимодействия с сервером.
Давайте изменим наш счетчик кликов, чтобы он сохранял данные на сервере. В качестве сервера мы будем использовать REM, mock REST API, разработанный для игрушечных приложений, таких как этот учебник.
Сначала мы создадим функцию, которая вызывает m.request. url указывает эндпоинт, который представляет ресурс, method указывает тип действия, которое мы выполняем (обычно метод PUT upserts), body — это данные, которые мы отправляем в эндпоинт, а withCredentials означает включить cookies (требование для работы REM API).
var count = 0;
var increment = function () {
m.request({
method: 'PUT',
url: '//mithril-rem.fly.dev/api/tutorial/1',
body: { count: count + 1 },
withCredentials: true,
}).then(function (data) {
count = parseInt(data.count);
});
};Вызов функции increment upserts объект {count: 1} в эндпоинт /api/tutorial/1. Эта конечная точка возвращает объект с тем же значением count. Обратите внимание, что переменная count обновляется только после завершения запроса и обновляется значением ответа с сервера.
Давайте заменим обработчик событий в компоненте, чтобы вызывать функцию increment вместо непосредственного увеличения переменной count:
var Hello = {
view: function () {
return m('main', [
m('h1', { class: 'title' }, 'My first app'),
m('button', { onclick: increment }, count + ' clicks'),
]);
},
};Нажатие кнопки теперь должно обновить счетчик.
Живой пример
var root = document.body;
var count = 0;
var increment = function () {
m.request({
method: 'PUT',
url: '//mithril-rem.fly.dev/api/tutorial/1',
body: { count: count + 1 },
withCredentials: true,
}).then(function (data) {
count = parseInt(data.count);
});
};
var Hello = {
view: function () {
return m('main', [
m(
'h1',
{
class: 'title',
},
'My first app'
),
m(
'button',
{
onclick: increment,
},
count + ' clicks'
),
]);
},
};
m.mount(root, Hello);
Мы рассмотрели, как создавать и обновлять HTML, как создавать компоненты, маршруты для одностраничного приложения и взаимодействовать с сервером через XHR.
Этого должно быть достаточно, чтобы начать писать клиентскую часть реального приложения. Теперь, когда вы освоились с основами API Mithril.js, обязательно ознакомьтесь с учебником по простому приложению, который проведет вас через создание реалистичного приложения.