Задача миграции проектных шаблонов
Чтобы мигрировать проектные шаблоны, нужно для начала четко формализовать то, что нужно исправить.
Список правок был составлен на основе гайдов по миграции и примечаний к релизам, которые я делал весь 2016 год.
Приведу еще раз все необходимые шаги для последовательной миграции шаблонов с bem-xjst v1.x до v8.x здесь.
bem-xjst v1.x → v2.x
def()режим должен возвращать хоть что-то.- все поля шаблонизатора доступные ранее в
this._теперь переехали просто вthis. - нет больше
mode('')(режима с пустым именем), используйтеdef(). - подпредикат
block(…)теперь обязателен для всех шаблонов. this._strбольше не существует.- изменилось поведение
apply('modeName'). - результат вызова режима
tag()теперь имеет приоритет над полемtagиз BEMJSON-а.
bem-xjst v2.x → v3.x
apply.call(BEMJSON)нужно исправить наapply(BEMJSON).
bem-xjst v3.x → v4.x
block('b').wrap()(function() { … })вместоblock('b').wrap().def()(function() { return applyCtx({ … }); }).
bem-xjst v4.x → v5.x
- Необходимо заменить
elemMatch(argument)наelem('*').match(function() { ... }).elemMatch()упразднен. - Поведение полей
modsиelemModsв BEMJSON изменено. bem-xjst больше не будет восприниматьmodsкакelemMods. - API изменено:
require('bem-xjst')теперь возвращает два движкаbemhtmlиbemtree. Просто заменитеrequire('bem-xjst')наrequire('bem-xjst').bemhtml.
bem-xjst v5.x → v6.x
- результат вызова режима
tag()теперь имеет приоритет над полемtagиз BEMJSON-а.
bem-xjst v6.x → v7.x
this.isArray()устарел, используемArray.isArray().once()устарел и выпилен, используем простоdef().- Теперь bem-xjst для сравнения значения модификатора из подпредиката шаблона и из BEMJSON-а предварительно приведет значение из BEMJSON-а к строке. Это может вызвать несоответствие поведения с версией v6.x. Поэтому считаем хорошей практикой, когда значения модификаторов — строка. Пример, результат которого можно сравнить в v6.x и v7.x
- Опционально: v6.x по умолчанию генерила закрывающие слеши у одиночных тегов. В v7.x это поведение отменено и она по умолчанию генерит HTML а не XHTML. Чтобы вернуть закрывающие слеши можно воспользоваться опцией bem-xjst
xhtml: true.
bem-xjst v7.x → v8.x
- Для обратной совместимости необходимо заменить режимы
mix()наaddMix(),attrs()наaddAttrs(),js()наaddJs().
Автомигратор
В связи с этим длинным хвостом технологических долгов я сделал автомигратор шаблонов и статический линтер.
Автомигратор доступен в bem-xjst v7.x и v8.x (актуальные версии) и умеет править код проектных шаблонов так, чтобы он начал соответствовать указанной мажорной версии.
Под капотом обычный jscodeshift и тесты на трансформации кода. Если появятся какие-либо вопросы после прочтения документации создавайте issue в репозитории шаблонизатора.
Статический линтер
Кроме того, вы можете запускать статические проверки для ваших шаблонов и включить их (наравне с runtime проверками) в ваш процесс разработки.
Эти линтеры помогут отловить всякое безумие в коде шаблонов и в схеме BEMJSON, кроме того станут отличным каналом для передачи сообщений от шаблонизатора до его пользователей.