我正在阅读有关编写AMD模块的Addy Osmani's excellent blog post。我从一个简单的js开始,我从他的帖子中解脱出来:
define('modTest', [],
// module definition function
function () {
// return a value that defines the module export
// (i.e the functionality we want to expose for consumption)
// create your module here
var myModule = {
doStuff:function(){
console.log('Yay! Stuff');
}
}
return myModule;
}
);
我取消了对foo
和bar
的依赖关系。只需要一个记录到控制台的简单对象。
所以我将其保存在/js/modTest.js
中,然后尝试加载它:
curl(['/js/modTest.js'])
.then(function(mt) {
console.log("Load complete");
console.log("mt:");
console.log(mt);
mt.doStuff()
}, function(ex) {alert(ex.message);})
结果:错误:Multiple anonymous defines in URL
。好的,没有用。尝试添加名称空间:define('myCompany/modTest', [],
,结果相同。尝试在依赖项数组中添加一个空字符串,结果相同。
同样尝试curl(['modTest.js'], function(dep){console.log(dep)});
并获得相同的结果。
Addy的博客文章中的代码是否错误?难道我做错了什么?可能是卷曲中的一个错误?
更新5/24 :我放弃了curl.js,转而使用require.js。零奇怪的错误,很少改变的工作。我确实需要处理amdefine以使我的代码运行客户端和服务器端(一个对象在两个地方,所以grunt必须配置来处理它)。我的定义通常如下:
define(->
class AlphaBravo
...
装载时没有任何问题。
答案 0 :(得分:1)
您要求curl()获取名为“/js/modTest.js”的模块。它找到了文件并加载了它,发现了一个名为“modTest”的模块,所以它抱怨道。 :)(那个错误信息非常错误!)
以下是如何修复它(选择一个):
1)从define()中删除ID。不建议使用该ID。它通常仅用于AMD构建工具以及在测试工具内部声明模块时使用。
2)按照你在define()中给出的ID来引用模块。 (同样,在大多数情况下不建议使用ID。)
curl(['modTest'], doSomething);
3)使用应用程序的模块将包(或路径)映射到该文件夹。我不清楚你的例子是什么,因为modTest似乎是一个独立的模块。但是,如果您决定在“app”软件包下组织应用程序的文件,那么软件包配置可能如下所示:
packages: [ { name: 'app', location: 'app' } ]
然后,当您拥有依赖于modTest模块的代码时,您可以通过ID“app / modTest”来访问它。
curl(['app/modTest'], doSomething);
我希望这有助于澄清事情!
Fwiw,Addy的例子实际上可以使用正确的配置,但我没有看到该帖子中的任何配置(或者我的眼睛错过了它)。这样的事情可能有用:
packages: [ { name: 'app', location: '.' } ]
- 约翰
答案 1 :(得分:0)
我刚刚遇到类似的问题,结果是我用于其他库的包含顺序。我正在以传统方式(脚本中的脚本标签)将handlebars.js,crossroads.js,jquery和其他一些库加载到我的项目中,并发现当我首先放置curl.js时,我得到了这个错误,但是当我最后包含它时,我没有收到此错误。
我的头标记现在看起来像这样:
<script type="text/javascript" src="/js/lib/jquery.js"></script>
<script type="text/javascript" src="/js/lib/signals.js"></script>
<script type="text/javascript" src="/js/lib/crossroads.js"></script>
<script type="text/javascript" src="/js/lib/handlebars.js"></script>
<script type="text/javascript" src="/js/lib/curl.js"></script>
<script type="text/javascript" src="/js/main.js"></script>
答案 2 :(得分:0)
您的define
电话有问题。 NAMED
有关如何编写定义的完整故事,请参阅AMD spec,但这是我期望在js/modTest.js
文件中看到的内容:
define(/* this is where the difference is */ function () {
// return a value that defines the module export
// (i.e the functionality we want to expose for consumption)
// create your module here
var myModule = {
doStuff:function(){
console.log('Yay! Stuff');
}
}
return myModule;
}
);
现在,无聊的解释:
CurlJS太棒了。实际上,在处理了RequireJS和CurlJS之后,我会说CurlJS比一个类别中的RequireJS更棒 - 脚本执行顺序的可靠性。所以你走在正确的轨道上。
关于CurlJS的主要不同之处在于它使用“每个加载模块至少找到一个匿名定义,否则就是错误”逻辑。 RequireJS使用超时,它有效地忽略了在给定文件中没有定义任何内容的情况,但会在捕获的加载/解析错误时爆炸。
这种差异就是让你在这里的原因。 CurlJS期望每个加载的模块至少定义一个匿名(如未命名)。它仍然按预期处理命名定义。第二步是将“js / modTest.js”的内容移动到内联代码中,您必须“命名”定义。但是,这是另一个故事。