9

已经可以将 commonjs 模块转换为 requirejs,但我仍然想知道是否可以反过来。有什么方法可以将 requireJS 模块转换为 commonJS,而不是反之亦然?

4

3 回答 3

7

手动应该可以的。

一个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() {
     }
};

编辑: 转换也是可能的。

于 2013-01-04T13:16:12.403 回答
6

是的,如果您使用uRequire是可能的,这是我专门为 javascript 模块格式转换编写的工具 - AMD/Requirejs --> commonjs/nodejs并返回(加上更多)。

这似乎是一个微不足道的 AST 操作和依赖关系解析@start,但除了语法之外,模块格式在许多方面都不兼容:

  • 依赖/路径解析:commonjs 使用 fileRelative(例如 '../PersonModel'),而 AMD 也可以使用 package-relative(例如 'Models/PersonModel')

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

这些也是其他差异(例如 AMD 加载程序插件),但一般来说,每个人都以这种格式“锁定”你。.

uRequire 使您能够在 AMD 或 commonJS 中编写并轻松转换为其他(或转换为 UMD),因此无需样板即可享受模块化 Javascript。

于 2013-06-30T21:46:50.793 回答
3

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

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

http://sweetjs.org/

编辑:

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

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

于 2013-01-04T13:23:33.050 回答