javascript - 在服务端渲染局部 View 或在客户端发送json数据渲染模板

标签 javascript html grails view-templates

我想知道在 Web 应用程序中呈现部分 View 的好方法(或推荐方法)是什么。

我有一个要求,我需要使用 AJAX 将数据加载到已经呈现的页面中,有点像页面末尾的 “加载更多...” 链接,它可以获取更多信息从服务器并将其呈现到页面底部。

我目前正在使用的 AJAX 响应的两个选项是

  1. 返回数据的 JSON 表示,并使用客户端模板库(例如 jQuery 模板)或仅使用普通 javascript 将 JSON 转换为 HTML 并附加到页面底部
  2. 在服务器上呈现部分 View (在我的例子中使用 grails 的 render template:'tmplt_name')并通过网络发送它,并将结果附加到页面底部<

还有其他方法吗?如果不是,考虑到上述选项,哪个在维护、性能和可测试性方面更好?我可以肯定的一件事是,JSON 路由(在大多数情况下)会比通过网络发送 html 占用更少的带宽。

最佳答案

这实际上是一个非常有趣的问题,因为它揭示了一些有趣的设计决策。

我更喜欢呈现部分模板,因为它使我的应用程序能够随时间变化。如果我需要从 <table> 更改到 <div>使用图表,很容易将其封装在模板中。考虑到这一点,我几乎将每个页面都视为许多小模板的集合,这些模板可能会发生变化。 Grails 2.0 默认脚手架已经转向这种类型的方法,这是一个好主意。

关于它们应该是客户端模板还是服务器端的问题是问题的症结所在。

服务器端模板让您的标记在初始页面加载时更加清晰。即使你使用类似 Mustache 的东西的 ICanHazJS ,你有点需要在页面中有一个空元素(你的模板中的东西),适本地设置它的样式,并在 Javascript 中使用它来更新你的信息。

缺点

  • “喋喋不休”的应用
  • 更大的网络信封(响应包括 HTML,可能被认为是静态的)
  • 较慢的用户界面响应时间

好处

  • 适合具有大量服务器端语言经验的人
  • 在服务器端环境中可能更容易操作或修改(例如,返回一个嵌入了多个模板的页面,这些模板以编程方式加载和包含)
  • 将大部分应用程序内容“放在一个地方”

然而,客户端模板确实可以减少服务器负载。他们使应用程序“不那么啰嗦”,因为您可以通过发送回更大的 JSON 集合(以相同或更少的字节数,将由 HTML 占用)来最大程度地减少对服务器的调用次数服务器端模板方案)。它们还使用户的 UI 体验非常快,因为单击“更新”链接不必进行 AJAX 往返。有人说:

Anthony Eden @aeden 10 Dec Reply Retweeted Favorite · Open the future of web apps: requests are handled by functions, logic is always asynchronous, and HTML is never generated on the server.

缺点

  • 不利于 SEO(初始页面加载时的非语义无关 UI 元素)
  • 需要一些 Javascript foo(操作元素)

好处 - react 灵敏 - 较小的信封

趋势似乎正在向客户端模板发展,尤其是随着 HTML5 添加项(如 <canvas>)所展现的强大功能...但是如果利用它们需要您依赖您不太熟悉的技术,并且您对 Grails partials 感觉更舒服,可能值得从这些开始,然后根据性能和其他问题研究对客户端模板的重构。

关于javascript - 在服务端渲染局部 View 或在客户端发送json数据渲染模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8547098/

相关文章:

iphone - 添加全景 View - 添加到 iPhone 应用程序中的 html 文件中

html - 默认 CSS 的浏览器依赖于什么?

javascript - 从网站发布推文

java - 如何将 log4j 设置为每个错误/警告/信息的特定文件(在 grails 中)

grails - 没有其他域引用的域标准

php - 显示数据库中的数据而不刷新(Javascript)

javascript - 将增量值分配给 knockout 中动态生成的复选框

javascript - 尝试 findById 但服务器未返回正确的状态响应

javascript - 在 Twilio 出站调用中,如何检测对方何时接听电话?

Grails g :remoteLink response