bem-site / bem-forum-content-ru

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

Сборка bundle с BEMHTML #1143

Open o5e2e2 opened 8 years ago

o5e2e2 commented 8 years ago

BEMHTML.apply() всегда возвращает пустую строку. Что-то тут не так.

var BEMHTML;

(function(global) {
    function buildBemXjst(__bem_xjst_libs__) {
        var exports = {};

        exports.apply = function () { return ""; };

        return exports;
    };

    var defineAsGlobal = true;

    // Provide with CommonJS
    if (typeof module === 'object' && typeof module.exports === 'object') {
        exports['BEMHTML'] = buildBemXjst({

}
);
        defineAsGlobal = false;
    }

    // Provide to YModules
    if (typeof modules === 'object') {
        modules.define(
            'BEMHTML',
            [],
            function(
                provide

                ) {
                    provide(buildBemXjst({

}
));
                }
            );

        defineAsGlobal = false;
    }

    // Provide to global scope
    if (defineAsGlobal) {
        BEMHTML = buildBemXjst({

}
);
        global['BEMHTML'] = BEMHTML;
    }
})(typeof window !== "undefined" ? window : global || this);
tadatuta commented 8 years ago

ответ вот тут https://github.com/enb/enb-bemxjst/blob/master/api.ru.md#forcebasetemplates

o5e2e2 commented 8 years ago

Спасибо, про настройку сборки стало ясно.

Но теперь появился вопрос, что такое пользовательские шаблоны, которые форсируют включение BEMHTML в сборку JS? Видимо, это самый рекомендуемый способ использования шаблонизатора?

tadatuta commented 8 years ago

Пользовательские шаблоны — это любые шаблоны, которые по зависимостям попадут в клиентский JS:

// some-block.deps.js

[{
    shouldDeps: ['any-block'] // зависимости вида технология к технологии (css попадет в css, js — в js)
}, {
    tech: 'js', // зависимости для технологии js
    shouldDeps: [{
        { block: 'any-block', tech: 'bemhtml' } // технология bemhtml блока any-block попадет в технологию js результирующего бандла, т.е. на клиент приедет шаблон any-block
    }]
}]
o5e2e2 commented 8 years ago

Как правильно прописать зависимость блока от BEMHTML? Добавление "forceBaseTemplates: true" в нужное место .enb/make.js и shouldDeps: ['BEMHTML'] оказалось недостаточно.

tadatuta commented 8 years ago

я привел пример правильного deps.js в предыдущем комменте: нужно писать зависимость от нужных блоков по технологиям (клиентский js зависит от bemhtml).

Но если forceBaseTemplates действительно оказался в нужном месте, этого уже должно быть достаточно, чтобы BEMHTML.apply() выводил что-то осмысленное, а не пустую строку.

o5e2e2 commented 8 years ago

Взял чистый bem/project-stub v1.6.0, добавил блок и прописал его в index.bemjson.js

modules.define('test-bemhtml', ['BEMHTML', 'i-bem__dom'], function(provide, BEMHTML, BEMDOM) { provide(BEMDOM.decl(this.name, {

    onSetMod: {
        js: {
            inited: function () {
                var bemjson = { tag: 'h1', content: 'Hello, World!' };
                var html = BEMHTML.apply(bemjson);
                console.log('"' + html + '"');
            }
        }
    }

}))});

.enb/make.js:59

            [techs.bemhtml, { sourceSuffixes: ['bemhtml', 'bemhtml.js'], forceBaseTemplates: true }],

Пишет в консоли две кавычки. Чего ему не хватает?

tadatuta commented 8 years ago

Так здесь же forceBaseTemplates и так был, а добавить нужно вот здесь: https://github.com/bem/project-stub/blob/master/.enb/make.js#L82-L86

o5e2e2 commented 8 years ago

Спасибо. В v1.6.0 не было, но добавил, где вы сказали, и заработало.