【问题标题】:using freemarker with javascript ES6 Template Strings将 freemarker 与 javascript ES6 模板字符串一起使用
【发布时间】:2017-05-11 05:29:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript freemarker template-engine


    【解决方案1】:

    你可以在 noparse 标签中使用 javascripts

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

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

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

    【讨论】:

      【解决方案2】:

      更新:从 FreeMarker 2.3.28 开始,您可以通过将 interpolation_syntax 配置设置设置为 square_bracket 来配置 FreeMarker 以使用 [=exp] 而不是 ${exp}(在 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 添加一个过滤器,并随之修改模板。飞。它将用$&lt;#-- --&gt;{ 替换${-s,用${ 替换@{-s。那么您的原始模板可能类似于${forES6} @{forFM}。这有很多缺点,比如 FreeMarker 错误位置的列号会被替换,Eclipse 插件和其他一些工具将无法工作。

      【讨论】:

        猜你喜欢
        • 2021-08-08
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多