Breaking changes — это изменения в библиотеке, нарушающие обратную совместимость. После обновления до новой версии код, написанный для предыдущих версий, может перестать работать или работать некорректно.
Для библиотек пользовательского интерфейса, подобных Muuri, breaking changes чаще всего касаются:
В проектах с динамическими сетками такие изменения особенно критичны, поскольку Muuri тесно связан с:
При обновлении версии библиотеки требуется внимательно анализировать release notes и адаптировать код.
Breaking changes в Muuri обычно делятся на несколько категорий.
Методы могут менять:
Пример (условный)
Старая версия:
grid.add(element, options);
Новая версия:
grid.add([element], options);
Теперь элемент должен передаваться в массиве, иначе метод не выполнится корректно.
Методы могут начать возвращать другие типы данных.
Старая версия
const item = grid.add(element);
Метод возвращал объект Item.
Новая версия
const items = grid.add(element);
Метод возвращает массив Item.
Код, ожидающий один объект, будет работать неправильно.
Со временем библиотека избавляется от устаревших функций.
Например, метод мог быть удалён полностью.
Старый код:
grid.refresh();
Новая версия может использовать:
grid.refreshItems().layout();
В этом случае:
разделены на разные операции.
Muuri активно использует событийную модель. Breaking changes могут касаться:
Пример.
Старый вариант:
grid.on('move', function(data) {
console.log(data.item);
});
Новая версия может изменить структуру:
grid.on('move', function(event) {
console.log(event.item);
});
В некоторых версиях параметры передаются несколькими аргументами, а не одним объектом.
Muuri включает мощную систему перетаскивания элементов. Breaking changes часто затрагивают именно эту часть.
Могут изменяться:
Старая конфигурация
new Muuri('.grid', {
dragEnabled: true
});
Новая версия
new Muuri('.grid', {
dragEnabled: true,
dragSort: true
});
Если ранее dragSort включался автоматически, новая
версия может требовать его явного указания.
Объект конфигурации при создании grid может меняться.
Некоторые опции могут перемещаться в новые вложенные объекты.
Старая версия
new Muuri('.grid', {
dragEnabled: true,
dragStartPredicate: function(item, event) {
return true;
}
});
Новая версия
new Muuri('.grid', {
dragEnabled: true,
dragStartPredicate: {
distance: 5,
delay: 0
}
});
Callback заменён на объект конфигурации.
Даже без изменения API поведение библиотеки может измениться.
Например:
Пример
В старой версии:
layoutDuration = 300
В новой:
layoutDuration = 500
Это влияет на плавность анимаций и тайминги интерфейса.
Muuri оперирует объектами Item, представляющими элементы сетки.
Изменения могут касаться:
Старый код:
item.getElement();
Новая версия может использовать:
item.getElement();
Но структура самого элемента могла измениться.
Например:
item.getElement().querySelector('.content');
может перестать работать, если библиотека изменила структуру wrapper-элементов.
Muuri управляет позициями через layout engine.
Старый код:
item._left
item._top
Использование внутренних свойств может перестать работать после обновления.
Вместо этого необходимо использовать публичные методы:
item.getPosition();
Muuri поддерживает мощную систему сортировки.
Изменения могут затронуть:
Старая версия
grid.sort(function(a, b) {
return a.getElement().dataset.order - b.getElement().dataset.order;
});
Новая версия
Иногда сортировка может работать через ключи:
grid.sort('order');
При этом атрибут должен существовать:
<div class="item" data-order="10"></div>
Фильтрация элементов выполняется через
grid.filter().
Изменения могут касаться формата callback.
Старая версия
grid.filter(function(item) {
return item.getElement().classList.contains('active');
});
Новая версия
Callback может получать дополнительные параметры:
grid.filter(function(item, index) {
return item.getElement().classList.contains('active');
});
Код, зависящий от аргументов, может требовать корректировки.
Muuri использует собственный алгоритм размещения элементов.
Изменения могут включать:
Старый вариант:
layout: {
fillGaps: true
}
Новый вариант может иметь дополнительные параметры:
layout: {
fillGaps: true,
horizontal: false,
alignRight: false
}
Если проект зависел от старых значений по умолчанию, layout может начать вести себя иначе.
Muuri активно использует CSS-transform и transitions.
Изменения могут касаться:
Старый код мог зависеть от внутренних классов:
.muuri-item-dragging
После обновления класс может измениться:
.muuri-item--dragging
Кастомные стили перестают применяться.
Muuri создаёт дополнительные DOM-обёртки.
Обновления могут изменить структуру элементов.
Старый DOM
.grid
.item
.content
Новый DOM
.grid
.muuri-item
.muuri-item-content
Скрипты, обращающиеся к дочерним элементам напрямую, могут перестать работать.
Drag события в Muuri включают:
Изменения могут касаться параметров callback.
Старый вариант
grid.on('dragEnd', function(item) {
console.log(item);
});
Новый вариант
grid.on('dragEnd', function(item, event) {
console.log(event);
});
Удаление grid может измениться.
Старая версия
grid.destroy();
Новая версия
grid.destroy(true);
Параметр может означать:
Если параметр не передан, поведение может отличаться.
Muuri поддерживает перетаскивание элементов между несколькими сетками.
Конфигурация может измениться.
Старая версия
dragSort: true
Новая версия
dragSort: function() {
return [grid1, grid2];
}
Теперь необходимо явно указать сетки.
При обновлении Muuri применяется несколько стратегий.
Каждая версия библиотеки публикует:
Если код использует устаревшие методы, необходимо заменить их на новые.
Drag-and-drop является наиболее чувствительной частью.
Проверяются:
Особенно важно проверить:
Любые стили, зависящие от внутренних классов Muuri, должны быть проверены после обновления.
Существует несколько практик, уменьшающих влияние breaking changes.
Нельзя обращаться к полям вида:
item._width
item._left
item._height
Это внутренний API, который может измениться.
Например:
item.getWidth()
item.getHeight()
item.getPosition()
Логику Muuri лучше размещать в отдельном модуле:
gridManager.js
Это упрощает миграцию.
Лучше оперировать:
item.getElement()Для production-проектов используется фиксированная версия:
muuri@0.9.5
Автоматическое обновление может привести к неожиданным breaking changes.
Старый код:
var grid = new Muuri('.grid', {
dragEnabled: true
});
grid.add(document.createElement('div'));
После breaking changes:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragSort: true
});
grid.add([document.createElement('div')]);
Изменения:
dragSortconstПрактика показывает, что чаще всего изменения затрагивают:
1. drag-and-drop
2. layout engine
3. методы работы с элементами
4. события grid
После обновления Muuri проблемы могут проявляться следующим образом:
Во всех этих случаях необходимо проверить соответствие кода новому API библиотеки.