RequireJS require()无法在同一子目录级别解析文件名

时间:2014-03-12 14:52:51

标签: javascript requirejs require base-url

我有一个像这样的目录结构:

app/
├ js/
│ ├ gui/
│ │ ├ main.js
│ │ └ santa.js
│ └ app.js
└ index.html <- includes requirejs and starts js/app.js

app.js

baseUrl: 'js' // Pseudo-code for requirejs.config() of course
require('gui/main');

到目前为止一切顺利。但是require()中的每个相同目标main.js都会出现问题:

main.js

require('santa')

尝试不存在的require() app / js / santa.js

require('./santa')

尝试不存在的require() app / js / santa.js

require('gui/santa')

尝试不存在的require() app / js / gui / gui / santa.js

require('./gui/santa')

尝试不存在的require() app / js / gui / gui / santa.js

wtf

我似乎将文件包含在内的唯一方法就是:

require('js/gui/santa.js')

哪种方式违背了名称解析和baseUrl设置的目的。


除了这种奇怪之外,我还希望将baseUrl更改为js/gui require() main.js。配置应该是可扩展和可覆盖的。但是当我这样做时:

requirejs.config({
    baseUrl     : 'js/layout'
});

main.js内,新的环境似乎被忽略了,就像政客们无视自己的承诺一样。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用define instead of require

定义可以像这样调用:

define('folder/main',
        [ "jquery", './AnotherModule' ],
        function($, AnotherModule) {});

第一个参数是模块名称 - 模块的显式路径。通常,您不会包含第一个参数 - define()始终隐式指定路径,并且通常使用显式路径为not recommended

另一方面,要求不带名称参数。仅使用require()&而不是define()来执行相对于源文件的路径是不可能的,因为require不会创建&#39;模块或定义命名空间。任何需要()的东西都需要相对于root

如果在define()中包含相对依赖项(例如&#39; ./ AnotherModule&#39;),则会找到相对于模块名称的相关依赖项。在上面的例子中,。/ OtherModule将解析为文件夹/ AnotherModule。

在对require()的调用中,没有模块名称。相对依赖关系被解析为根。


在您的情况下,这会考虑require('santa')require('./santa')的行为。我唯一的猜测是为什么gui不是以相同的方式行事,因为它包含一个子目录,所以它的处理方式不同。尝试使用require('strange-new-directory/santa')查看您是否可以获得有关情况的更多信息。


至于baseUrl重置,我相信baseUrl是一个全局特征,无法在中途重置(或者至少,我不建议这样做)。你应该能够使用define来获得相对路径。祝你好运。