为什么不使用AND的相对导入在requirejs中工作?

时间:2014-05-28 07:23:49

标签: 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([], 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论坛上看过一些不起眼的帖子,说这是“按预期工作”,因为“导入是名称,它们不是相对路径”。 ......并且你应该使用'map'功能来解决这个问题。

...

右键!好吧,我不会深入了解这种行为是多么明显,或者https://groups.google.com/forum/#!searchin/requirejs/relative/requirejs/Zmh7EV5fR2M/4OM-ss5g3DEJ之类的线程有多么无益;让我们谈谈。

你应该如何使这项工作?

显然,如果你使用bower导入任意模块,并且它位于js / lib / obscure.js / dist / obscure.js,你需要设置你的配置:

require.config({
    paths: {
        obscure: 'lib/obscure.js/dist/obscure'
    }
});

...但这似乎意味着所有'amd importable'模块最终会被一个简单文件大量合并,其中包含 all 模块。

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

似乎非常奇怪。

再一次, 你应该如何在非平凡的情况下使这项工作?

编辑:

当然,你说,你做错了,只是没告诉我们你正在做的所有事情。好吧,亲自看看。现在github:https://github.com/shadowmint/requirejs-example

上有一个不起作用的确切副本

1 个答案:

答案 0 :(得分:1)

相对进口确实有效。

您的代码存在的问题是您将模块名称与.js扩展名一起列出。您永远不应该使用.js扩展名指定模块名称。如果你确实放了扩展名,你实际上是在告诉RequireJS“我已经知道我想要的模块位于我给你的路径的末尾;不要乱用这条路径”所以你的RequireJS配置不会影响你在依赖关系中放置的路径如何解决。