bem / bem-core

BEM Core Library
https://ru.bem.info/technologies/classic/i-bem/
Other
275 stars 94 forks source link

i-bem__dom: add ability to define BEMDOM-blocks as ym modules #382

Closed dfilatov closed 10 years ago

dfilatov commented 10 years ago

See #429 for new details. Information below is outdated.

It allows us to write less code and looks more logical in terms of YModules.

before:

/**
 * @module i-bem__dom
 */

modules.define(
    'i-bem__dom',
    ['jquery', 'ua', 'dom'],
    function(provide, $, ua, dom, BEMDOM) {

/**
 * @exports
 * @class popup
 * @bem
 */
BEMDOM.decl(
    { block : 'popup', modName : 'autoclosable', modVal : true },
    /* props */,
    /* staticProps */);

provide(BEMDOM);
});

after:

/**
 * @module popup
 */

modules.define(
    { block : 'popup', modName : 'autoclosable', modVal : true },
    ['jquery', 'ua', 'dom'],
    function(provide, $, ua, dom) {
/**
 * @exports
 * @class popup
 * @bem
 */
provide(
    /* props */,
    /* staticProps */); // NOTE: in case of defining block provide() can accept two arguments
});
dfilatov commented 10 years ago

cc @arikon @vithar

tadatuta commented 10 years ago

@dfilatov у меня есть пара вопросов по использованию модульной системы:

  1. сейчас, если в коде блока есть какая-то упячка, сообщения об ошибках получаются малоинформативными: не удалось разрезолвить какой-то из депендов, сущность, которую дефайним оказалась undefined. при этом сущностью всегда являлся `i-bem__dom, а стектрейс указывает на внутренности модульной системы. найти реальное место с проблемой оказывается сложно. верно ли я понимаю, что при внедрении описанной системы проблема автоматически отпадает?
  2. существует ситуация, когда блоки подключаются по депсам на страницу, но в дом не попадают. при этом если такой блок зависит от каких-то модулей, модули в любом случае будут загружены, хотя использоваться реально не будут. при этом в случае, скажем, с картой, вытягивается тяжелое карточное АПИ со своими собственными депендами. можно ли что-то с этим сделать?
arikon commented 10 years ago

@dfilatov Это можно портировать в bem-bl?

dfilatov commented 10 years ago

@tadatuta

  1. В ошибке теперь будет можно понять в каком модуле произошла она, с точностью до модификатора. Модификаторы BEMDOM-блоков не являются самостоятельными модулями.
  2. Как так получается, что блок есть в депсах, но при этом не используется? Видимо, я не понял вопроса.
dfilatov commented 10 years ago

@arikon Портировать что именно? Модульной системы нет в bem-bl.

tadatuta commented 10 years ago

@dfilatov

  1. у меня есть common-бандл, который включает депенды для разных страниц. не жалко, если при загрузке page1 вытянется common.js с лишним кодом, но не хочется, чтобы этот код инициализировался, если в доме page1 не присутствует часть блоков.
arikon commented 10 years ago

@dfilatov Как будет выглядеть описание зависимости блока от другого блока? Или все блоки по-прежнему будут декларироваться в модуле i-bem__dom?

dfilatov commented 10 years ago

@tadatuta без внедрения асинхронной инициализации bem-блоков это, по-моему, невозможно. Но, что касается конкретно твоего примера с тяжелыми модулями, которые на данной странице не используются -- их всегда можно не в deps'ы записывать, а реквайрить только в нужные моменты:

modules.define({ block : 'map-viewer' }, ['jquery', ...], function() {

provide({
    onSetMod : {
        'js' : {
            'inited' : function() {
                modules.require(['ymaps'], function() {
                    // do map init  
                });
            }
        }
    }
});

});

А еще, common-бандлы -- это зло ;) Разбивай все на bem-бандлы, загружай в нужные моменты и не будет ничего лишнего: ни загрузки неиспользуемого кода, ни его инициализации.

dfilatov commented 10 years ago

@arikon Нет, все bem-блоки -- самостоятельные модули в модульной системе. Модули для модификаторов додекларируют модуль основного блока.

dfilatov commented 10 years ago

See #429 for new details