因此,如果您有一个文件夹:
- 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论坛上读了一些晦涩的帖子,说这是“按预期工作”,因为“导入是名称,它们不是相对路径”。...并且您应该使用“地图”功能解决此问题。
...
正确的!好吧,我不会介绍这种行为有多明显,或者像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可导入”模块最终都是其中一个包含所有模块的简单文件的大量合并。
使用baseUrl并不是解决方案,因为如上所述,您希望将javascript的多个孤立的“岛”作为模块安装,其中1)需要互相引用,但2)还需要能够引用自己的内部,相对模块。
似乎异常怪异。
再次,如何是你应该做的不平凡的情况下,这个工作?
编辑:
当然,您说的是,您做错了,只是没有告诉我们您正在做的所有事情。好吧,自己看看。github上的错误副本现在在这里:https : //github.com/shadowmint/requirejs-example
相对进口确实有效。
代码的问题是您列出了模块名称以及.js
扩展名。您永远不要指定带有.js
扩展名的模块名称。如果您确实进行了扩展,则实际上是在告诉RequireJS“我已经知道我想要的模块在我给您的路径的末尾;不要与该路径混淆”,因此您的RequireJS配置不会影响放置在依赖项中的路径的解析方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句