define(['Backbone', 'js/thing/a', 'js/thing/b', 'js/lib/bob'], function(a, b, bob) {
return Backbone.Router.extend({
// stuff here
});
});
thing/a和thing/b都有自己的依赖项,例如Handlebars模板等。现在的情况是,在我的main.js中,所有“顶级”路由器都被加载并初始化;每个顶级路由器都有一组依赖项(模型、视图等),每个依赖项都有自己的依赖项(模板、助手、实用程序等)。基本上,是一个大树结构。
这种情况下的问题在于,在页面加载时,整个树都会被解析和加载。我并不介意这个,因为最终我们会通过优化器将其变成一个大文件(将RequireJS基本上缩小为一个模块化框架)。但是,我很想知道是否可以“按需”加载视图和模板。
这里有一个“简化的CommonJS封装”的解释(在这里),所以我尝试了一下:
define(function(require) {
Backbone = require('Backbone');
return Backbone.Router.extend({
doStuff: function() {
var MyView = require('js/myView');
new MyView().render();
}
});
});
然而,在查看Chrome的网络检查器时,似乎RequireJS即使没有触发触发doStuff处理程序的路由,仍会加载myView依赖项。问题:
- 这实际上可能吗? RequireJS中是否有黑魔法来查找对
require()
的调用而不实际触发doStuff
路由? - 这是实现'RequireJS模块和资源按需惰性加载'的理论正确方式吗?
- 如果使用此符号,r.js优化器是否仍按宣传的那样工作?