使用RequireJS我正在构建一个广泛使用小部件的应用程序。对于每个小部件,我至少有3个单独的文件:
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
上面的日志来自于我只使用define语句中的模块列表中的currentfolder!view从controller.js加载view.js的测试。由于我只请求当前文件夹!查看一次,我很困惑为什么我都看到了当前文件夹!view_unnormalized2和currentfolder!在邮件中查看。
知道为什么会发生这种情况?
答案 0 :(得分:1)
我的回答可能无法解答您的主要问题,但它可以帮助您实现您尝试使用插件进行的操作。
事实上,在使用CommonJS样式时,Require.js支持需要模块的相对路径。像这样:
define(function( require, exports, module ) {
var relativeModule = require("./subfolder/module");
module.exports = function() {
console.log( relativeModule );
};
});