将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
效果会很好。 如果库foo
将Foo
到全局空间,那工作正常。
你正在做的是有一个模块,通过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的这部分内容以了解一些注意事项。