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