0

例如,考虑以下场景:我们向客户提供一些入口点 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();

?

4

1 回答 1

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) + ")");
}
于 2012-04-25T11:43:34.863 回答