[英]how should I write my define to work with curl.js?
我正在阅读Addy Osmani关于撰写AMD模块的出色博客文章 。 我从他的帖子中摘录了一个简单的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
...
而且加载也没有任何麻烦。
您要求curl()获取名为“ /js/modTest.js”的模块。 它找到文件并加载它,并找到了一个名为“ modTest”的模块,因此它抱怨。 :)(但是,该错误消息非常错误!)
解决方法如下(选择一个):
1)从您的define()中删除ID。 不建议使用ID。 通常仅在AMD构建工具中以及在测试工具中声明模块时使用。
2)通过在define()中给它的ID来引用该模块。 (同样,在大多数情况下,不建议使用ID。)
curl(['modTest'], doSomething);
3)将包(或路径)映射到包含应用程序模块的文件夹。 我不清楚您的示例中会有什么,因为modTest似乎是一个独立的模块。 但是,如果您决定将应用程序的文件组织在“ app”软件包下,则您的config可能如下所示:
packages: [ { name: 'app', location: 'app' } ]
然后,当您有依赖于modTest模块的代码时,可以通过ID“ app / modTest”来获取它。
curl(['app/modTest'], doSomething);
我希望这有助于清理问题!
Fwiw,Addy的示例实际上可以使用正确的配置,但是我在那篇文章中没有看到任何配置(或者我没看过)。 这样的事情可能会起作用:
packages: [ { name: 'app', location: '.' } ]
- 约翰
我有一个类似的问题,原来是我在其他库中使用的包含顺序。 我以传统方式(在头中的脚本标签)将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>
您的define
调用有问题。 它被命名
有关如何编写定义的完整信息,请参见AMD规范 ,但这是我希望在js/modTest.js
文件中看到的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”的内容移动到内联代码中,您将不得不为定义“命名”。 但是,那是另一个故事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.