我应该使用JavaScript还是服务器渲染此模板?

时间:2011-12-04 00:03:34

标签: javascript html templates backbone.js

我正在渲染新闻Feed。

我打算将Backbone.js用于我的javascript东西,因为我厌倦了用JQuery手动DOM绑定。

所以现在我正在考虑两个选项。

  1. 当用户加载页面时,“新闻订阅源”容器为空。但是该页面触发了一个javascript,它将新闻的项目呈现在屏幕上。这将与Backbone的模型和集合等相关联。

  2. 当用户加载页面时,服务器会呈现“新闻源”。即使javascript被关闭,项目仍会显示,因为服务器通过模板引擎呈现它。

  3. 我想使用Backbone.js来保持我的javascript干净。那么,我应该选择#1,对吧?但#1比#2复杂得多。

    顺便说一句,我问这个问题的原因是因为我不想使用Backbone.js的路由功能。我会单独加载每个页面,并使用Backbone作为页面的各个项目。换句话说,我正在使用Backbone.js。

    如果我要使用Backbone.js的路由功能,那么明显的答案是#1,对吧?但是我担心建立路线系统需要花费太多时间,时间也应该平衡到我的等式中。

    如果这个问题令人困惑,我很抱歉:我只是想知道使用Backbone.js的最佳做法并节省时间。

4 个答案:

答案 0 :(得分:24)

两者都有优点和缺点,所以我会这样说:根据你的要求,选择最适合的选项。

我不知道Backbone.js,所以我将继续回答客户端与服务器端的渲染。

客户端渲染

这种方法允许您在服务器端快速渲染结构,然后让用户的JavaScript获取实际内容。

优点:

  • 更快的感知用户体验:如果初始渲染上有足够的静态内容,那么用户可以更快地获取其页面(或至少在其开头)并且他们不会被打扰动态内容,因为它很可能也会合理地快速呈现。
  • 更好地控制缓存:通过要求浏览器发出多个请求,您可以将服务器设置为针对每个URL使用不同的缓存标头,具体取决于您的要求。通过这种方式,您可以允许用户缓存初始页面呈现,但需要用户每次都获取动态(更改)内容。

缺点:

  • 用户必须启用JavaScript :这是一个显而易见的问题,我甚至不需要提及它,但是如果你不喜欢,你就会削减用户群的一小部分不能为你的JS重型网站提供优雅的替代品。
  • 复杂性:这个有点主观,但在某些方面,用服务器端语言提供所有内容并且不需要那么多来回更简单。当然,它可以双管齐下。
  • 缓慢的后期处理:这取决于浏览器,但事实是,如果在检索动态内容后需要进行大量DOM操作或其他后期处理,则可能会更快如果服务器未充分利用,让服务器执行此操作。大多数浏览器都擅长基本的DOM操作,但是如果你必须进行JSON解析,排序,算术等,那么服务器上的一些浏览器可能会更快。

服务器端呈现

这种方法允许用户一次接收所有内容,并且也适用于没有良好JavaScript支持的浏览器,但这也意味着在浏览器获得第一个<html>标记之前,所有内容都需要更长的时间。< / p>

优点:

  • 内容一次显示:如果您的服务器速度很快,它会立即呈现所有内容,就是这样。没有凌乱的XmlHttpRequests(有没有人直接使用它们?)。
  • 快速后处理:就像您不希望应用层对数据库查询集进行排序一样,因为数据库速度更快,您可能还希望保留大量处理服务器端。如果你设计的是客户端方法,很容易被带走并将处理放在错误的位置。

缺点:

  • 感知用户体验较慢:在服务器完成所有工作之前,用户将无法看到单个字节。当然,服务器可能会通过它进行压缩,但是在用户方面它还需要几秒钟,你可以通过立即渲染它们来帮助它们。
  • 也不会扩展,因为服务器会在请求上花费更多时间:可能是您真的希望服务器快速完成请求并转到下一个连接。

哪些对您的要求最重要?这应该告诉你的决定。

答案 1 :(得分:0)

我不知道骨干,但这里有一个简单的想法:如果可能和安全,在客户端而不是服务器上做所有事情。这样,服务器就可以完成更少的工作,因此可以处理更多的连接并更好地扩展。

答案 2 :(得分:0)

  

但#1比#2复杂得多。

不是真的。一旦你掌握了Backbone和jQuery以及客户端模板(也可能将CoffeeScript投入混合),那么这并不是很难。事实上,它大大简化了您的服务器代码,因为现在删除了所有与显示相关的功能。您甚至可以在同一服务器上运行不同的客户端(例如移动版本)。

  

即使javascript被关闭,项目仍会显示,因为服务器通过模板引擎呈现它。

这是重要的考虑因素。如果你想支持没有Javascript的用户,那么你需要一个非JS版本。

如果您已经拥有非JS版本,您可以考虑是否仍然需要“增强版”,如果您需要,如果您想重新使用服务器端模板,那么您已经进行了编码和测试并且需要维护或者复制客户端的工作,这增加了开发成本,但正如您所说,可以提供更好的体验并降低服务器上的负载(尽管我无法想象获取渲染数据与获取XML数据会使得很大的不同)。

如果您不需要支持没有Javascript的用户,那么请务必在客户端上进行渲染。

答案 3 :(得分:0)

我认为Backbone的目标是组织一个Javascript页内客户端应用程序。但首先你应该在下一个声明中采取立场:

  

即使关闭了javascript,网络应用仍然可以在“后退模式”下工作。

那是你的要求之一吗? (这不是一个简单的要求。)如果不是,那么我会建议你:“做更多的JS”。但如果是,那么我相信你最好的朋友是jQuery load function

注意:我是一名Java程序员,并且有很多服务器端框架能够编写在启用js时可以正常工作的应用程序,而在没有启用js时可以启用post-backs。我认为WicketEcho2是其中两个,但这意味着它们是服务器端库...