我在NPM和Bower上发布了一个简单的CommonJS模块,基本上就像这样:

  function Foo(){}

    module.exports = new Foo();


现在,转换为AMD格式的最简单方法就是发布与AMD兼容的第二个版本,如下所示:

define(function (require, exports, module) {

    function Foo(){}

    module.exports = new Foo();

});


但是我认为有一种方法可以使用requirejs.config来填充CommonJS模块,如下所示:

requirejs.config({

   paths:{
    'foo':'assets/vendor/foo'
   },
   shim:{

     'foo' :{
       exports: 'Foo'
      }
   }
});


但这似乎不起作用。我认为匀速工具为您完成了我上面做的包装,但是我不确定。

最佳答案

问题

shim不能做您想做的事。当RequireJS评估您在exports中给出的符号时,它将在全局空间中对其进行评估。因此,如果可以访问要从全局空间导出的变量,则使用exports可以很好地工作。如果库fooFoo导出到全局空间,则可以正常工作。

您要尝试做的是拥有一个模块,该模块通过moduleshim一起导出其API。这无法正常工作,因为RequireJS无法猜测正在加载的模块要求全局module对象已可用于加载的模块。在最简单的情况下,加载此类模块将导致ReferenceError,因为module不存在。可以使用伪造module.exports的方法来伪装
在最琐碎的情况下可以使用,但不能用作一般解决方案。

一个办法

您可以使用r.js将以CommonJS格式编写的文件转换为RequireJS所需的文件。是documented here。该文档提供了以下概要:

node r.js -convert path/to/commonjs/modules/ path/to/output


您还应该阅读自述文件的this part以获得一些警告。

关于node.js - 将CommonJS转换为AMD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31011539/

10-09 15:29