将 freemarker 与 javascript ES6 模板字符串一起使用

using freemarker with javascript ES6 Template Strings

Freemaker 模板使用以下语法呈现变量:${name}

Javascript ES6 模板字符串有类似的语法 ${name}

问题是当freemarker在服务器上运行时,它会尝试渲染javascript代码中的模板,因为Freemarker认为它遇到了一个变量(实际上它是一个javascript 应该在客户端呈现的模板)。有关如何处理此问题的建议?

一种方法是将所有 JS 包装在一个 freemarker 注释中(因此它永远不会被评估),

或者将 JS 代码放在一个单独的文件中(不在 html 页面中内联),这样它就不会被 freemarker 评估。

更新: 从 FreeMarker 2.3.28 开始,您可以通过设置 interpolation_syntax 配置将 FreeMarker 配置为使用 [=exp] 而不是 ${exp}设置为 square_bracket(在 Java API 中:Configuration cfg; ... cfg.setInterpolationSyntax(Configuration.SQUARE_BRACKET_INTERPOLATION_SYNTAX))。然后 ${exp} 只是 FreeMarker 的静态文本。不要将此设置与 tag_syntax 设置混淆,后者也可以具有 square_bracket 值,但独立于插值语法(但您可能更喜欢将两者都设置为 square_bracket)。另见:https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html

过时的答案: 不幸的是,FreeMarker 的语法不可配置(我假设 ES6 模板语法也不可配置)。因为那将是真正的解决方案,将其配置为使用其他东西而不是 $。您可以使用自定义 TemplateLoader 实现来创建一个穷人的实现,该实现只委托给另一个 TemplateLoader,只是它向 Reader 添加了一个过滤器 returns,并且这样它就可以即时修改模板。它会将 ${-s 替换为 $<#-- -->{,将 @{-s 替换为 ${。那么您的原始模板可以类似于 ${forES6} @{forFM}。这有很多缺点,比如 FreeMarker 错误位置的列号会被替换,Eclipse 插件和其他一些工具将无法使用。

您可以在 noparse 标签中使用 javascripts

 <#noparse>...</#noparse>

const name = "WORLD";
Hello ${r"${name}"}

html 查看"Hello ${name}" 输出-> Hello WORLD