2013-12-20 131 views
3

我想就如何订阅客户端数据提供建议。提前预订所有需要的数据是最简单的,但我会想到在第一次加载时性能可能会很高。 使用Iron-Router,订阅可以在路由期间完成,然后根据需要填充数据,并且您有waitOn,这很酷。流星数据订阅策略

虽然(特别是在大型项目中)订阅路线肯定会成为管理的噩梦,因为没有对已订阅数据的全局视图。与此相关 - 如果从不同的页面多次调用相同的订阅,会发生什么?

+0

没有任何流星订阅足够聪明。 http://docs.meteor.com/#meteor_subscribe – Denis

回答

2

假设立即激活所有订阅并不是一个好主意,这是正确的。每次激活订阅时,您都会在服务器和客户端上支付性能损失。如果你想要最大化性能,你的目标应该是:

  1. 延迟尽可能长的订阅。
  2. 仅发布您需要的数据。

看一看下面的例子:

Meteor.subscribe('news'); 

Tracker.autorun(function() { 
    if (Meteor.user()) { 
    Meteor.subscribe('friends'); 
    Meteor.subscribe('room', Session.get('roomId')); 
    } 
}); 
  • 新闻订阅功能为所有客户端。通常你想避免这种情况,但也许这是每个人(需要登录或不需要)都应该看到一些消息的要求。这是记住目标(2)的好时机:考虑只发布N个最近的新闻项目,而不是所有的新闻项目。
  • 其他订阅将仅在用户登录时激活(节省资源并延迟订阅)。
  • friends订阅根据路由器可能设置的会话变量roomId进行更改。

我有一个复杂的生产应用程序有很多的路线,我个人发现有一个单一的订阅文件更容易维护。这就是说,我认为这是一个品味的问题,所以你需要尝试两种方式,看看你最舒服的。

最后一个问题的答案是已发布的文档被合并。如果您为同一个集合激活了两个订阅,并且每个订阅都发布了相同的N个文档,那么客户端上应该有N个文档。如果P1发布了N个文档,并且P2发布了M个文档,则您将在客户端上拥有M个联盟N个文档。这在meteor book中有更详细的讨论。