Javascript 为什么不';AMD的相关导入是否在requirejs中工作?

Javascript 为什么不';AMD的相关导入是否在requirejs中工作?,javascript,requirejs,Javascript,Requirejs,因此,如果您有一个文件夹: - demo/js/foo/foo.js - demo/js/foo/bar/a.js - demo/js/foo/bar/b.js 然后将AMD模块定义为: foo.js: define(['./bar/a.js', './bar/b.js'], function(a, b) { console.log(a, b); }); a.js: define([], function() { return {a:'a'}; }); b.js: define([], fun

因此,如果您有一个文件夹:

- demo/js/foo/foo.js
- demo/js/foo/bar/a.js
- demo/js/foo/bar/b.js
然后将AMD模块定义为:

foo.js: define(['./bar/a.js', './bar/b.js'], function(a, b) { console.log(a, b); });
a.js: define([], function() { return {a:'a'}; });
b.js: define([], function() { return {b:'b'}; });
然后,如果像这样导入模块:

require(['./foo/foo'], function() { ... }
给出:

"NetworkError: 404 Not Found - http://localhost:3005/demo/foo/bar/a.js"
"NetworkError: 404 Not Found - http://localhost:3005/demo/foo/bar/b.js"
Error: Script error for: foo/bar/a.js http://requirejs.org/docs/errors.html#scripterror
Error: Script error for: foo/bar/b.js http://requirejs.org/docs/errors.html#scripterror
为什么这样不行

我在requirejs论坛上读到一些晦涩难懂的帖子,说这是“按预期工作”,因为“导入是名称,它们不是相对路径”。。。您应该使用“映射”功能解决此问题

对!!好吧,我不想说这种行为有多么明显,或者像这样的线程有多么毫无用处;让我们开门见山吧

你该怎么做

显然,如果您使用bower导入任意模块,并且该模块位于js/lib/awerse.js/dist/awerse.js中,则需要设置配置:

require.config({
    paths: {
        obscure: 'lib/obscure.js/dist/obscure'
    }
});
…但这似乎意味着所有“amd importable”模块最终都是一个简单文件与其中所有模块的大规模合并

使用baseUrl不是一个解决方案,因为如上所述,您希望有多个独立的javascript“孤岛”,它们作为模块安装,1)需要相互引用,但2)还需要能够引用它们自己的内部相对模块

看起来非常奇怪

再说一次,在这种非琐碎的情况下,你应该如何让它工作

编辑:


你肯定会说,你做错了,只是没有告诉我们你所做的一切。好吧,你自己看看。github上现在有一个不起作用的确切副本:

相对导入确实起作用


代码的问题在于,您将模块名称与扩展名
.js
一起列出。永远不要使用扩展名
.js
指定模块名。如果您确实放置了扩展,那么您实际上是在告诉RequireJS“我已经知道我想要的模块位于我提供给您的路径的末尾;不要弄乱这个路径”,这样您的RequireJS配置就不会影响您放置在依赖项中的路径的解析方式。

您是否在require.config中添加了baseUrl:“/path/to/js”?在您的例子中,baseUrl:'demo/js/foo/',然后包括define(['bar/a.js','bar/b.js'],f(){})等模块,这些模块将只对foo有效;显然,如果你有更多的模块,这是没有用的。我认为这意味着define([path,path])中的路径不是文件路径,而是有自己的规则集。它们是自己的“语言”。你应该看看Browserify:与RequireJS不同,它的
require
是基于文件系统路径的,而且它往往可以正常工作。据我所知,这没有什么区别。这里,我在网上给出了一个我正在做的事情的确切示例,包括您建议的更改:在您的示例中,您将依赖项列为
bar/a
bar/b
。当然,它不会起作用,因为您已删除了首字母
/
。解析相对路径并不等同于“将此路径弄乱”。这只是解析路径,就像一个人用来请求资源的所有URL一样。好了,我也推动了这个更改,但它仍然不起作用。在你的问题中,你的
foo
模块中有
define
,这是绝对正确的。在回购协议中,您已将其更改为
require
call。我第一次看你的回购协议时就错过了,但那不行。