【问题标题】:How do I escape EJS template code in node.js to be evaluated on the client side?如何在 node.js 中转义 EJS 模板代码以在客户端进行评估?
【发布时间】:2020-01-24 14:45:12
【问题描述】:

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

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

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

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

你会如何处理这个问题?

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

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

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

【问题讨论】:

  • 模板中的模板听起来像是做错了。

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


【解决方案1】:

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

在节点上你可以传入选项

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

在我的例子中,我使用

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          “我如何才能只为有限项转义 EJS 模板代码分隔符?”

          tl;博士:

          使用&lt;%# %&gt;打破原来的解析代码(例如&lt;&lt;%# %&gt;%= done ? 'done' : '' %&lt;%# %&gt;&gt;会做下面未解析的代码&lt;%= done ? 'done' : '' %&gt;

          详细解释

          想象一个案例,我决定使用 { delimiter: '?' } 选项将 % 更改为 ?(这里可能就是这种情况,因为我们不想使用相同的 Backbone.js)。

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

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

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

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

          结论

          为了避免 EJS 解析准时,您可以通过使用 &lt;%# %&gt; 作为分隔符标记断路器来欺骗解析器以生成您需要的输出。

          当然,可能在你的情况下,你可以只使用标记的答案,因为你会在很多情况下使用 EJS 标签。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2017-05-15
            • 1970-01-01
            • 2017-02-22
            • 1970-01-01
            • 2011-11-03
            • 1970-01-01
            相关资源
            最近更新 更多