将CommonJS转换为AMD

时间:2015-06-23 19:14:38

标签: node.js requirejs amd commonjs

我在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'
      }
   }
});

但这似乎不起作用。我认为垫片工具为我做了上面的包装,但我不完全确定。

1 个答案:

答案 0 :(得分:2)

问题

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以获取一些警告。