繁体   English   中英

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

[英]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;
  }
);

我取出了对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 
    ... 

而且加载也没有任何麻烦。

您要求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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM