2012-04-25 70 views
0

考慮例如以下情形:我們給予一定的入口點URL(類似https://our.server/customer-name/entry-point.js)給我們的客戶,讓他們能夠包括我們的產品在其頁面,只需在他們想要把我們的地方寫用於node.js的Javascript發射模板引擎?

<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

看來,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) + ")"); 
}