我正在尝试将我的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'
编译模板时我做错了吗?包装功能时我做错了吗?该功能是否需要在全球范围内生效?
答案 0 :(得分:0)
所以问题就是我误解了模板预编译与hogan
一起工作的方式:它不输出模板的vanilla JS“函数版本”但是预先渲染您仍需要传递给Hogan.template(str)
的字符串。
由于剥离模板只有hkan的版本只有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!');
});
});