2012-08-26 36 views
1

我在我的应用程序中使用RequireJS,但不太清楚它的所有方面的工作。RequireJS加载资源我不想

我有main.js文件,其中描述了依赖关系。我有Backbone.Router组件启动并运行,这会触发不同的application类(负责创建主视图的类)。一些代码,你可以看到here。我可以看到requireJS:即使某些视图还没有'required'(意味着显式调用require('./subview/view)),它仍然会被加载,并且会加载所有模板(我使用requireJS文本插件)。如果我添加新的应用程序,但它的子视图没有准备好,但我从来没有使用应用程序 - nonxisting子视图仍然加载,我得到404错误。

不知道我是否清楚地解释了一切,但希望你有点。

回答

3

看起来你正在使用的CommonJS sugared form of define()。请注意,这仅仅是包装Node/CommonJS代码的便利,但AMD模块不像Node模块那样操作。

AMD加载程序将在模块的工厂函数中扫描require('')调用,并确保加载所有模块。否则,通过执行require('./apps/DashboardApp');,对该模块的同步访问将在浏览器中失败,因为文件IO是默认的异步网络IO。

如果你要延迟一些脚本加载,那么你需要使用的回调形式要求:

require(['./apps/DashboardApp'], function (DashboardApp) { 
}); 

,但这一呼吁是一个异步调用,所以你必须调整你的模块的公共API相应地。

因此,基本上,如果您想按需加载依赖项,则需要使用require的回调形式,因为浏览器中的文件IO具有异步性质。

+0

很好的答案,我会试试看。我喜欢这种形式的定义,只有一个函数作为参数。 –

+0

然后你说 - “你将不得不相应地调整你的模块的公共API” - 你能否给我任何提示,究竟需要改变什么? –

+0

这仅表示如果其他模块使用的模块的公开功能需要基于来自DashboardApp的同步返回值,则需要调整模块的API以接受一旦DashboardApp加载后将调用的回调。 – jrburke

1

因为RequireJS加载所有必需的依赖关系。通过采取快看看你的代码,我看到您加载路由模块和路由有:

var ViewManager = require('ViewManager'); 

这意味着它会加载ViewManager,由ViewManager,而这些模块需要其他依赖指定依赖条件。基本上,当你包含require(...)时,它与指定依赖关系相同。这将RequireJS转化成

define(['ViewManager'], ...)

+0

如果你看看ViewManager内部,这是一个简单的对象,没有依赖关系。我能看到的是,依赖不是必需的,但是要求JS仍然不想加载它。 –

+0

是的,但还有其他要求。虽然他们最初不需要,因为由于define()的含糖版本而被描述,AMD加载器将通过使用Function.prototype.toString()解析require('')调用并加载所有依赖关系。 –