Как мне обернуть предварительно скомпилированный шаблон hogan.js в модуль AMD?

Я пытаюсь включить предварительную компиляцию шаблонов Mustache в процесс сборки. Я использую AMD для организации кода, поэтому я хотел бы обернуть мои скомпилированные функции в модули.

Я пытаюсь сделать следующее:

var fs = require('fs');

fs.readFile('template.html', 'utf-8', function(err, data){

    function wrap(fnString){
        var pre = 'define(function(){return ';
        var post = '});';
        return pre + fnString + post;
    }

    var hogan = require('hogan.js');
    var compiledFn = hogan.compile(data, {asString: true});
    fs.writeFile('template.js', wrap(compiledFn), function(){console.log('written template module')});

});

Когда я пытаюсь использовать экспортированную функцию в моем приложении, я получаю сообщение об ошибке:

Uncaught TypeError: Object [object global] has no method 'b' 

Я делаю что-то не так при компиляции шаблона? Я делаю что-то не так при переносе функции? Должна ли функция жить в глобальном масштабе?

1 ответ

Решение

Таким образом, проблема в том, что я неправильно понял, как прекомпиляция шаблона работает с hogan: Он не выводит "версию функции" вашего шаблона Janilla, а представляет собой предварительно обработанную строку, которую вам все равно нужно передать Hogan.template(str),

Поскольку урезанная версия hogan только для шаблонов составляет всего 2,5 КБ, я просто включил ее в свой модуль AMD, и все заработало так же хорошо, как:

var fs = require('fs');
var Hogan = require('hogan.js');

var output = 'define(function(){\n';
output += 'var Templates = {};\n';
output += fs.readFileSync('template.min.js', 'utf-8') + '\n';

fs.readdir(process.cwd(), function(err, data){
        if (err) console.log(err);
        data.forEach(function(el){
                var s = el.split('.');
                if (s[s.length - 1] === 'html'){
                        var precompiled = Hogan.compile(fs.readFileSync(process.cwd() +  + el, 'utf-8'), {asString: true});
                        output += 'Templates[\'' + el.split('.')[0] + '\'] = new Hogan.Template(' + precompiled  + ');\n';
                        console.log('Compiled template:', el);
                }
        });

        output += 'return Templates;});';

        fs.writeFile(process.cwd() + '/templates.js', output, function(){
                console.log('Template build succeeded!');
        });

});
Другие вопросы по тегам