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

Javascript RequireJS require()无法在同一子目录级别解析文件名,javascript,requirejs,require,base-url,Javascript,Requirejs,Require,Base Url,我有这样一个目录结构: app/ ├ js/ │ ├ gui/ │ │ ├ main.js │ │ └ santa.js │ └ app.js └ index.html <- includes requirejs and starts js/app.js 到目前为止还不错。但是main.js中的每个相同目录require()都会产生问题: main.js: require('santa') 尝试require()app/js/santa.js,但它不存在 require('./sant

我有这样一个目录结构:

app/
├ js/
│ ├ gui/
│ │ ├ main.js
│ │ └ santa.js
│ └ app.js
└ index.html <- includes requirejs and starts js/app.js
到目前为止还不错。但是
main.js
中的每个相同目录
require()
都会产生问题:

main.js

require('santa')
尝试
require()
app/js/santa.js,但它不存在

require('./santa')
require('gui/santa')
require('./gui/santa')
尝试
require()
app/js/santa.js,但它不存在

require('./santa')
require('gui/santa')
require('./gui/santa')
尝试
require()
app/js/gui/gui/santa.js,但它不存在

require('./santa')
require('gui/santa')
require('./gui/santa')
尝试
require()
app/js/gui/gui/santa.js,但它不存在

我似乎只有这样才能将我的文件包括在内:

require('js/gui/santa.js')
define('folder/main',
        [ "jquery", './AnotherModule' ],
        function($, AnotherModule) {});
哪种类型会破坏名称解析的目的和
baseUrl
设置


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

requirejs.config({
    baseUrl     : 'js/layout'
});
main.js
中,新设置似乎被忽略了,就像政客们忽略了他们自己的承诺一样。

你试过使用吗

Define可以这样调用:

require('js/gui/santa.js')
define('folder/main',
        [ "jquery", './AnotherModule' ],
        function($, AnotherModule) {});
第一个参数是模块名-模块的显式路径。通常,您不会包含第一个参数-define()总是隐式地指定路径,通常使用显式路径是不正确的

另一方面,Require不接受name参数。不可能只使用require()而不使用define()创建相对于源文件的路径,因为require不会“创建”模块或定义命名空间。任何require()'d相对于根都是必需的

当您在define()中包含相对依赖项(如“./AnotherModule”)时,它是相对于模块名找到的。在上述情况下,./AnotherModule将解析为文件夹/AnotherModule

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


在您的案例中,这将解释
require('santa')
require('./santa')
的行为。我唯一的猜测是,既然gui包含一个子目录,它的处理方式就不一样了。尝试使用
require('strange-new-directory/santa')
查看您是否可以对这种情况有更多的了解



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

奇怪。您确定将
require('./santa')
放在您的
gui/main.js
中,而不是放在
app.js
中吗?它应该可以正常工作IIRC。在
main.js
中,将
require
尝试的次数从1到5进行编号,如果出现1和2,则3和4是不可能的,除非您向RequireJS传递一个配置,该配置会破坏其路径解析逻辑。(3应该解析为与1相同,但在路径中添加了一个
gui/
元素。4应该解析为与2相同,但添加了相同的元素。)好吧,我不这么认为,所以
RequireJS
中一定有错误。打开了。您需要如何处理不同子目录级别的文件名?当我请求时,它会将子目录添加到路径中两次。请参阅上面的app/js/gui/gui/santa.js示例。如果我能将两者互换,那么我对
requirejs
的理解就不正确或不完整。我
需要的东西是
定义自己的模块。据我所知,这就是它是如何完成的,如果语义被认为是指示正确用法的话,它应该是这样工作的。或者你说的是某种技巧/黑客?require和define之间的区别与它们如何指定确定路径有关。我将在这里详细说明,但链接的SO问题有必要的信息。