繁体   English   中英

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

[英]How do I escape EJS template code in node.js to be evaluated on the client side?

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

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

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

但是,恕我直言,这使代码变得丑陋,这使得使用模板的整个意义变得毫无用处。

你会如何处理这个问题?

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

更新:现在我使用主干的 _.templateSettings 在客户端使用不同的分隔符。

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

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

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

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

就我而言,我使用 <% 和 <@ 作为我的两个版本。 然后在节点 ejs 模板中,我有这样的东西(其中名称来自主干,而everyauth 显然来自节点):

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

我在客户端和服务器端都使用了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'

我认为这个问题可以理解如下,因为这是谷歌在第一个链接上为我提供的这个线程:

“我如何才能仅针对有限的项目转义 EJS 模板代码分隔符标签?”

tl;博士:

使用<%# %>来打破原来的解析代码(例如<<%# %>%= done ? 'done' : '' %<%# %>>将完成以下未解析的代码<%= done ? 'done' : '' %> )

长解释

想象一下我决定改变% by 的情况? 使用{ delimiter: '?' } { delimiter: '?' }选项(这可能是这里的情况,因为我们要不要使用相同的具有Backbone.js的)。

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

您将再次面临同样的问题。 做什么? 你会再次更改分隔符吗? 而在那之后,你会再次改变吗? 等等。不,为了准时转义,我们应该只是能够说“不要将文档的这部分解析为EJS”。

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

因此,通过简单地添加<?# ?>来中断解析,您将不添加任何内容( #项用于 EJS 注释)并且您将避免解析器理解<<?# ?>?xml version="1.0" encoding="UTF-8"?<?# ?>> 输出将是<?xml version="1.0" encoding="UTF-8"?>

结论

准时必要性,以避免EJS解析,你可以欺骗解析器使用产生你所需要的输出<%# %>作为分隔符标签断路器。

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

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

当然,如果您不使用 require.js 来管理其余 JS 代码的依赖关系,这几乎不能正常工作,但是我现在无法忍受没有 require.js 的情况下进行 javascript 开发,因为我'反正我习惯了。

或者,可能还有其他类似的技术可用于解决相同的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM