我们正在设计一个骨干应用程序,其中每个服务器端集合都有可能包含数万条记录。作为类比 - 考虑进入电子邮件应用程序的“已发送邮件”视图。
在我看到的大多数Backbone示例中,涉及的集合最多有100-200条记录,因此获取整个集合并在客户端中使用它相对容易。我不相信这会是一个更大的集合。
有没有人在大型服务器端集合上使用Backbone做过任何工作?
答案 0 :(得分:11)
是的,在大约10,000件商品中,旧浏览器无法很好地处理显示器。我们认为这是一个带宽问题,但即使在本地,由于带宽和高性能机器一样多,Javascript也有点过时了。这在Firefox 2和IE7上都是如此;我从未在大型系统上测试过它。
我们试图获取所有内容。这不适用于大型数据集。 Android的浏览器特别有害。
我们的数据采用树形结构,其他数据取决于树结构中数据的存在。由于来自其他用户或程序的其他部分的操作,数据可能会发生变化。最终,我们使树结构仅获取当前可见的节点,并且系统的其他部分验证了它们独立依赖的数据集的有效性。这是竞争条件,但在实际部署中我们从未发现任何问题。我本来希望在这里使用socket.io
,但管理层并不理解或信任它。
由于我使用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上。它评论了很多其他优化,你需要显示大型数据集。