2

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

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

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

这是我启动 require 的主文件的示例

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 获取,但作为一个简单的例子,我的引导程序几乎什么也没做

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

//dataservice

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

});

正如我所说,两个模块都被加载但从未解决

任何帮助将非常感激。

4

2 回答 2

6

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

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

引导程序.js

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

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

数据服务.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);
  });

官方文档详细介绍了定义模块的主题,我建议在深入研究之前尽可能多地阅读文档。

于 2013-08-06T11:11:29.763 回答
0

这个答案并不完全“匹配”问题的(特定)情况,但它可能会帮助某人解决(一般)问题 - 为什么我的依赖关系未定义?

提示:仔细检查您的依赖项是否依赖于您尝试依赖的东西......

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

于 2020-03-19T03:12:07.527 回答