RequireJS加载我不想要的资源

时间:2012-08-26 16:33:28

标签: javascript requirejs

我在我的应用中使用RequireJS,但不太了解它的所有工作方面。

我有main.js个文件,其中描述了依赖项。我启动并运行了Backbone.Router组件,它触发了不同的application类(负责创建主视图的类)。您可以看到一些代码here

我可以通过requireJS看到的内容:即使某些观点还没有被要求' (意思是明确地调用require(' ./ subviews / view)),它仍然被加载,并在里面加载所有模板(我使用requireJS文本插件)。如果我添加了新的应用程序,但它的子视图尚未就绪,但我从未使用该应用程序 - 仍然会加载不存在的子视图,并且我收到了404错误。

不确定我是否清楚地解释了所有内容,但希望你明白。

2 个答案:

答案 0 :(得分:3)

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

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

如果您想延迟加载某些脚本,那么您需要使用require的回调形式:

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

但是此调用是异步调用,因此您必须相应地调整模块的公共API。

所以基本上,如果你想按需加载一个依赖项,那么需要回调形式的require,考虑到浏览器中文件IO的异步性质。

答案 1 :(得分:1)

因为RequireJS加载了所有必需的依赖项。通过快速查看代码,我看到您加载路由模块和路由具有:

var ViewManager = require('ViewManager');

这意味着它将加载ViewManager,由ViewManager指定的依赖项以及这些模块所需的其他依赖项。基本上,当您包含require(...)时,它与指定依赖项相同。这将由RequireJS转换为

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