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