如何在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'