我在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'
}
}
});
但这似乎不起作用。我认为垫片工具为我做了上面的包装,但我不完全确定。
答案 0 :(得分:2)
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以获取一些警告。