【问题标题】:requirejs unable to find module returning undefinedrequirejs 找不到返回未定义的模块
【发布时间】:2013-03-18 20:55:55
【问题描述】:

我之前一直在使用 require,但从未遇到过这个问题, 也许我在某处弄错了路径,但这是我的文件结构:

js
├───main.js
│
├───app
│   ├───app.js
│   ├───hello.js
│   ├───world.js
│   │
│   └───models
│       └───game.js
│
└───vendor
    ├───jquery.js
    └───require.js

main.js

require.config({
    paths: {
        'jquery':   '../js/vendor/jquery'
    },
    shim: {
        'jquery': {
            exports: '$'
        }
    }
});

require(['app/app', 'jquery', 'app/models/game'], function (App, $, Game) {
    console.log(arguments);
    $(function () {
        console.log('why is my App undefined?', App);
        App.init();

    });
});

app/app.js

define('App', ['hello', 'world'], function (hello, world) {

    var App = {};

    App.init = function () {
        alert(hello + ' ' + world);
    };

    return App;
});

代码正常触发,但是我的依赖项似乎在 app 或 hello 或 world 模块上失败,App 日志为未定义,我的游戏模块也是如此。

app/app 应该是我的 App 模块的正确路径,还是我想错了?

更新

我认为 App 的大写 A 解决了这个问题(但同时我对 Jlange 的评论采取了行动,所以我从 index.html 启动了 app/App 模块。这看起来不错,但在继续开发它又出现了。

我可以很好地加载同一目录中的每个模块,但我不能从子目录中加载模块。

就像最初的示例无法从主模块中加载应用程序/应用程序一样,应用程序/应用程序模块也不能导入模型/游戏模块。

我真的不知道这可能是什么,正如我之前所说,我使用过 requirejs 并且没有遇到这个问题。

更新 2 如果我删除所有命名模块,我可以让它工作,

define([dependencies], function (dependencies) {});

效果很好 但是一旦我将其更改为命名模块,我就找不到它了

define("moduleA", ['subdir/moduleB'], function (moduleB) {
    console.log(moduleB); // >> undefined
});
define("subdir/moduleB", [dependencies], function (dependencies) { return 'B'; });

【问题讨论】:

  • 为什么在 require 语句中包含 jquery?我通常在应用程序文件中定义它,例如define(['jquery',], function($)
  • 好吧,我把它放在我的 main 中,因为 main 有一般需要配置,并启动应用程序,这就是为什么它包含 jquery 以在文档就绪状态下启动应用程序。
  • 很高兴你让它工作了,我真的很想看到解决方案,因为我经常使用 require.js。
  • 好吧,他们不鼓励您命名模块,这让我感到很奇怪,我认为这是一种自然的方式来创建您自己的命名空间,而不会将它与您喜欢的文件夹结构相关联。但我弄错了 :) 我只花了几个小时就弄清楚了,所以我很放心。

标签: requirejs


【解决方案1】:

已编辑

经过多次尝试,修复了上面的代码,并阅读了requirejs帮助页面,我发现了一个小段落,说最好不要使用命名模块,让优化器为你命名。

所以我决定删除所有模块名称

moduleA.js

define(['subdir/moduleB'], function (moduleB) {
    console.log(moduleB); // >> 'B'
});

子目录/moduleB.js

define([dependencies], function (dependencies) { return 'B'; });

这很好用... 不知道我是如何解决使用这些模块名称的,我认为最好为你的模块命名。

【讨论】:

  • 在您的文件和目录结构稳定之前,它在开发中很有用。
  • true 但是您是否不必检查整个模块列表才能删除它们?在大中型应用程序中似乎有点矫枉过正。我也在研究 mantriJs,只是因为我很好奇......还没有真正计划它的任何发展。虽然它使用命名空间而不是文件路径。
  • 希望当您的代码库开始达到那种大小时,您的目录结构已经足够稳定,无需保证。
猜你喜欢
  • 2015-01-02
  • 2015-08-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2014-10-05
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多