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

发布于 2024-12-29 07:07:40 字数 580 浏览 0 评论 0原文

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

如果发现这样的东西有效:

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

但是,恕我直言,这会以某种方式丑化代码,从而使使用模板的全部意义变得毫无用处。

你会如何处理这个问题?

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

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

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

I use node.js/ejs on the server side and backbone.js on the client side.
Both server side and client side use the same templating style.
So the problem is, if I put template code meant for the client inside a template it still get's parsed on the server side.

If found out that something like this works:

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

However, IMHO this uglifies the code in a way which makes the whole point of using templates useless.

How would you approach this?

Is there a way to define blocks of code inside EJS-templates which do not get parsed like a {literal}-tag used in other templating languages?

Update: For now I use backbone's _.templateSettings to use different delimiters on the client side.

Update: Here's a similar solution in a JSP context: Underscore.js Templates Within JSP

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

橘味果▽酱 2025-01-05 07:07:40

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

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

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

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

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

The way I have dealt with this is to override the opening and closing tags on node so that the 2 instances of ejs are lookgin for different tags.

On node you can pass in options

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

In my case I use <% and <@ for my two versions. Then in node ejs template I have something like this (where name is from backbone and everyauth obviously from node):

<% if(everyauth.loggedIn) %><h1><@= name @></h1><% } %>
堇年纸鸢 2025-01-05 07:07:40

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

“How I can escape EJS template code delimiter tag only for limited items?”

tl;dr :

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

详细解释

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

太好了,解决了你的问题。现在想象一下,由于某种原因,您使用模板系统生成 XML。此 XML 将以 开头。

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

因此,一个技巧是避免 EJS 理解它是一个 EJS 分隔符解析器。因此,请避免(在我们当前的情况下)解析 (或在原始情况下使用 <%)。

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

结论

准时需要避免 EJS 解析时,您可以通过使用 <%# %> 作为分隔符标记破坏器来欺骗解析器生成您需要的输出。

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

I assume the question could be read as following because it was this thread Google provide me at first link:

“How I can escape EJS template code delimiter tag only for limited items?”

tl;dr:

Use <%# %> to break the original parsing code (e.g. <<%# %>%= done ? 'done' : '' %<%# %>> will done the following unparsed code <%= done ? 'done' : '' %>)

Long explanation

Imagine a case I decide to change % by ? using { delimiter: '?' } option (that could be the case here, because we want not to use the same has Backbone.js).

Great, that solves your problem. Imagine now later, for some reason, you use your templating system to generate an XML. This XML will start with <?xml version="1.0" encoding="UTF-8"?>.

You will facing the same issue again. What do? You will change the delimiter again? And after that, you will change again? etc. No, for punctual escaping, what we should is just to be capable to say “Not parse this part of the document as EJS”.

So a trick is to avoid EJS understand it's an EJS delimiter parser. So avoid it (in our current case) parse <? (or <% in an original case).

So by simply adding <?# ?> to break the parsing, you will add nothing (the # item is for EJS comment) and you will avoid parser to understand <<?# ?>?xml version="1.0" encoding="UTF-8"?<?# ?>>. The output will be <?xml version="1.0" encoding="UTF-8"?>

Conclusion

In a punctual necessity to avoid EJS parsing, you can just trick the parser to produce the output you need by using <%# %> as a delimiter tag breaker.

For sure, probably in your case, you can just use the marked answer because you will use the EJS tag in a lot of cases.

心舞飞扬 2025-01-05 07:07:40

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

当然,如果你不使用 require.js 来管理其余 JS 代码的依赖关系,那么这几乎不起作用,但我不能再忍受在没有 require.js 的情况下进行 javascript 开发了,因为我'反正我已经习惯了。

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

Well, the way that I currently approach this is to use require.js with the text plugin; this allows me to include the templates using AJAX during development time and have them all compiled into an optimized/minified single file bundle during deploy time.

Of course, if you don't use require.js for dependency management of the rest of your JS code this doesn't work nearly as well, but I can't stand to do javascript dev without require.js anymore now that I'm used to it anyway.

Alternately, there may be other similar technologies that you could use to solve the same problem.

离线来电— 2025-01-05 07:07:40

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

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

I use backbone.layout.manager on both the client and server side, because I want my templates to be exactly the same.

The way I solved the template delimiter issue was to render the page on the server side, then inject the raw backbone templates.

浅忆 2025-01-05 07:07:40

使用新的 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(" | "); 
gt;', {users: users});
// => 'geddy | neil | alex'

With new ejs you can add a custom delimiter at client side :

https://github.com/mde/ejs#custom-delimiters

eg :

Custom delimiters can be applied on a per-template basis, or globally:

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(" | "); 
gt;', {users: users});
// => 'geddy | neil | alex'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文