我在NPM和Bower上发布了一个简单的CommonJS模块,基本上如下所示:
function Foo(){}
module.exports = new Foo();现在,转换为AMD格式的最简单方法就是发布第二个版本,与AMD兼容,如下所示:
define(function (require, exports, module) {
function Foo(){}
module.exports = new Foo();
});但是,我认为有一种方法可以使用CommonJS模块使用requirejs.config,如下所示:
requirejs.config({
paths:{
'foo':'assets/vendor/foo'
},
shim:{
'foo' :{
exports: 'Foo'
}
}
});但这似乎行不通。我认为垫片工具做了我上面为你做的包装,但我不完全确定。
发布于 2015-06-24 10:55:38
问题
shim不能做你想做的那么多。当RequireJS计算您在exports中给出的符号时,它会在全局空间中计算它。因此,如果您可以访问要从全局空间导出的变量,那么使用exports可以工作得很好。如果库foo将Foo导出到全局空间,则工作正常。
您要做的是让一个模块通过module与shim一起导出其API。这不能工作,因为RequireJS无法猜测正在加载的模块需要全局module对象已经对正在加载的模块可用。在最简单的情况下,加载这样的模块将导致ReferenceError,因为module不存在。有一些方法可以在最简单的情况下伪造module.exports,但它并不是一个通用的解决方案。
解决方案
您可以使用r.js将以CommonJS格式编写的文件转换为RequireJS所需的文件。是记录在这里。文件给出了以下简要说明:
node r.js -convert path/to/commonjs/modules/ path/to/output您还应该阅读自述文件的这部分,以获得一些注意事项。
https://stackoverflow.com/questions/31011539
复制相似问题