这是already possible to convert commonjs modules to requirejs,但我仍然想知道是否可以反过来。有没有办法将requireJS模块转换为commonJS,而不是相反?
答案 0 :(得分:6)
是的,如果您使用uRequire,我专门为javascript模块格式转换编写的工具 - AMD / Requirejs - > commonjs / nodejs 和返回(加上更多)。
这似乎是一个微不足道的AST操纵&依赖关系解析@start,但模块格式不兼容在很多方面除了语法之外:
依赖/路径解析:commonjs使用fileRelative(例如 '../PersonModel')而AMD也可以使用包相对(例如 'Models / PersonModel')
执行环境:commonJs模块同步加载,而AMD是异步加载的(AMD也有异步require
版本require(['dep1', dep2'], function(dep1, dep2){})
作为其目标主要用于浏览器)。
这些也是其他差异(例如AMD加载程序插件),但一般来说,针对每个人以这种格式“锁定”你。
uRequire使您能够在AMD或commonJS中创作并轻松转换为其他(或转换为UMD),因此享受模块化Javascript而无需样板。
答案 1 :(得分:5)
手动,它应该是可能的。
require.js 模块如下所示:
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() {
}
};
修改: converting也是可能的。
答案 2 :(得分:3)
是的,有可能。包括Sound Cloud在内的许多网站都开发了自己的转换工具。
Mozilla开发了一个名为SweetJS的小模块。基本上允许您在JavaScript中定义宏。要在Node.js中使用,您需要使用它的二进制文件来实际使用宏,因为它在运行时不可用。
修改强>
Yehuda,Ember.js has released a transpiler module.
的开发人员之一它是用Ruby编写的,而不是JavaScript,但也许有人会将其转换过来。尽管如此,您可以通过分配ruby进程在Node.js中使用它。