bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Сборка i-bem.js #177

Open kuflash opened 9 years ago

kuflash commented 9 years ago

Приветствую, друзья! Хочу собрать i-bem.js из bem-core, чтобы использовать его на проекте без полного БЭМ-стека. И я собрал его, но что то не фурычит он. Видимо я что-то не правильно делаю. Подтолкните в нужном направлении. Вот мой порядок действий:

  1. Склонировал bem-core
  2. Выполнил npm i
  3. В директорииcommon.bundles\index создал файл index.bemjson.js с таким содержимым:
({
    block: 'i-bem',
    elem: 'dom'
});
  1. Выполнил команду `bem make
  2. Получил собранный файл i-bem.js
  3. Подключаю его на страницу. Вот исходный код этой страницы:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src='i-bem.js' type="text/javascript"></script>
    <script src='index.js' type="text/javascript"></script>
</head>
<body>
    <div class="b-calendar i-bem" data-bem="{'b-calendar:{}'}"></div>
</body>
</html>
  1. В index.js я написал такой код:
modules.define('i-bem__dom', function(provide, DOM) {
    DOM.decl('b-calendar', {
        onSetMod: {
            'js' : {
                'inited' : function() {
                    console.log('inited');
                }
            }
        }
    });
    provide(DOM);
});

В итоге после открытия страницы в консоль ничего не выводится... Что не так в моих действиях?

Guria commented 9 years ago

мне кажется ваш i-bem не в курсе, что надо инициировать блоки. см. https://github.com/bem/bem-core/blob/v2/common.blocks/page/page.deps.js#L4

kuflash commented 9 years ago

@Guria, сделал так:

({
    block: 'i-bem',
    elem: 'dom',
    mods : { init : 'auto' }
});

Скомпилировал и все равно не работает. Вот какой файл у меня собирается: https://www.dropbox.com/s/y32gbe4xce33jci/i-bem.js?dl=0

Guria commented 9 years ago

@kuflash Хм. не хватает только содержимого i-bem__dom_init_auto.js Добавь в index.js:

/**
 * Auto initialization on DOM ready
 */

modules.require(
    ['i-bem__dom_init', 'jquery', 'next-tick'],
    function(init, $, nextTick) {

$(function() {
    nextTick(init);
});

});
zverbeta commented 9 years ago

Для блока же нужно написать js:true

Guria commented 9 years ago

@zverbeta Если для блока был инициализирован клиентский JS, BEMHTML добавляет в список HTML-классов i-bem, а также атрибут со значением параметров клиентского JS (по умолчанию — data-bem, см. мода jsAttr) см в коде <div class="b-calendar i-bem" data-bem="{'b-calendar:{}'}"></div>

kuflash commented 9 years ago

@Guria, добавил. Теперь на странице вылетает ошибка: Uncaught SyntaxError: Unexpected token ' Ошибка пропадает, если закоментировать строку: nextTick(init); Вот мой сходный код index.js:

modules.require(
    ['i-bem__dom_init', 'jquery', 'next-tick'],
    function(init, $, nextTick) {

$(function() {
    nextTick(init);
});

});

modules.define('i-bem__dom', function(provide, DOM) {

    DOM.decl('b-calendar', {
        onSetMod: {
            'js' : {
                'inited' : function() {
                    console.log('inited');
                }
            }
        }
    });

    provide(DOM);

});
tadatuta commented 9 years ago

@kuflash Ошибка кроется в HTML-разметке — значение data-bem должно быть валидным JSON-ом, т.е. необходимо использовать двойные кавычки для ключей: { "b-calendar": {} }.

Еще сразу порекомендую использовать новый способ декларации блоков:

modules.define('b-calendar', ['i-bem__dom'], function(provide, BEMDOM) {
    provide(BEMDOM.decl(this.name, {
        onSetMod: {
            js: {
                inited: function() {
                    console.log('inited');
                }
            }
        }
    });
});

PS: Странно, что приходится вставлять i-bem__dom_init_auto руками, он должен был собраться по декларации сам. Возможно, не пересобралось просто?

Guria commented 9 years ago

@tadatuta я пробовал воспроизвести, у меня даже i-bem__dom_init не собрался

kuflash commented 9 years ago

@tadatuta, заработало. Спасибо большое. По поводу i-bem__dom_init_auto, не знаю, пересобирал несколько раз, удаляя все созданные файлы. этот кусок не вставляется почему то.

Guria commented 9 years ago

@tadatuta у меня собралось наконец-то с i-bem__dom_init_auto дропал cache enb и перезапускал его, но собралось только когда я другой бандл в браузере загрузил

qfox commented 9 years ago

@tadatuta А не думали пытаться распарсить, если там { в начале?

tadatuta commented 9 years ago

@zxqfox

А не думали пытаться распарсить, если там { в начале?

Раскрой мысль, пожалуйста.

apsavin commented 9 years ago

@tadatuta Леша, видимо, имел в виду "не пробовали пытаться парсить невалидный json из data-атрибутов"? Думаю, не ошибусь, если скажу, что не пробовали и не собираетесь.

tadatuta commented 9 years ago

У меня про это есть вот такие ссылки: https://github.com/bem/bem-core/issues/250 https://github.com/bem/bem-core/pull/742

qfox commented 9 years ago

@apsavin :+1: вот так угадываешь! ;-)

@tadatuta Ну так это как раз про attr='{"valid":"json","inside":"attr"}'. А я про attr="{invalid:'json'}" — может быть примочку к i-bem для чтения data-bem в теории можно сделать.

upd Есть такая теория, как нужно асфальтировать тропинки для людей. Где протоптано — там и асфальтировать. У людей есть привычки, они плохие, они им мешают, но они еще не готовы от них избавляться — а методология их насильно в правильное русло с головой. Вот и боятся многие, что придется спортом заниматься и в 6 утра на завод. По грязюке, как привыкли, после ночного дождя.

veged commented 9 years ago

@zxqfox такая примочка либо внутри будет eval делать (что XSS-ами всякими пахнет), либо будет монстроидальной и тормозной (если кастомный парсер писать)

upd не понятно, почему по грязюке, если если есть асфальт — а спорт это хорошо!

qfox commented 9 years ago

@veged Ну жили же с onclick="return " ? el=$('elem'); el.attr('onclick', 'return' + el.attr('data-bem')); el[0].onclick voila! ;-) согласен, что без этого жить можно и главное — спокойнее спать по ночам будет.

А по грязюке — короче. Не зря ж сказки про короткую тропинку через темный лес рассказывают ;-) Природа у людей такая ;-)