使用大型Backbone集合

时间:2011-09-27 09:12:51

标签: pagination backbone.js

我们正在设计一个骨干应用程序,其中每个服务器端集合都有可能包含数万条记录。作为类比 - 考虑进入电子邮件应用程序的“已发送邮件”视图。

在我看到的大多数Backbone示例中,涉及的集合最多有100-200条记录,因此获取整个集合并在客户端中使用它相对容易。我不相信这会是一个更大的集合。

有没有人在大型服务器端集合上使用Backbone做过任何工作?

  • 您是否遇到过特定收藏尺寸的性能问题(特别是在移动设备上)?
  • 您从服务器获取了多少决定?
  • 您下载所有内容还是仅下载一部分?
  • 你在哪里放置任何自定义机制的逻辑(例如Collection原型?)

2 个答案:

答案 0 :(得分:11)

  1. 是的,在大约10,000件商品中,旧浏览器无法很好地处理显示器。我们认为这是一个带宽问题,但即使在本地,由于带宽和高性能机器一样多,Javascript也有点过时了。这在Firefox 2和IE7上都是如此;我从未在大型系统上测试过它。

  2. 我们试图获取所有内容。这不适用于大型数据集。 Android的浏览器特别有害。

  3. 我们的数据采用树形结构,其他数据取决于树结构中数据的存在。由于来自其他用户或程序的其他部分的操作,数据可能会发生变化。最终,我们使树结构仅获取当前可见的节点,并且系统的其他部分验证了它们独立依赖的数据集的有效性。这是竞争条件,但在实际部署中我们从未发现任何问题。我本来希望在这里使用socket.io,但管理层并不理解或信任它。

  4. 由于我使用Coffeescript,我只是从Backbone.Collection继承并创建了我自己的超类,它还实例化了一个自定义的sync()调用。调用超类方法的语法在这里非常有用:

    class Dataset extends BaseAccessClass
        initialize: (attributes, options) ->
            Dataset.__super__.initialize.apply(@, arguments)
            # Customizations go here.
    

答案 1 :(得分:2)

像Elf一样,你应该从服务器分页加载数据。您可以通过下载可能不需要的项目来节省服务器上的大量负载。只需在Chrome中本地创建一个包含10k模型的集合,需要半秒钟。这是一个巨大的负担。

您可以使用worker将工作放在另一个物理CPU线程上,然后使用transient对象将其发送到主线程,以便在DOM上呈现它。

一旦你有一个集合,DOM延迟渲染中的大渲染只会让你到目前为止。内存将慢慢增加,直到它崩溃浏览器(在平板电脑上会很快)。您应该在元素上使用对象池。它允许您为内存设置一个小的最大大小并保持在那里。

我正在为Backbone构建一个PerfView,可以渲染1,000,000个模型并在Chrome上以120FPS滚动。代码全部在Github https://github.com/puppybits/BackboneJS-PerfView上。它评论了很多其他优化,你需要显示大型数据集。