2013-12-04 5 views
2

Я пытаюсь включить precompiling мои шаблоны Mustache в мой процесс сборки. Я использую AMD для организации кода, поэтому я хотел бы объединить мои скомпилированные функции в модули.Как перенести предварительно скомпилированный шаблон hogan.js в модуль 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' 

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

ответ

0

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

Поскольку раздели шаблон только версия Хоган только 2.5kb я просто включил это в мой модуль 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!'); 
     }); 

});