是否可以将requirejs模块转换为commonjs?

时间:2013-01-04 02:16:25

标签: requirejs commonjs

这是already possible to convert commonjs modules to requirejs,但我仍然想知道是否可以反过来。有没有办法将requireJS模块转换为commonJS,而不是相反?

3 个答案:

答案 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中使用,您需要使用它的二进制文件来实际使用宏,因为它在运行时不可用。

http://sweetjs.org/

修改

Yehuda,Ember.js has released a transpiler module.

的开发人员之一

它是用Ruby编写的,而不是JavaScript,但也许有人会将其转换过来。尽管如此,您可以通过分配ruby进程在Node.js中使用它。