Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将预编译的hogan.js模板包装到AMD模块中?_Javascript_Node.js_Requirejs_Mustache_Hogan.js - Fatal编程技术网

Javascript 如何将预编译的hogan.js模板包装到AMD模块中?

Javascript 如何将预编译的hogan.js模板包装到AMD模块中?,javascript,node.js,requirejs,mustache,hogan.js,Javascript,Node.js,Requirejs,Mustache,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 =

我正在尝试将我的胡须模板的预编译合并到我的构建过程中。我使用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' 

编译模板时我是否做错了什么?包装函数时我是否做错了什么?函数是否需要存在于全局范围内?

因此,问题在于我误解了模板预编译与
hogan
的工作方式:它不会输出模板的普通JS“函数版本”,而是一个预呈现的字符串,您仍然需要将该字符串传递给
hogan.template(str)

由于hogan的精简模板版本仅为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!');
        });

});