Skip to content

deps description

Vitaly edited this page Oct 10, 2016 · 7 revisions

Определения: deps.js файл, deps-сущность

deps.js файл описывает зависимости между БЭМ-сущностями (с указанием технологий или без).

Зависимости описываются с помощью deps-сущностей - в нормализованном виде (без синтаксического сахара):

DepsEntity = {
    block : ?String,
    elem  : ?String,
    mod   : ?String,
    val   : ?(String|true),
    tech  : ?String,
    mustDeps   : ?(DepsEntity|Array<DepsEntity>),
    shouldDeps : ?(DepsEntity|Array<DepsEntity>),
    noDeps     : ?(DepsEntity|Array<DepsEntity>),
    include    : ?false
}

Опциональность полей

  1. Поля, определяющие БЭМ-сущность (block, elem, mod, val), восстанавливаются из контекста (текущий файл БЭМ-сущности или родительская deps-сущность) слева направо:
  • На вход получаем родительский и текущий узлы.
  • Проверяем в узле поле block, если есть — выходим, иначе — наполняем поле block из родительского узла.
  • Проверяем в узле поле elem, если есть — выходим, иначе — наполняем поле elem из родительского узла.
  • Для mod и val по аналогии.
  1. Поле tech позволяет описать зависимость между реализациями БЭМ-сущностей для конкретных технологий. В случае, когда tech не указана, зависимость называется общей и относится ко всем технологиям. Случаи, при указании tech только с одной стороны, разрешаются следующим образом:
  • Когда явно указанная технология зависит от общей, общая используется с тем же значением, что и явная.
  • Когда общая технология зависит от явной, то общая используется со значением собираемой технологии.
  1. Поле include: false позволяет описать зависимость без подключения зависимой БЭМ-сущности. Пример:
({
    block: 'foo',
    shouldDeps: {
        include: false,
        block: 'bar',
        mustDeps: { block: 'baz' }
    }
})
// Интерпретации:
//   - если появится bar, использовать дугу bar-mustDeps-baz
//   - foo не зависит от bar, мы просто описываем зависимость bar-mustDeps-baz в foo.deps.js
  1. Поля *Deps
  • Есть входная декларация (набор БЭМ сущностей) bemdecl.js файл
  • Цикл по каждой БЭМ-сущности (сущности упорядочены)
    • цикл по уровням переопределения (уровни упорядочены) для данной БЭМ-сущности (*)
      • читаем deps.js
      • обходим deps-сущности по порядку
      • обходим зависимости каждой deps-сущности в порядке: mustDeps, shouldDeps, noDeps (**)
        • добавляем mustDeps/shouldDeps-стрелки в аккумулятор
        • удаляем стрелки по noDeps из аккумулятора
        • для каждой зависимой deps-сущности продолжаем обход в глубину (*) и (**)
  • Граф зависимостей в аккумуляторе разворачивается в цепочку - массив всех необходимых БЭМ-сущностей

Синтаксический сахар

  1. elem: String[] раскрывается в массив deps-сущностей элементов с сохранением полей block, mod, val, tech, *Deps и include (deps-сущность блока в него не входит).

  2. elems: Array раскрывается в основную deps-сущность с полями block, mod, val и tech, и дополняет поле shouldDeps основной deps-сущности deps-сущностями элементов. Поддерживается синтаксический сахар: вместо DepsEntity можно использовать строку ('elemName'), эквивалентную { elem: 'elemName' }. Вместо массива из 1 элемента допустимо использовать сам элемент без оборачивания в массив.

  3. mods: Object — представляет из себя объект, ключами которого являются имена модификаторов, значениями — значения, и раскрывается в основную deps-сущность с полями block, elem, tech, *Deps, с дополненными полем shouldDeps описываемыми модификаторами в виде deps-сущностей. В значениях допустимо использовать строки или значение true, а так же массивы строк