我正在尝试创建一个函数,该函数采用模板名称并能够将呈现的模板作为字符串返回。我正在使用linkedin的灰尘版本。我正在将模板(使用grunt-dustjs任务)预编译成一个文件,如下所示:
(function(){dust.register("collections-nav",body_0);function body_0(chk,ctx){return chk.write("\t<div id=\"collection-loop\"><div class=\"section-title lines desktop-12\"><h2>Shop by Collection</h2></div>").section(ctx.getPath(false, ["bigMutha","TopNavigation"]),ctx,{"block":body_1},{}).write("</div>");}function body_1(chk,ctx){return chk.write("<div class=\"collection-index desktop-3 tablet-2 mobile-3 first\" data-alpha=\"").reference(ctx.get(["Title"], false),ctx,"h").write("\"> <div class=\"collection-image\"><a href=\"").reference(ctx.get(["Url"], false),ctx,"h").write("\" title=\"").reference(ctx.get(["Title"], false),ctx,"h").write("\"><img src=\"//cdn.shopify.com/s/files/1/0352/5133/collections/d_cb_20140312_m_handpicked_grande.jpg?v=1394885208\" alt=\"").reference(ctx.get(["Title"], false),ctx,"h").write("\" /></a> </div><div class=\"collection-info\"><a href=\"/collections/mens-designer-clothing\" title=\"Browse our ").reference(ctx.get(["Title"], false),ctx,"h").write(" collection\"><h3>").reference(ctx.get(["Title"], false),ctx,"h").write("</h3><p>16 items</p></a></div></div>");}return body_0;})()
(function(){dust.register("index",body_0);var blocks={"body":body_1};function body_0(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.partial("layouts/mainfull",ctx,{});}function body_1(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.write("<ul>").section(ctx.get(["TopNavigation"], false),ctx,{"block":body_2},{}).write("</ul>").section(ctx.get(["Products"], false),ctx,{"block":body_3},{});}function body_2(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.write("<li>").reference(ctx.get(["Title"], false),ctx,"h").write("</li>");}function body_3(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.reference(ctx.get(["Name"], false),ctx,"h");}return body_0;})()
(function(){dust.register("layouts.mainfull",body_0);function body_0(chk,ctx){return chk.write("<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Dust.js Test Template</title></head><body>").block(ctx.getBlock("body"),ctx,{},{}).write("</body></html>");}return body_0;})()
我认为我的最终问题是,我如何从节点加载/使用这些模板(它们在它们的单个文件中)?还是我错误地编译它们?我应该将这些 IIFE 包装在 module.exports 中吗?我这样做了,但什么也没做。这就是我在 .js 文件头部需要模板文件的方式:
var dust = require('dustjs-linkedin');
require('dustjs-helpers');
require('templates/all.js');
var JSON = require('json3');
当我通过“var templates = require(...);”按原样加载模板文件时 直接调用或 require() 它我首先得到一个“未定义灰尘”错误,然后当我添加“vardust = require('dustjs-linkedin');”时 到模板文件我收到一个错误,指出对象没有写入方法。
Object function (){dust.register("index",body_0);var blocks={"body":body_1};function body_0(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.partial("layouts/mainfull",ctx,{});}function body_1(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.write("<ul>").section(ctx.get(["TopNavigation"], false),ctx,{"block":body_2},{}).write("</ul>").section(ctx.get(["Products"], false),ctx,{"block":body_3},{});}function body_2(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.write("<li>").reference(ctx.get(["Title"], false),ctx,"h").write("</li>");}function body_3(chk,ctx){ctx=ctx.shiftBlocks(blocks);return chk.reference(ctx.get(["Name"], false),ctx,"h");}return body_0;} has no method 'write'
问题是,为什么它认为没有“写”方法?试图加载这个我做错了什么?理论上,每个已编译的模板都应该在加载文件并执行 IIFE 时将自己注册到灰尘缓存中,但它一直抛出“没有方法'write'”错误。即使我将这些模板直接复制/粘贴到我试图加载它们的 .js 文件中,它也会这样做。我应该用“module.exports”代码包装编译的模板文件吗?也许在函数内部?我不知道为什么这不起作用,甚至不知道如何正确编译/加载模板。任何帮助表示赞赏!谢谢!
编辑 原始模板的要点
编辑
这是下面对公认答案的一个很好的解释。然而,我仍然有一个问题,但它似乎是在没有正确理解调用 .render() 时灰尘的作用以及我必须在 Edge.js/.NET 中执行此操作的交集。
注意:编译后的模板,带有分号 ;),位于顶部需要灰尘库的文件中,否则只是前面提到的 IIFE。在我的 Mac 上,在 Node.js 中,以下工作:
var dust = require('dustjs-linkedin');
dust.helpers = require('dustjs-helpers');
require('./templates/all.js');
var myFunction = function(data) {
console.log(dust.cache);
}
module.exports = function(data) {
return myFunction(data);
}
我可以在缓存中看到模板。但是,如果我随后将“myFunction”更改为此它仍然会看到缓存但返回未定义:
var dust = require('dustjs-linkedin');
dust.helpers = require('dustjs-helpers');
require('./templates/all.js');
var myFunction = function(data) {
console.log(dust.cache);
return dust.render('index', data, function(err, out) {
return out;
}
}
module.exports = function(data) {
return myFunction(data);
}
这是一个问题。当我在 .NET 上下文中使用 Edge.js 时引入的另一个问题是,相同的设置不会像在我的 Mac 上的直接 node.js 环境中那样将模板加载到缓存中。我可以很好地加载文件,我什至可以将它作为字符串输出,但是当我查看dust.cache(由于console.log 无法在.NET 上下文中工作而导致的PITA)时,它返回为空。正是这个问题导致我尝试将编译后的模板转储到一个数组中,然后遍历数组,在每个数组项上调用dust.loadSource,但这也不想工作。
我正在清理项目以在今天某个时候发布到 GitHub。