为了账号安全,请及时绑定邮箱和手机立即绑定

最佳实践之代码优化和技巧

最佳实践之代码优化和技巧

公众号:famiup

优化Meteor方法的执行效率-异步执行

Meteor 提供了两种简单易于使用的异步化代码的方法,可以非常方便的优化我们的代码,他们分别是 Meteor.defer(func) 和 this.unblock(),这两中方法我更新喜欢 this.unblock(),因为它在释放主线程的同时,并没有改变你的程序流程,还是会按着代码的顺序执行,该返回的时候还是会返回代码执行的结果,unblock只是将后面的代码以非堵塞形式执行。
Meteor.defer(func),提供了超轻量级的异步方法,可以将任何代码包装在defer中,将他们编程异步执行。

if (Meteor.isServer) {
  Meteor.methods({
    'addStatus': function (status) {
      Meteor.defer(function () {
        console.log('sending emails');
      });
      console.log("status added")
    },

    'wait': function () {
      this.unblock();
      console.log('wait started');
      Meteor._sleepForMs(3000);
      console.log('wait is over');
      return 100;
    }
  });
}

if (Meteor.isClient) {
  Meteor.call('wait');
  Meteor.call('addStatus', 'this is my status message');
}

上面的代码执行结果会是这样,仔细感受他们之间的差异:

wait started
status added
sending emails
wait is over

订阅更少的数据

每次页面加载时间消耗很大一部分来自于订阅数据,特别是当数据量慢慢变大之后,订阅数据将是影响app执行的重要因素。使用 limit 可以控制订阅数据的数量,通过 fields 过滤订阅数据的字段。
limit 可以作为订阅的必选项。
在表设计里有特别大的字段是,或者在完成功能后优化不必要的字段时,使用 fields 过滤和确定需要的字段。

Meteor.publish('getRecentWikis', function () {
  var options = {
    sort: {date: -1},
    limit: 50,
    fields: {topic:1, content: 1}
  };
  return Wiki.find({}, options);
});

没有数据直接返回订阅

订阅中不能使用findOne,因为findOne返回的是对象,而find返回的是指针,find().fetch() 返回的是对象数组。所以在订阅时必须返回指针。或者订阅状态。

Meteor.publish('lists.private', function() {
  if (!this.userId) {
    return this.ready();
  }

  return Lists.find({
    userId: this.userId
  }, {
    fields: Lists.publicFields
  });
});

通过转化器,减少内容

在订阅是可以使用 transform 方法预处理数据字段的内容,进一步减少和优化订阅的数据。

Meteor.publish('getRecentWikis', function (limit) {
  limit = limit || 10;

  var options = {
    sort: {date: -1},
    limit: limit,
    fields: {topic:1, content: 1},
    transform: function (wiki) {
      var newWiki = {
        topic: wiki.topic,
        summary: wiki.content.substring(0, 100)
      };

      return newWiki;
    }
  };
  return Wiki.find({}, options);
});

联合订阅

使用 reywood:publish-composite 组件可以让订阅的数据返回向关系的数据,简化了订阅数据的复杂度,Meteor.publishComposite 方法支持嵌套式的调用可以实现类似SQL里联合查询的效果,publish-composite 是 Meteor 重要的组件。

meteor add reywood:publish-composite
Meteor.publishComposite("productByCompany", function(id) {
        return {
            find: function() {
                return Company.find();
            },
            children: [{
                find: function(company) {
                    return Product.find({
                        companyid: company._id
                    });
                },
            }, {
                find: function(company) {
                    return Column.find({
                        companyid: company._id
                    });
                },
            }, ]
        }
    })

缓存订阅数据

通过 meteorhacks:subs-manager 组件可以将每个页面订阅的数据缓冲,这样可以进一步加速和优化页面的加载速度。

meteor add meteorhacks:subs-manager
var subscriptions = new SubsManager();
subscriptions.subscribe('singlePost', 'id1');

Tracker.autorun(function() {
  if(subscriptions.ready()) {
    // all the subscriptions are ready to use.
  }
});

更快的加载

页面加载 meteorhacks:fast-render 组件。

meteorhacks:fast-render
FastRender.debugger.showLogs();
FastRender.debugger.hideLogs();

FastRender.debugger.blockDDP();
FastRender.debugger.unblockDDP();

FastRender.debugger.disableFR();
FastRender.debugger.enableFR();
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
58
获赞与收藏
773

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消