RequireJs依赖项始终未定义

时间:2013-08-05 23:11:08

标签: javascript requirejs

我正在使用require Js并且我很困惑为什么我的模块正在加载但是依赖项总是未定义的,甚至在使用require.defined()函数来检查我的模块是否已经加载它确实已经但是当我使用require([deps],function(deps){});我的所有依赖项都是未定义的(jquery,下划线和淘汰除外)

我的文件结构如下   我的文件结构如下

scripts 
    |
    |        
    main.js
    |
    |_________BusinessScripts
    |           |
    |           |
    jquery.js   |
    |           |
    |           boostrapper.js-undefined
    ko.js       |
                |
                dataservice.js-undefined

这是我的主要文件的一个例子,开始需要

requirejs.config(
    {
        paths: {
            'jquery': 'jquery-1.7.1',
            'underscore': 'underscore',
            'ko': 'knockout-2.2.1'
        },
        shim: {
            underscore: { exports: '_' },
        }
    }
);


requirejs(['require', 'BusinessScripts/bootstrapper', 'BusinessScripts/dataservice'],
function (require,bootstrapper, dataservice) {

    var def = require.defined('BusinessScripts/bootstrapper'); //this returns true

    if (dataservice !== undefined) { // always undefined

        alert("Loaded properly");
    } else {
        alert("not loaded!!!");
    }

    if (bootstrapper !== undefined) { // always undefined


        alert("Loaded properly");
    } else {
        alert("not loaded!!!");
    }

});

我的数据服务类做了一个非常冗长的jquery get但是作为一个简单的例子我的bootstrapper几乎没有做什么

//bootstrapper
define(function () { var one = 1; 
var run = function () {
}
});

//dataservice

define(['jquery', 'underscore'],function ($, _) {
    $.ajax({lengthy work...});

});

正如我所说,两个模块正在加载,但永远不会解决

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:5)

您没有从bootstrapperdataservice模块返回任何内容,因此模块的“公共”部分为undefined。 RequireJS只是执行define函数的主体并隐式返回undefined。我认为一个很好的类比是将模块视为一个隐藏所有内部的黑盒子,只允许通过公共接口访问(这是从模块的最终return语句返回的任何内容)

您应该稍微重写一下模块,例如:

<强> bootstrapper.js

define(function () {
  var one = 1;
  var run = function () {
    console.log('Running...');
  }

  return {
    publicRun: run,
    publicOne: one
  }
});

<强> dataservice.js

define(['jquery', 'underscore'],function ($, _) {
  $.ajax({
    // lengthy work...
  });

  return 'Lengthy work started!';
});

然后你可以使用这样的模块:

requirejs(['require', 'BusinessScripts/bootstrapper', 'BusinessScripts/dataservice'],
  function (require, bootstrapper, dataservice) {
    // prints "1"
    console.log(dataservice.publicOne);

    // prints "Running..."
    dataservice.publicRun();

    // prints "Lengthy work started!"
    console.log(bootstrapper);
  });

official docs涵盖了详细定义模块的主题,我建议在潜入之前阅读尽可能多的文档。

答案 1 :(得分:0)

此答案不能完全“匹配”问题的(特定)情况,但可以帮助某人解决(一般)问题-为什么我的依存关系不确定?

提示:仔细检查您的依赖项是否与您要依赖的事物无关...

即如果您希望A依赖B,请仔细检查B是否不依赖A。