bem-site / bem-forum-content-ru

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

Cannot call method 'then' of undefined #32

Open voischev opened 10 years ago

voischev commented 10 years ago

Столкнулся с этой ошибкой когда решил положить блоки и бандлы в папку src/ на проекте и настроить сборку так.

/
    .bem/
    src/
       desktop.blocks
       desktop.bundles

в make.js соответственно указал

getBundlesLevels: function() {
        return [
            'src/desktop.bundles'
        ];
    }

Сборка происходит нормально, но в такой схеме сервер падает на этом then

BEMTREE.apply(json)
        .then(function(bemjson) {
            res.send(BEMHTML.apply(bemjson));
        });

А если положить эти же папки, блоков и бандлов, в корень то все отрабатывает как надо.

Подскажике как поправить и настроить предложенную выше схему.

Весь кусок про сервер и шаблонизацию

    var bemtreeTemplate = FS.readFileSync( './src/desktop.bundles/index/_index.bemtree.js'),
        bemtmlTemplate = FS.readFileSync( './src/desktop.bundles/index/_index.bemhtml.js');

    var context = VM.createContext({
        Vow: vow,
        console: console,
        borschik: {
            link: function(i) {
                return i;
            }
        }
    });

    VM.runInContext(bemtreeTemplate, context);
    BEMTREE = context.BEMTREE;

    VM.runInContext(bemtmlTemplate, context);
    BEMHTML = context.BEMHTML;

    BEMTREE.apply(json)
        .then(function(bemjson) {
            res.send(BEMHTML.apply(bemjson));
        });
tadatuta commented 10 years ago

нет возможности выложить код куда-нибудь?

alexbaumgertner commented 10 years ago

Можно попробовать как-нибудь вывести в консоль ошибку, BEMTREE.apply(json).fail(data) или reject(data).

voischev commented 10 years ago

@tadatuta http://github.com/voischev/thenProblem

tadatuta commented 10 years ago

Все дело в том, что функция getLevels, возвращающая пути до уровней, использует метод buildLevel, в котором проверяется текущий путь, чтобы определить платформу. И из-за того, что теперь к пути добавилось src, то не работает вот этот маппинг.

Чтобы исправить, можно либо на 49 строке сделать desktop -> src/desktop, либо стрипать src в методе buildLevel.

Ну и на всякий случай напомню, что в версии bem-xjst, которая используется в последней версии bem-core, есть баг, так что в bower.json нужно явно зафиксироваться на предыдущей версии, пока мы не выпустим bem-core с фиксом.

qfox commented 10 years ago

@voischev а есть ли смысл?

Может .bem тоже перетащить в src, и тогда если нужен make — bem.api.make({root: "./src"}...), если нужно подключить бандл — дописываешь ./src в начало.

voischev commented 10 years ago

@zxqfox ну в этом тоже не больше смысла

qfox commented 10 years ago

@voischev ну не знаю, на мой взгляд сборка проекта заканчивается, когда запускается express или что-то вроде него и начинается рендеринг страниц из шаблонов. Т.е. .bem уже не нужен, нужны только разные some.bundles/A/A.tech файлы, которые будут отдаваться somehow в браузер, и использоваться на бекенде. В т.ч. не только js. Поэтому, я не вижу смысла в таскании .bem на боевой.

voischev commented 10 years ago

@zxqfox что не нужно когда запускается экспресс думаю должен решать деплой скрипт. Тут я преследовал удобство разработки, не сильно уходя от предложенных решений

qfox commented 10 years ago

@voischev Это можно решить, например, чем-то типа bem.opts, в которых прописать -r ./src

Кстати, express-bem умеет рулить такое. Может быть чего-то другого не умеет, но это умеет.