RequireJS使用CommonJS语法的奇怪行为

时间:2013-11-18 15:39:31

标签: javascript download requirejs commonjs

使用CommonJS语法,RequireJS是一个奇怪的行为。我会尽力解释我正在研究的背景。

我有一个名为Controller.js的JS文件,用于注册输入事件(单击)并使用一系列if语句来执行正确的操作。典型的if语句块可以是以下内容。

if(something) {

    // RequireJS syntax here

} else if(other) { // ...

为了实现RequireJS语法,我尝试了两种不同的模式。第一个是以下内容。这是加载模块的标准方法。

if(something) {
    require(['CompositeView'], function(CompositeView) {

        // using CompositeView here... 

    });

} else if(other) { // ...

第二种,使用像

这样的CommonJS语法
if(something) {
    var CompositeView = require('CompositeView');

    // using CompositeView here... 

} else if(other) { // ...

两种模式都按预期工作,但我注意到Firebug出现了一种奇怪的行为(Chrome工具也是如此)。特别是,使用第二个文件,即使我没有按照管理特定操作以响应CompositeView条件的分支,也已下载something文件。相反,使用第一个解决方案,文件在请求时下载。

我错过了什么吗?是因为可变升降吗?

1 个答案:

答案 0 :(得分:3)

这是对CommonJS风格require的支持的限制。 documentation解释了这样的事情:

define(function (require) {
    var dependency1 = require('dependency1'),
        dependency2 = require('dependency2');

    return function () {};
});

由RequireJS翻译为:

define(['require', 'dependency1', 'dependency2'], function (require) {
    var dependency1 = require('dependency1'),
        dependency2 = require('dependency2');

    return function () {};
});

注意2 require次调用的参数如何成为传递给define的数组的一部分。

您所说的观察结果与RequireJS到达if并将所需模块提升至define一致,即使分支始终也是如此没有被采取。阻止RequireJS始终加载模块的唯一方法就是你已经发现的:你必须使用require进行回调。