【问题标题】:Converting CommonJS to AMD将 CommonJS 转换为 AMD
【发布时间】:2015-06-23 19:14:38
【问题描述】:

我在 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 工具完成了我在上面为您所做的包装,但我不完全确定。

【问题讨论】:

    标签: node.js requirejs amd commonjs


    【解决方案1】:

    问题

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

    您要做的是让一个模块通过module 导出其API 与shim 一起工作。这是行不通的,因为 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 以了解一些注意事项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 2012-11-20
      • 2017-11-25
      • 2018-04-04
      相关资源
      最近更新 更多