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

Closed
dfilatov opened this Issue Feb 14, 2014 · 10 comments

Comments

Projects
None yet
4 participants
@dfilatov
Member

dfilatov commented Feb 14, 2014

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 dfilatov added this to the 2.0 milestone Feb 14, 2014

@dfilatov dfilatov added the v2 label Feb 14, 2014

@dfilatov

This comment has been minimized.

Show comment
Hide comment
Member

dfilatov commented Feb 14, 2014

@tadatuta

This comment has been minimized.

Show comment
Hide comment
@tadatuta

tadatuta Feb 14, 2014

Member

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

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

tadatuta commented Feb 14, 2014

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

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

This comment has been minimized.

Show comment
Hide comment
@arikon

arikon Feb 14, 2014

Member

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

Member

arikon commented Feb 14, 2014

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

@dfilatov

This comment has been minimized.

Show comment
Hide comment
@dfilatov

dfilatov Feb 14, 2014

Member

@tadatuta

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

dfilatov commented Feb 14, 2014

@tadatuta

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

This comment has been minimized.

Show comment
Hide comment
@dfilatov

dfilatov Feb 14, 2014

Member

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

Member

dfilatov commented Feb 14, 2014

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

@tadatuta

This comment has been minimized.

Show comment
Hide comment
@tadatuta

tadatuta Feb 14, 2014

Member

@dfilatov
2. у меня есть common-бандл, который включает депенды для разных страниц. не жалко, если при загрузке page1 вытянется common.js с лишним кодом, но не хочется, чтобы этот код инициализировался, если в доме page1 не присутствует часть блоков.

Member

tadatuta commented Feb 14, 2014

@dfilatov
2. у меня есть common-бандл, который включает депенды для разных страниц. не жалко, если при загрузке page1 вытянется common.js с лишним кодом, но не хочется, чтобы этот код инициализировался, если в доме page1 не присутствует часть блоков.

@arikon

This comment has been minimized.

Show comment
Hide comment
@arikon

arikon Feb 14, 2014

Member

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

Member

arikon commented Feb 14, 2014

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

@dfilatov

This comment has been minimized.

Show comment
Hide comment
@dfilatov

dfilatov Feb 15, 2014

Member

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

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

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

});

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

Member

dfilatov commented Feb 15, 2014

@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

This comment has been minimized.

Show comment
Hide comment
@dfilatov

dfilatov Feb 15, 2014

Member

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

Member

dfilatov commented Feb 15, 2014

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

@dfilatov dfilatov referenced this issue Feb 19, 2014

Closed

i-bem-js.ru.md: Update for v2 #395

2 of 2 tasks complete

@dfilatov dfilatov added the v2 label Feb 19, 2014

veged added a commit that referenced this issue Feb 20, 2014

Merge pull request #383 from bem#382@v2
i-bem__dom: add ability to define BEMDOM-blocks as ym modules (close #328)

@veged veged closed this Feb 20, 2014

@dfilatov

This comment has been minimized.

Show comment
Hide comment
@dfilatov

dfilatov Mar 4, 2014

Member

See #429 for new details

Member

dfilatov commented Mar 4, 2014

See #429 for new details

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment