所以,如果你有一个文件夹:
- 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
上有一个不起作用的确切副本答案 0 :(得分:1)
相对进口确实有效。
您的代码存在的问题是您将模块名称与.js
扩展名一起列出。您永远不应该使用.js
扩展名指定模块名称。如果你确实放了扩展名,你实际上是在告诉RequireJS“我已经知道我想要的模块位于我给你的路径的末尾;不要乱用这条路径”所以你的RequireJS配置不会影响你在依赖关系中放置的路径如何解决。