现在已经可以将CommonJS模块转换为RequireJS模块,但我仍然想知道是否有可能做相反的事情。是否有任何方法可以将RequireJS模块转换为CommonJS模块,而不是相反?
define('module', ['dep1', 'dep2'], function(dep1, dep2) {
return myFunction = function() {
};
});
导出为 CommonJs 模块 不应该太难:
var dep1 = require('dep1');
var dep2 = require('dep1');
exports.myFunction = function() {
};
您不必返回一个函数,也可以是一个对象:
define('module', ['dep1', 'dep2'], function(dep1, dep2) {
return {
myFunction1: function() {
},
myFunction2: function() {
}
};
});
...
var dep1 = require('dep1');
var dep2 = require('dep1');
exports.myObject = {
myFunction1: function() {
},
myFunction2: function() {
}
};
编辑: 转换 也是可能的。
如果您使用我写的特定于javascript模块格式转换的工具uRequire,就可以实现这一点,它可以将AMD/Requirejs格式转换为commonjs/nodejs格式并进行反向转换(以及更多操作)。
起初看起来只是在开始时进行简单的AST操作和依赖项解析,但是模块格式在语法之外有许多不兼容之处:
依赖项/路径解析:commonjs使用文件相对路径(例如'../PersonModel'),而AMD还可以使用包相对路径(例如'Models/PersonModel')
执行环境:commonjs模块同步加载,而AMD异步加载(AMD还有异步require
版本require(['dep1', dep2'], function(dep1, dep2){})
,主要针对浏览器)。
还有其他差异(例如AMD加载程序插件),但总的来说,针对每种格式编写代码都会“锁定”您在该格式中。
uRequire使您能够轻松地在AMD或commonJS中编写代码并转换为另一种格式(或转换为UMD),从而享受模块化Javascript而无需编写样板代码。
是的,这是可能的。许多网站,包括Sound Cloud,都开发了自己的转换工具。
Mozilla开发了一个很好的小模块叫做SweetJS。基本上允许您在JavaScript中定义宏。要在Node.js中使用,您需要使用其二进制文件来实际使用宏,因为它不通过运行时可用。
编辑:
Ember.js的开发人员之一Yehuda发布了一个转译模块。
这个模块是用Ruby编写的,而不是JavaScript,但或许会有人转换它。无论如何,你可以通过fork一个ruby进程在Node.js中使用它。
function1
相同的回调函数中声明吗? - Anderson Greendefine
函数应该如何调用?它应该写成define('module', function(){});
还是需要写成define('module', [], function(){});
? - Anderson Green