示例
此示例有一个视图,其中包含 render 所需的四个依赖模型。它的设置方式可能会比必要时间长四倍,因为即使视图依赖于模型,模型也可以独立获取。
因此,获取模型所花费的总时间应该是获取任何一个模型所花费的最大时间,而是每个模型的 SUM。这是一个很大的不同!
var SerialTimeKillerA = Backbone.Model.extend({
url: 'time/killer/A'
});
var SerialTimeKillerB = Backbone.Model.extend({
url: 'time/killer/B'
});
var SerialTimeKillerC = Backbone.Model.extend({
url: 'time/killer/C'
});
var AnotherTimeKiller = Backbone.Model.extend({
url: 'seriously'
});
var SerialTimeKillerView = Backbone.View.extend({
initialize: function() {
var modelA = this.modelA = new SerialTimeKillerA();
var modelB = this.modelB = new SerialTimeKillerB();
var modelC = this.modelC = new SerialTimeKillerC();
var _this = this;
modelA.fetch().complete(function() {
modelB.fetch().complete(function() {
modelC.fetch().complete(function() {
_this.render();
});
});
});
},
render: function() {
if (this.anotherOne)
return templater.render(this);
else {
var _this = this;
this.anotherOne = new AnotherTimeKiller();
this.anotherOne.fetch().complete(function() {
_this.render();
});
}
}
});
这里是固定版本:
var SerialTimeKillerView = Backbone.View.extend({
initialize: function() {
this.modelA = new SerialTimeKillerA();
this.modelB = new SerialTimeKillerB();
this.modelC = new SerialTimeKillerC();
this.anotherOne = new AnotherTimeKiller();
var _this = this;
$.when(this.modelA.fetch(), this.modelB.fetch(), this.modelC.fetch(), this.anotherOne.fetch()).done(function(a, b, c, x) {
_this.render();
});
},
render: function() {
return templater.render(this);
}
});
单词
我会在这些地方记录时间:
- 获取页面
- 第一个字节
Marionette.Application.start()
-
Meters请求开始
-
Meters请求完成
- 页面已完全加载 &&
Meters 请求完成
我怀疑提出请求的实际时间会有很大差异。可能的罪魁祸首是
- 容器页面(启动应用的页面)的服务器加载时间
- 所有 SPA 依赖项的下载时间(这些在 SPA 上可能会变得很重要)
- 是时候完成其他 API 调用了
-
Meters 完成后渲染页面的时间
一旦您确定了您需要对 Meters 执行的操作以及实际发出请求所需的内容,您就可以通过更早地(尽可能快地)发出请求并更早地渲染(一旦完成)来进行优化你可以)。
如果您打开开发者工具并在“网络”活动中看到大量顺序加载(即没有堆叠条形),那么您可能有机会通过上述过程来缩短时间...
如果您想了解更多细节,请告诉我,但这是要点。