Matreshka.js заполняет образовавшуюся за последние годы пропасть между джуном и сеньором
Вышла beta второй версии фреймворка Matreshka.js. Релиз выйдет через неделю (плюс пара дней) после последнего патча, отчет начинается с выходом этого поста. Версию можно считать стабильной, а статус beta — чистой формальностю, так как проект достаточно долго и без серьезных изменений пребывал в статусе prealpha/alpha и проверялся в реальных проектах.
» Репозиторий
» Сайт
Позиционирование фреймворка
Вместо наивного "JavaScript фреймворк для всех", Matreshka.js теперь позиционируется, как "Простой фреймворк для джунов". Позвольте мне, вместо дублирования текста с сайта, разместить ссылку на текст, объясняющий этот момент более детально.
Общие изменения
- Фреймворк был переписан с нуля, с использованием ECMAScript 2015 и некоторых элементов синтаксиса, еще не вошедших в финальную спецификацию.
- Все примеры так же переписаны на новый JavaScript.
- Устранены все потенциальные утечки памяти.
- Добавлена возможность импортировать только необходимые функции и классы. В документации к каждому статичному методу и классу указан и адрес модуля.
const bindNode = require('matreshka/bindnode');
bindNode(object, key, node);
- Все сопроводительные материалы так же обновились: статьи, роутер, и пр.
- Документация собирается с помощью Webpack и самописного плагина, который очень быстро генерирует HTML файлы из JSDoc и GFM.
Автоматизация процесса выпуска новых версий
Раньше, для выпуска нового релиза приходилось совершать несколько повторяющихся действий:
- Изменение в коде, написание тестов
- Коммит изменений
- Сборка с помощью Grunt
- Коммит, сообщающий о сборке
- Изменение версии в package.json вручную
- Публикация модуля на NPM
- Пуш на Github
- Создание релиза на Github
- Обновление раздела "что нового" в русскоязычной версии сайта
- Добавление нового пункта в документацию (если в релиз попадает новая фича)
- Сборка сайта и деплой на сервер
- Коммит в репозиторий сайта
- Сообщение о выпуске новой версии в Twitter, VK, Facebook
Поэтому я не спешил делать релиз, если изменение исправляло проблему, которую можно расценивать как "минорную", а предпочитал накопить список изменений и выпустить новую версию на выходных (конечно, исправления критических проблем, выходили как можно скорее).
Благодаря включению в проект semantic-release, использованию Travis CI и другим изменениям (например, удалению русскоязычного changelog), выпуск релизов происходит по очень простой схеме.
- Изменение в коде, написание тестов
- Пуш на Github
- Добавление нового пункта в документацию (если в релиз попадает новая фича)
- Коммит в репозиторий сайта (если в релиз попадает новая фича)
Причем, попадание новых фич в сам фреймворк — маловероятно (об этом ниже), поэтому последний и предпоследние пункты можно не учитывать.
После того, как коммит с префиксом fix или feat попадает на Github, происходит следующее:
- CI вызывает тесты
- semantic-release анализирует коммиты и меняет версию в package.json
- Код компилируется в ES5 для NPM
- Сборка с помощью Webpack
- Публикация сборки в бранче gh-pages (т. е. больше нет грязных коммитов, типа "rebuild")
- Бот сообщает о новом релизе в Twitter
- Публикация нового релиза на Github
Не удивляйтесь, если увидете несколько патчей, сделанных в один день (надеюсь, что такие случаи будут редки).
В свою очередь, при любом коммите в репозиторий сайта, Travis с помощью PM2 автоматически деплоит сайт на сервер.
Другие реформации
- Добавлена версия документации на украинском.
- Название у фреймворка теперь одно: Matreshka.js или, сокращенно — Matreshka (латиницей, с большой буквы).
- Страницы в VK и Facebook закрыты из-за нерегулярности и шаблонности новостей, типа "вышла новая версия".
- Все примеры и основные туториалы теперь живут в этом репозитории.
- Запущена кампания по сбору средств на Patreon. Если ваша компания использует Matreshka.js, финансовая поддержка проекта будет являться гарантией того, что проект будет активно развиваться. Если вы индивидуальный разработчик, то и ваша помощь не менее важна. Надеюсь на вашу поддержку, ведь разработка такого крупного продукта и создание трехъязычной документации стоит сотен часов безвозмездной работы.
Изменения API
Самым крупным изменением стало удаление многих функций, которые были ни к селу, не к городу (например, функция trim).
Почему эти функции вообще существали? Мотивация была простой: они были нужны для внутренних механизмов работы фреймворка и, если эти функции и так есть, почему бы не добавить их в публичное API фреймворка?
Как следствие, документация сильно раздулась, что не самым приятным образом отразилось на простоте знакомства с фреймворком, многие полезные методы терялись в информационном шуме, а возможность убрать такие функции пропала (так как это ломающее изменение).
Начиная со второй версии Matreshka.js включает в себя возможности специфичные для самого фреймворка, но не включает никаких "общих" функций. О конкретных причинах удаления некоторых методов, я писал на форуме.
Новые фичи, скорее, будут выходить в виде дополнительных плагинов и библиотек, чем попадать в сам фреймворк (хотя, последнее не исключено).
Изменения API описаны ниже очень кратко, дабы не дублировать текст документации.
(!!!) — ломающие изменения
(!) — ломающие изменения, которые, скорее всего, не повлияют на старые приложения
То, что было удалено
- (!!!)
Matreshka.delay - (!!!)
Matreshka#delay - (!!!)
Matreshka.define - (!!!)
Matreshka#define - (!!!)
Matreshka.defineSetter - (!!!)
Matreshka#defineSetter - (!!!)
Matreshka.defineGetter - (!!!)
Matreshka#defineGetter - (!!!)
Matreshka#getAnswerToTheUltimateQuestionOfLifeTheUniverseAndEverything - (!!!)
Matreshka.trim - (!!!)
Matreshka.orderBy - (!!!)
Matreshka.noop - (!!!)
Matreshka.extend - (!!!)
Matreshka.each - (!!!)
Matreshka.bound - (!!!)
Matreshka#bound - (!!!)
Matreshka.$bound - (!!!)
Matreshka#$bound - (!!!)
Matreshka.boundAll - (!!!)
Matreshka#boundAll - (!!!)
Matreshka.randomString(теперь живет тут) - (!!!)
Matreshka.get - (!!!)
Matreshka#get - (!!!)
Matreshka.deepFind - (!!!)
Matreshka.setProto - (!!!)
Matreshka.toArray - (!!!)
Matreshka.version - (!!!)
Matreshka#sandbox - (!!!)
Matreshka#$sandbox - (!!!)
Matreshka.Object#toNative - (!!!)
Matreshka.Object#toObject - (!!!)
Matreshka.Array#toNative - (!!!)
Matreshka.Array#toArray - (!!!)
Matreshka.binders.file(теперь живет тут) - (!!!)
Matreshka.binders.dropFile(теперь живет тут) - (!!!)
Matreshka.binders.dragOver(теперь живет тут) - (!!!)
Matreshka.Array#each - (!!!)
Matreshka.Array#hasOwnProperty - (!!!)
Matreshka.Array#useBindingsParser - (!!!)
Matreshka.Object#hasOwnProperty - (!!!)
window.Class(используйтеMatreshka.Classвместо глобальной переменной) - (!!!)
window.$b,Matreshka.$b - (!!!)
Matreshka.$ - (!!!) Библиотека
matreshka-magic - (!!!)
Matreshka.binders.innerHTML - (!!!)
Matreshka.binders.innerText - (!!!)
Matreshka.binders.attribute - (!!!)
Matreshka.binders.property
Переименованные методы и свойства
- (!!!)
Matreshka#linkProps->Matreshka#calc - (!!!)
Matreshka.to->Matreshka.toMatreshka - (!!!)
Matreshka#setClassFor->Matreshka#instantiate Matreshka.Object#jset->Matreshka.Object#setData(jsetне убран)- (!!!)
Matreshka#isMK->Matreshka#isMatreshka - (!!!)
Matreshka.Object#isMKObject->Matreshka.Object#isMatreshkaObject - (!!!)
Matreshka.Array#isMKArray->Matreshka#isMatreshkaArray - (!!!)
Matreshka.useAs$->Matreshka.useDOMLibrary
Изменения в методах bindNode и unbindNode
- (!!!) Синтаксис
{ key: [node, binder] }больше не поддерживается. - (!!!) Синтаксис "куча аргументов" больше не поддерживается.
- Новый синтаксис
([{key, node, binder, event}], commonEventOptions). - Новый синтаксис
{key: { node, binder }}and{key: [{ node, binder }]}. (Эврика! Этот синтаксисс позволяет красиво навешать много байндингов одним вызовомbindNode). - (!) События
bind,bind:KEYвызываются на каждую привязанную ноду. - (!)
unbind,unbind:KEYвызываются на каждую отвязанную ноду. - Флаг
useExactBinder. - (!!!) Флаг
assignDefaultValueпереименован вgetValueOnBind. - Флаг
setValueOnBind. - (!!!) Флаг
debounceудален. - (!) Флаг
debounceSetValue. - (!) Флаг
debounceGetValue. - Флаг
debounceSetValueOnBind. - Флаг
debounceGetValueOnBind. - Флаг
debounceGetValueDelay. - Флаг
debounceSetValueDelay. - (!!!) Флаг
exactKeyвместоdeep.
За подробностями обратитесь к документации bindNode и unbindNode
Изменения в байндерах
- Новый метод байндера
destroy. - (!!!) Байндер
classNameбольше не поддерживает синтаксис с восклицательным знаком. Вместо этого, можно передатьfalseв качестве второго аргумента. - Аргумент
bindingOptionsдля всех методов байндера (например,getValue(bindingOptions) {...}).
За подробностями обратитесь к документации bindNode и binders
Изменения в parseBindings
- Метод принимает
eventOptionsвторым аргументом {{штуки}}не заменяются элементомspan.- (!!!) Первый аргумент обязателен.
- Внутри
{{ скобок }}можно использовать пробелы.
За подробностями обратитесь к документации parseBindings
Изменения в bindSandbox
- Теперь метод отвязывает предыдущую песочницу, прежде, чем привязать новую.
За подробностями обратитесь к документации bindSandbox
Изменения в методе calc (который раньше назывался linkProps)
- (!!!) Флаг
debounceпереименован вdebounceCalc. - (!)
debounceCalcпо умолчаниюtrue. - Флаг
debounceCalcOnInit. - Флаг
exactKey. - (!!!) Флаг
skipLinksпереименован вskipCalcдля использования в методеset. - (!!!) Синтаксис
[inst, key, inst, key]убран. - Новый синтаксис
{ target: {source, event, handler} }(Эврика! Можно вызывать методcalcодин раз на много свойств). - Новый синтаксис
[{object, key}]. - Флаг
debounceCalcDelay.
За подробностями обратитесь к документации calc
Изменения в Matreshka.Array
- (!!!) Флаг
skipMediatorпереименован вskipItemMediator. - (!) Метод
pullподдерживает только объекты и числа. fromиofтеперь наследуются.- (!!!) Объект события
addoneсодержит добавленный объект под свойствомaddedItemвместоadded. - (!!!) Объект события
removeoneсодержит удаленный объект под свойствомremovedItemвместоremoved. - (!)
itemRendererне оборачивается вspan, если содержит несколько узлов; вместо этого генерируется исключение. - Свойство
useBindingsParserудалено. - (!!!) Парсер байндингов включен по умолчанию.
- Метод
includes. - Метод
find. - Метод
findIndex. - Метод
fill. - Метод
copyWithin. - Метод
keys. - Метод
values. - Метод
entries.
За подробностями обратитесь к документации Matreshka.Array, pull, from, of, itemRenderer, METHOD.
Изменения в Matreshka.Object
- Событие
set, которое срабатывает при изменении свойств (но не удалении), отвечающих за данные. - Метод
jsetпереименован вsetData(по просьбам сообщества, старое название по-прежнему будет присутствовать). - Флаг
replaceDataдля методаsetData. - Метод
isDataKey. - Метод
values. - Метод
entries.
За подробностями обратитесь к документации Matreshka.Object, setData, isDataKey, values, entries
Изменения в Matreshka.Class
- Статичные методы наследуются.
- Свойства с именами типа
symbolподдерживаются и в качестве свойств прототипа и в качестве статичных свойств.
За подробностями обратитесь к документации Matreshka.Class
Другие изменения
- Статичный метод chain.
- (!!!) Геттер и сеттер свойства
sandboxгенерируют исключение для всех объектов. - (!!!) Геттер и сеттер свойства
containerгенерируют исключение для экземпляровMatreshka.Array. - (!!!) "Список ключей, разделенных пробелами" больше не поддерживается ни одним из методов.
- Исправлены некоторые неочевидные баги
- Все классы и функции можно импортировать в виде CommonJS модуля (
import text from 'matreshka/binders/text') - Понятные ошибки.
Проекты, которые появились благодаря работе над Matreshka.js
- deploy-to-git — CLI тулза, позволяющая деплоить что-либо (в моём случае, результат сборки) на Git сервер.
- github-embed — эмбеддинг кода с Github, используется на официальном сайте.
- webpack-generate-umd-externals — приблуда для Webpack, решающая редкую задачу: создание плагина, поддерживающего UMD для чего-то, так же поддерживающего UMD (в данном случае, Matreshka.js), но с импортом CommonJS зависимостей без импорта всего фреймфорка (сложно, не вдумывайтесь).
- cz-simple-conventional-changelog — упрощенный cz-conventional-changelog.
- eslint-plugin-output-todo-comments — плагин для ESLint, который выводит комментарии, с заданным префиксом в виде варнингов или ошибок; используется в Matreshka.js, чтоб TODO комментарии не терялись.
- babel-plugin-transform-object-spread-inline — транспайлит синтаксис object spread в быстрый цикл
forвместо вызоваObject.assign. - babel-plugin-nofn — транспайлит вызов мета функции в быстрый цикл
for. - babel-plugin-transform-es2015-modules-simple-commonjs — упрощенный трансформер модулей ECMAScript 2015 в CommonJS для компактности результирующего кода.
- uniquestring — генератор псевдослучайной строки (замена
Matreshka.randomString). - makeelement — создание DOM элементов (замена
Matreshka.$b.create).
Спасибо за внимание!
Автор: Finom
