具有Java编译器的客户端模板语言(DRY模板)。

10
我希望能够定义一次模板,然后使用它来从服务器端和客户端渲染HTML。(DRY原则等等)
我设想的API很简单:render(JSON, template) --> html。
我正在使用一个Java框架(实际上是Play框架,但我不认为这是特定于框架的)。
我已经阅读了很多类似的问题,最新且最有用的是:Templating language for both client-side and server-side rendering
我基本上同意作者的观点,比如Mustache和Google Closure Templates显然不适合此需求。(请参见该文章中的原因)
要求:
  • MUST: 客户端渲染
  • MUST: 客户端缓存模板文件
  • NICE: 客户端“编译一次,多次执行”模板文件以快速生成JavaScript代码
  • MUST: 服务器端渲染
  • NICE: 原生Java实现
我看到很多帖子建议使用Node.js进行服务器端模板渲染。虽然这肯定可以实现(下划线模板、Handlebarsjs、EJS都可以正常工作),但我不知道如何与Java通信/组合/集成,毕竟仍然需要Java框架输出JSON。
我看到有些帖子提到过一些概念验证,可以在JVM和Node.js之间进行通信(通过HTTP或使用JNDI)。然而,目前似乎没有可用的库,更不用说经过实战测试的了。
因此,为了总结一下,您建议使用哪个客户端模板引擎能够在Java中运行(或者通过某些方式从JVM调用)?如果这个“hoop”恰好是Node.js,您建议使用哪些通信方式/库?

为什么不使用Node.js而不是Play?像Rhino和ringojs这样的SSJS系统在JVM上运行得很好。 - Raynos
因为我来自Java的背景,而且我正在处理一个现有的应用程序。我“只是”想重构它的展示部分。关于RingoJS,我已经研究过,但根据我阅读的资料,Node.js的性能要比RingoJS好得多。也许当选择是通过HTTP连接到Node.js时,我不应该担心网络延迟,但这正是我想弄清楚的事情之一。 - Geert-Jan
你确定需要服务器端渲染吗?我猜想在服务器上应用模板后,您不会对生成的HTML做任何其他操作,除了将其放在响应中...另一方面,您可以在JVM内部运行JavaScript模板语言,并使用JavaScript-2-JVM运行时。在Java端生成JSON代码,将其传递到JS端并收集输出。我只在.NET上使用过动态编译的JScript.NET,但您也应该能够以类似的方式在Java中使其工作。 - miguelv
无论如何,我想在服务器端生成与客户端后续呈现完全相同的HTML。因此,在这个过程中使用相同的模板(并保持DRY)对我来说非常有意义。在某些情况下,仅在服务器端生成JSON,将其输出,并让客户端模板负责呈现可能是一个选项。但是,我需要无需JavaScript的浏览器(考虑SEO)也能正常工作。 - Geert-Jan
1个回答

1

目前我选择Mustache,并期待Handlebars.js的Java实现。一旦有了这个,重构路径就不会那么陡峭了。

编辑-2012年4月

好的,为了将来的参考更新一下:

  • 我正在将服务器端模板外包给Node.js。
  • 使用套接字实现Java和Node.js之间的通信。(参见:使用套接字从node.js发送数据到Java,这是我得到灵感的地方)
  • 由于现在我只需要一个客户端库(或者更好的是在客户端和服务器端都可以使用Node上的JavaScript运行),所以我可以更自由地选择。由于已经习惯了Mustache,我选择了Hogan解析器(由Twitter的人开发)(http://twitter.github.com/hogan.js/)

100% DRY(甚至客户端的mixin和i18N-bundle也来自同一源头)。此外,Hogan可以在服务器端预编译模板并打开与客户端的连接,因此客户端在第一次连接时无需解析模板。

速度快吗?闪电般的...


你的解决方案听起来很有趣。我在这里看到的缺点是你的服务器端也必须运行Node.js。 - oak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接