如何在node.js中转义EJS模板代码以在客户端进行评估?
我使用服务器端的node.js / ejs和客户端的backbone.js。 服务器端和客户端都使用相同的模板样式。 所以问题是,如果我把模板代码放在模板里面,那么它仍然会在服务器端被parsing。
如果发现这样的工作:
<%- "<%= done ? 'done' : '' %\>" %>
但是,恕我直言,这使得整个代码的使用方法使整个使用模板无用。
你将如何处理这个?
有没有一种方法来定义EJS模板内的代码块,不会像其他模板语言中使用的{literal} -tag那样被parsing?
更新:现在我使用骨干的_.templateSettings在客户端使用不同的分隔符。
更新:在JSP上下文中有一个类似的解决scheme:JSP 内的Underscore.js模板
我所处理的方式是覆盖节点上的开始和结束标记,以便ejs的2个实例可以为不同的标记查找。
在节点上,你可以传入选项
{open:'<%',close:'%>'}
在我的情况下,我使用<%和<@为我的两个版本。 然后在节点ejs模板中,我有这样的东西(其中名字来自backbone和everyauth显然来自节点):
<% if(everyauth.loggedIn) %><h1><@= name @></h1><% } %>
那么,我目前的做法是在文本插件中使用require.js ; 这允许我在开发期间使用AJAX包含模板,并在部署期间将它们全部编译为优化/缩小的单个文件包。
当然,如果你不使用require.js来处理你的其他JS代码的依赖pipe理,那么这个工作几乎没有任何效果,但是我不能忍受没有require.js的javascript dev,米无论如何使用它。
或者,也可能有其他类似的技术可以用来解决同样的问题。
我在客户端和服务器端都使用backbone.layout.manager
,因为我希望我的模板完全一样。
我解决模板定界符问题的方法是在服务器端渲染页面,然后注入原始主干模板。
使用新的ejs,您可以在客户端添加自定义分隔符:
https://github.com/mde/ejs#custom-delimiters
例如:
自定义分隔符可以基于每个模板应用,也可以全局应用:
var ejs = require('ejs'), users = ['geddy', 'neil', 'alex']; // Just one template ejs.render('<?= users.join(" | "); ?>', {users: users}, {delimiter: '?'}); // => 'geddy | neil | alex' // Or globally ejs.delimiter = '$'; ejs.render('<$= users.join(" | "); $>', {users: users}); // => 'geddy | neil | alex'