将CommonJS转换为AMD

我在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给出的符号时,它将在全局空间中进行评估。 因此,如果您可以访问要从全局空间导出的variables,则使用exports效果会很好。 如果库fooFoo到全局空间,那工作正常。

你正在做的是有一个模块,通过module工作与shim出口其API。 这是行不通的,因为RequireJS无法猜测被加载的模块要求全局module对象已经被加载的模块可用。 在最简单的情况下,加载这样的模块会导致ReferenceError因为module不存在。 将有办法伪造module.exports东西,将在最微不足道的情况下工作,但它不会作为一个通用的解决scheme。

一个办法

您可以使用r.js CommonJS格式编写的文件转换为RequireJS需要的文件。 这里logging在案 。 文档给出了以下简介:

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

您还应该阅读README的这部分内容以了解一些注意事项。