我正在开发一个使用requirejs的单页面backbone应用程序。今天我将它部署到测试服务器上时,发现初始页面加载时间长达20秒,因为它需要获取所有的脚本。
我猜测是因为我在定义模块时使用了依赖数组,如下所示:
我认为这意味着当主应用程序模块被加载时,由于每个模块都使用此方法,因此将加载每个其他脚本。我随后更改了获取模块的方法,通过在需要时直接调用
我猜测是因为我在定义模块时使用了依赖数组,如下所示:
define([
'ui',
'models/user',
'collections/campaigns',
'collections/groups',
'collections/keywords',
'collections/inboxes',
'collections/templates',
'collections/contacts',
'router'
], function (Ui, UserDetails, Campaigns, Groups, Keywords, Inboxes, Templates, Contacts, Router) {
return {
start: function () {
// ...
// initialize and start app
// ...
}
}
});
我认为这意味着当主应用程序模块被加载时,由于每个模块都使用此方法,因此将加载每个其他脚本。我随后更改了获取模块的方法,通过在需要时直接调用
require('...')
来获取它们,如下所示:define(function (require) {
return Backbone.Router(function () {
// ...
// route initializtion etc
// ...
inbox: function (routeVar) {
var InboxView = require('InboxView');
this.inboxView = new InboxView();
// render view etc
}
});
});
然而让我惊讶的是,当我再次运行应用程序并检查Chrome开发者控制台的网络选项卡时,我发现应用程序仍在获取所有模块,并且页面加载时间与之前相同。
我完全错过了什么吗?因为我原本以为每次调用require时脚本都会被获取。难道不是这样吗?
require
告诉requireJS为模块提供一个正确作用域的实例,以便它可以使用该实例来要求更多的模块。如果您使用诸如多版本支持之类的功能,则适当的作用域非常重要,因此require
会加载所请求的模块的正确版本。在这个特定的实例中,所需模块的列表是由requireJS自动生成的,因为使用了sugar语法。 - rharperrequire('InboxView', function(InboxView) {})
,b)从概念上讲,不存在所谓的“同步”require调用。所有的require调用都是异步的。 - T Nguyen'InboxView'
应该被包裹在[]
中。已修复。 - rharper