require.js无法加载任何模块。

6
我将会翻译以下内容:

我正在尝试使用require.js加载一个模块,在我的app.js文件中有以下代码:

require.config({
baseUrl: "js"
});


alert("hello world"); // for debugging

require(['eh2'], function(eh2) {
    alert("nothing here"); // for debugging
});

当我运行我的应用程序时,尽管app.js已经被加载,但我要求的模块从未被加载 - “hello world”被执行,但“nothing here”没有!在HTML页面中,我的脚本标记如下:
<script type="text/javascript" src="js/lib/require.js" data-main="app"></script>

而 eh2.js 位于 js 文件夹中,并且被包装在一个 define 语句中:

define(["./screens/Screens"], function(screens) {
    return {
        // code here
    };
});

我做错了什么?也许require.js在加载screens.js下的某个子模块时默默失败了?
以下是来自Screens模块的代码:
    define([ "screens/TitleScreen", "screens/GameScreen" ], function(titleScreen, gameScreen) {
    return {

        screenFuncs: {
            "TitleScreen" : titleScreen.TitleScreen,
            "GameScreen" : gameScreen.GameScreen,
        },

        buildScreen: function(data) {
            var func = screenFuncs[data.type];
            var screen = new func(data.params);
            return screen;
        },
    };
});

在define调用中,路径需要相对于我所在的js文件的当前位置还是相对于app.js中定义的根目录?


Chrome控制台或Firebug上有任何错误吗? - Cristiano Fontes
尝试使用以下代码定义“eh2”模块:define("eh2", ["./screens/Screens"],…);。同时,请检查屏幕脚本是否正确加载,可以查看您的网络面板。 - Bergi
require.js通常不会默默失败,你会得到错误提示(有时可能会延迟)。确保在你使用的任何浏览器调试工具中也打开异步请求日志记录。 - Matt Whipple
控制台上的屏幕模块出现了错误,实际上是同样的问题:它无法在我正在加载的模块中找到代码。由于注释中不允许格式化,因此我将编辑原始帖子以包含来自屏幕模块的代码。 - ekolis
是的,我在构造函数名称上尝试了没有命名空间前缀的方式,在将其拆分为多个js文件并使用require之前一切都正常工作! - ekolis
1个回答

5

请替换以下内容:

define(["./screens/Screens"], function(screens) {
    ....
});

可以使用绝对路径变量:

define(["screens/Screens"], function(screens) {
    ....
});

或使用:
define(function(require) {
    var screens = require("./screens/Screens");
    ....
});

来自官方文档:

在define()内部使用相对模块名:

当在define()函数调用内部出现require("./相对路径/name")的调用时,请确保将"require"作为依赖项请求,以便正确解析相对路径名称:

define(["require", "./relative/name"], function(require) {
    var mod = require("./relative/name");
});

或者更好的方法是使用适用于翻译CommonJS模块的简化语法:
define(function(require) {
    var mod = require("./relative/name");
});

谢谢,但我认为我的app.js还有一些问题——“nothing here”从未出现,所以它甚至没有加载我的主要eh2.js文件! - ekolis
嗯,我想我的问题可能是我创建了一个叫做Screen的类,它被浏览器的Screen对象覆盖了!我会尝试将其重命名... - ekolis
可能是因为我上面提到的定义错误的文件是eh2.js,所以它甚至没有加载你的eh2.js文件..! - lrsjng
好的,我通过修复你建议的问题成功地加载了eh2.js,但是eh2.js依赖的所有其他文件都依赖于Screen.js,所以也许require("Screen")静默失败是因为Screen已经被定义了? - ekolis
如果你使用 require("Screen"),它永远不会与全局的 screenScreen 冲突。定义和 require(关于模块名称)构建自己的作用域,不会与全局浏览器作用域冲突。 - lrsjng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接