【发布时间】:2012-06-06 08:53:51
【问题描述】:
我们正在使用 Backbone、RequireJS 和 Handlebars 构建一个非平凡的 Web 应用程序,好吧,我只是好奇。目前,我们的每个模型大致如下所示:
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 减少到基本上是一个模块化框架)。不过,我很好奇您是否可以“按需”加载视图和模板等内容。
here 解释了“简化的 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 中是否有黑魔法可以在没有实际触发
doStuff路由的情况下查找对require()的调用? - 这是理论上正确的“按需”延迟加载 RequireJS 模块和资源的方法吗?
- 如果您使用这种表示法,r.js 优化器是否仍能像宣传的那样工作?
【问题讨论】:
标签: javascript backbone.js requirejs js-amd