如何在node.js中转义EJS模板代码以在客户端进行评估?

时间:2012-01-26 16:35:16

标签: node.js backbone.js template-engine underscore.js ejs

我在服务器端使用node.js / ejs,在客户端使用backbone.js。 服务器端和客户端都使用相同的模板样式。 所以问题是,如果我将模板代码用于模板中的客户端,它仍然可以在服务器端解析。

如果发现这样的事情有效:

<%- "<%= done ? 'done' : '' %\>" %>

然而,恕我直言,这会使代码的使用方式变得无用。

你会怎么做?

有没有办法在EJS模板中定义代码块,这些代码块不像其他模板语言中使用的{literal} -tag那样被解析?

更新:目前我使用backbone的_.templateSettings在客户端使用不同的分隔符。

更新:以下是JSP上下文中的类似解决方案:Underscore.js Templates Within JSP

5 个答案:

答案 0 :(得分:3)

我处理这个问题的方法是覆盖节点上的开始和结束标记,以便ejs的2个实例可以查找不同的标记。

在节点上,您可以传入选项

{open:'<%',close:'%>'}

在我的情况下,我使用&lt;%和&lt; @来表示我的两个版本。然后在节点ejs模板中,我有类似这样的东西(其中名称来自骨干,而everyauth显然来自节点):

<% if(everyauth.loggedIn) %><h1><@= name @></h1><% } %>

答案 1 :(得分:0)

好吧,我目前采用的方法是将require.js与文本插件一起使用;这允许我在开发期间使用AJAX包含模板,并在部署期间将它们全部编译成优化/缩小的单个文件包。

当然,如果你不使用require.js来对你的其他JS代码进行依赖管理,这几乎不能正常工作,但是现在我不能忍受没有require.js的javascript dev了无论如何我已经习惯了。

或者,您可以使用其他类似技术来解决同样的问题。

答案 2 :(得分:0)

我在客户端和服务器端都使用backbone.layout.manager,因为我希望我的模板完全相同。

我解决模板分隔符问题的方法是在服务器端渲染页面,然后注入原始主干模板。

答案 3 :(得分:0)

使用新的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'

答案 4 :(得分:0)

我认为该问题可以理解为以下内容,因为这是Google在第一个链接中提供给我的线程:

“如何仅对有限的项目转义EJS模板代码分隔符标记?”

tl; dr:

使用<%# %>中断原始解析代码(例如<<%# %>%= done ? 'done' : '' %<%# %>>将执行以下未解析的代码<%= done ? 'done' : '' %>

详细解释

想象一下我决定使用%选项通过?来更改{ delimiter: '?' }的情况(在这里可能就是这种情况,因为我们不想使用Backbone.js。)

很好,可以解决您的问题。现在想象一下,由于某种原因,您将使用模板系统生成XML。该XML将以<?xml version="1.0" encoding="UTF-8"?>开头。

您将再次面临相同的问题。做什么?您将再次更改定界符吗?之后,您将再次改变吗?否,为了准时转义,我们应该只是能够说“不将文档的这一部分解析为EJS”。

所以一个技巧是避免EJS理解它是一个EJS分隔符解析器。因此(在我们目前的情况下)避免解析<?(或在原始情况下解析<%)。

因此,只需添加<?# ?>来中断解析,您将不会添加任何内容(#用于EJS注释),并且可以避免解析器理解<<?# ?>?xml version="1.0" encoding="UTF-8"?<?# ?>>。输出将为<?xml version="1.0" encoding="UTF-8"?>

结论

为了避免EJS解析,在准时的必要性下,您可以使用<%# %>作为分隔符来欺骗解析器以产生所需的输出。

可以肯定,在您的情况下,您可以只使用标记的答案,因为在很多情况下都将使用EJS标签。