node.js的Javascript发射模板引擎?

时间:2012-04-25 09:38:17

标签: node.js template-engine viewengine

考虑例如以下场景:我们向客户提供一些入口点URL(类似https://our.server/customer-name/entry-point.js),以便他们能够通过简单地编写

将我们的产品包含在他们的页面上
<script language="Javascript" src="https://our.server/customer-name/entry-point.js"/>

在他们想要放置我们产品的地方(是的,我知道,这是一个丑陋的解决方案,但这不是我可以改变的。)

所以我们在这里遇到了问题:我们的entry-point.js应该知道从哪里(https://our.server/customer-name/)加载其他文件。因此,似乎答案是动态生成entry-point.js,以便它包含例如。

var ourcompany_ourproduct_basepath = "https://our.server/customer-name/";

显而易见的方法是手动构建entry-point.js,如下所示:

res.write("var ourprefix_basepath = \"" + basepath.escape() + "\";");
res.write("function ourprefix_entryPoint() { /*do something*/ }");
res.write("ourprefix_entryPoint();");

正如您所看到的,它只是坏了。

是否有任何模板引擎可以允许,例如对于以下内容:

var basepath = "https://our.server/customer-name/";
var export = {
    ourprefix_basepath: basepath.escape(),
    ourprefix_entrypoint: function() { /* do something */ }
};
templateEngine.render(export);

view.vw:
    ourprefix_basepath = rewrite("{#basepath}");
    function ourprefix_entrypoint() { /* do something */
    ourprefix_entrypoint();

App.js:
    templateEngine.render("view.vw", { basepath: "https://our.server/customer-name/" });

或类似的东西(你已经有了这个想法),它会将以下内容写入响应流:

var ourprefix_basepath = "https://our.server/customer-name/";
function ourprefix_entrypoint() { /* do something */ };
ourprefix_entrypoint();

1 个答案:

答案 0 :(得分:0)

似乎Node.js支持反射,但我无法找到它是否在某处明确说明。

因此,通过利用JSON是JS的子集这一事实,可以使用以下更清晰的代码而不使用模板引擎:

var entrypoint = function(data) {
    /* do something with data.basepath and data.otherparam here... */
}

exports.processRequest = function(request, response) {
    var data = {
        basepath: computeBasepath(request),
        otherparam: "somevalue"
    };
    response.send("(" + entrypoint.toString() + ")(" + JSON.stringify(data) + ")");
}