我该如何编写我的定义来使用curl.js?

时间:2013-03-04 22:28:57

标签: javascript amd curl.js

我正在阅读有关编写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;
  }
);

我取消了对foobar的依赖关系。只需要一个记录到控制台的简单对象。

所以我将其保存在/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 
    ... 

装载时没有任何问题。

3 个答案:

答案 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”的内容移动到内联代码中,您必须“命名”定义。但是,这是另一个故事。