我在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
可以很好地工作。如果库foo
将Foo
导出到全局空间,则可以正常工作。
您要尝试做的是拥有一个模块,该模块通过module
与shim
一起导出其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/