backbone.js 如何对node.js中的EJS模板代码进行转义,以便在客户端进行计算?

o7jaxewo  于 2022-11-10  发布在  Node.js
关注(0)|答案(5)|浏览(149)

我在服务器端使用node.js/ejs,在客户端使用backbone.js。服务器端和客户端都使用相同的模板样式。所以问题是,如果我把为客户端准备的模板代码放在一个模板中,它仍然会在服务器端被解析。
如果发现这样的东西管用:

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

然而,恕我直言,这在某种程度上丑化了代码,使使用模板的全部意义毫无用处。
您将如何处理此问题?
有没有办法在EJB模板中定义代码块,这些代码块不会像其他模板语言中使用的{literal}标记那样被解析?

**更新:**现在我使用backbone的_.templateSettings在客户端使用不同的分隔符。
**更新:**下面是JSP上下文中的一个类似解决方案:Underscore.js Templates Within JSP

s3fp2yjn

s3fp2yjn1#

我处理这个问题的方法是覆盖node上的开始和结束标记,这样ejs的2个示例就可以查找不同的标记。
在节点上,您可以传入选项

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

在我的例子中,我使用〈%和〈@作为我的两个版本。然后在节点ejs模板中,我有这样的东西(其中name来自 Backbone 网,everyauth显然来自节点):

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

lbsnaicq2#

我假设这个问题可以读如下,因为它是这个线程谷歌提供我在第一个链接:

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

  • tl;dr:*

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

  • 详细解释 *

假设我决定使用{ delimiter: '?' }选项将%更改为?(这里可能是这种情况,因为我们不想使用相同的Has Backbone.js)。
很好,这就解决了你的问题。现在想象一下,稍后,由于某种原因,你使用模板系统生成一个XML。这个XML将以<?xml version="1.0" encoding="UTF-8"?>开头。
你将再次面临同样的问题。怎么办?你将再次更改分隔符?然后,你将再次更改?等等。不,对于准时转义,我们应该只是能够说“不将文档的这一部分解析为EJS”。
因此,一个技巧是避免EJS理解它是一个EJS定界符解析器。因此,避免它(在我们当前的情况下)解析<?(或在原始情况下的<%)。
因此,通过简单地添加<?# ?>来中断解析,您将不添加任何内容(#项是用于EJS注解的),并且您将避免解析器理解<<?# ?>?xml version="1.0" encoding="UTF-8"?<?# ?>>
结语
为了准时避免EJS解析,您可以使用<%# %>作为定界符标记断开器来欺骗解析器生成您需要的输出。
当然,可能在您的情况下,您可以只使用标记的答案,因为您将在许多情况下使用EJS标记。

olqngx59

olqngx593#

我目前处理这个问题的方法是使用require.js和文本插件;这允许我在开发时使用 AJAX 包含模板,并在部署时将它们全部编译到优化/缩小的单个文件包中。
当然,如果你不使用require.js来管理其余JS代码的依赖关系,这就不会很好地工作,但是我不能忍受在没有require.js的情况下进行javascript开发,因为我已经习惯了。
或者,您也可以使用其他类似的技术来解决相同的问题。

y53ybaqx

y53ybaqx4#

我在客户端和服务器端都使用backbone.layout.manager,因为我希望我的模板完全相同。
我解决模板分隔符问题的方法是在服务器端呈现页面,然后注入原始 Backbone.js 模板。

0md85ypi

0md85ypi5#

对于新的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'

相关问题