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

And*_*een 8 commonjs requirejs

已经可以CommonJS的模块转换成requirejs,但我还是想知道是否有可能做反向.有没有办法将requireJS模块转换为commonJS,而不是相反?

Ang*_*las 6

它是可能的,如果你使用uRequire,一个工具,我专门针对JavaScript的模块格式转换写道- AMD/Requirejs - > CommonJS的/的NodeJS和背面(加上更多).

它似乎是一个简单的AST操作和依赖解析@start,但模块格式在许多方面与语法不兼容:

  • 依赖性/路径分辨率:CommonJS的使用fileRelative(例如"../PersonModel"),而AMD也可以使用包相对(例如,'型号/ PersonModel’)

  • 执行环境:CommonJS的模块同步加载,而AMD是异步加载(AMD也具有异步require版本require(['dep1', dep2'], function(dep1, dep2){})作为其主要针对用于浏览器).

这些也是其他差异(例如AMD加载程序插件),但一般来说,针对每一个"锁定"您的格式..

uRequire使您能够在AMD还是CommonJS的创作,并转换为其它容易(或转换为UMD),从而享受模块化的Javascript没有样板.


asg*_*oth 5

手动,它应该是可能的.

一个require.js模块的样子:

define('module', ['dep1', 'dep2'], function(dep1, dep2) {
   return myFunction = function() {
   };

});
Run Code Online (Sandbox Code Playgroud)

导出到CommonJs模块不应该太难:

var dep1 = require('dep1');
var dep2 = require('dep1');

exports.myFunction = function() {
};
Run Code Online (Sandbox Code Playgroud)

您不必返回函数,它也可以是一个对象:

define('module', ['dep1', 'dep2'], function(dep1, dep2) {
   return {
     myFunction1: function() {
     },
     myFunction2: function() {
     }
   };

});
Run Code Online (Sandbox Code Playgroud)

...

var dep1 = require('dep1');
var dep2 = require('dep1');

exports.myObject = {
     myFunction1: function() {
     },
     myFunction2: function() {
     }
};
Run Code Online (Sandbox Code Playgroud)

编辑: 转换也是可能的.


Dan*_*iel 3

对的,这是可能的。包括 Sound Cloud 在内的许多网站都开发了自己的转换工具。

Mozilla 开发了一个漂亮的小模块,称为 SweetJS。基本上允许您在 JavaScript 中定义宏。要在 Node.js 中使用,您需要使用它的二进制文件来实际使用宏,因为它在运行时不可用。

http://sweetjs.org/

编辑:

Ember.js 的开发者之一 Yehuda发布了一个转译器模块。

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