1

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

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

我可以通过 requireJS 看到:即使某些视图还没有被“必需”(意味着明确调用 require('./subviews/view)),它仍然被加载并在其中加载所有模板(我使用 requireJS 文本插件) . 如果我正在添加新应用程序,但它的子视图尚未准备好,但我从未使用过该应用程序 - 仍然加载不存在的子视图并且我收到 404 错误。

不确定我解释清楚了一切,但希望你明白了。

4

2 回答 2

3

看起来您正在使用CommonJS 糖化形式的 define()。请注意,这只是为了方便包装 Node/CommonJS 代码,但 AMD 模块不像 Node 模块那样运行。

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

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

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

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

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

于 2012-08-26T22:28:51.727 回答
1

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

var ViewManager = require('ViewManager');

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

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

于 2012-08-26T16:59:25.660 回答