我在服务器端使用node.js / ejs,在客户端使用backbone.js。 服务器端和客户端都使用相同的模板样式。 所以问题是,如果我将模板代码用于模板中的客户端,它仍然可以在服务器端解析。
如果发现这样的事情有效:
<%- "<%= done ? 'done' : '' %\>" %>
然而,恕我直言,这会使代码的使用方式变得无用。
你会怎么做?
有没有办法在EJS模板中定义代码块,这些代码块不像其他模板语言中使用的{literal} -tag那样被解析?
更新:目前我使用backbone的_.templateSettings在客户端使用不同的分隔符。
更新:以下是JSP上下文中的类似解决方案:Underscore.js Templates Within JSP
答案 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标签。