2

使用 RequireJS 我正在构建一个广泛使用小部件的应用程序。对于每个小部件,我至少有 3 个单独的文件:

  • request.js 包含用于设置请求/响应处理程序以在我的应用程序的另一部分请求小部件的代码
  • controller.js 包含模型和视图之间的处理
  • view.js 包含用户和控制器之间的处理

request.js 中的模块定义:

define(['common/view/widget/entity/term/list/table/controller'],
function(WidgetController) { ... });

controller.js 中的模块定义:

define(['common/view/widget/entity/term/list/table/view'],
function(WidgetView) { ... });

view.js 的模块定义是:

define(['module','require'],function(module,require) {

'use strict';

var WidgetView = <constructor definition>;

    return WidgetView;
});

在我开发的小部件的情况下,我有很多上述的小情况。我不喜欢的是每次当一个模块需要另一个模块并且两者都位于同一个文件夹中时使用完整路径。我想简单地指定如下(假设我们有一个 RequireJS 插件可以为我们解决这个问题):

define(['currentfolder!controller'],
function(WidgetController) { ... });

为此,我编写了一个小插件,因为我在网上找不到它:

define({
    load: function (name, parentRequire, onload, config) {

        var path = parentRequire.toUrl('.').substring(config.baseUrl.length) + '/' + name;

        parentRequire([path], function (value) {
            onload(value);
        });
    }
});

您可能会注意到,它的基本形式看起来像 RequireJS 插件文档的示例。

现在在某些情况下,上述工作正常(例如从 request.js 到 controller.js),但在其他情况下会发生加载超时(从 controller.js 到 view.js)。当我查看生成的路径时,都是正确的 RequireJS 路径。查看加载超时,记录以下内容:

Timestamp: 13-09-13 17:27:10
Error: Error: Load timeout for modules: currentfolder!view_unnormalized2,currentfolder!view
http://requirejs.org/docs/errors.html#timeout
Source File: http://localhost/app/vendor/requirejs/require.js?msv15z
Line: 159

上面的日志来自我所做的一个测试,我只使用定义语句中模块列表中的 currentfolder!view 从 controller.js 加载 view.js。由于我只请求了一次 currentfolder!view,我很困惑为什么我在消息中都看到 currentfolder!view_unnormalized2 和 currentfolder!view。

关于为什么会发生这种情况的任何想法?

4

1 回答 1

1

我的回答可能无法回答你的主要问题,但它会帮助你实现你想要用你的插件做的事情。

事实上,Require.js 在使用 CommonJS 样式时支持需要模块的相对路径。像这样:

define(function( require, exports, module ) {
  var relativeModule = require("./subfolder/module");

  module.exports = function() {
    console.log( relativeModule );
  };
});
于 2013-09-13T17:59:55.227 回答