能否将 requirejs 模块转换成 commonjs?

9

现在已经可以将CommonJS模块转换为RequireJS模块,但我仍然想知道是否有可能做相反的事情。是否有任何方法可以将RequireJS模块转换为CommonJS模块,而不是相反?

3个回答

8
手动操作是可行的。
一个 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() {
     }
};

编辑: 转换 也是可能的。


实际上有可用的转换工具-请参见此问题的最新答案。 - Anderson Green
以上的 require.js 示例如果有多个函数会是什么样子?其他函数会在与 function1 相同的回调函数中声明吗? - Anderson Green
如果您使用对象,可以返回多个函数,就像我在答案中添加的那样。 - asgoth
另外,如果该模块不需要任何其他模块,define函数应该如何调用?它应该写成 define('module', function(){}); 还是需要写成 define('module', [], function(){}); - Anderson Green
1
define('module', function(){}); 或者更简短的形式:define(function(){}); - asgoth
也许可以简单地为一个 requireJS 模块创建一个 CommonJS 包装器(使用 node.js 加载器来加载 requirejs)。http://requirejs.org/docs/node.html#3 - Anderson Green

6

如果您使用我写的特定于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而无需编写样板代码。


干得好,不过具体的 AMD-to-commonsjs 转换没有在那里记录。你能否创建一个使用 urequire 的示例,关于如何执行 AMD-to-commonsjs 转换呢?因为这是被要求的。谢谢! - cancerbero

3

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

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

http://sweetjs.org/

编辑:

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

这个模块是用Ruby编写的,而不是JavaScript,但或许会有人转换它。无论如何,你可以通过fork一个ruby进程在Node.js中使用它。


SoundCloud的转换工具是公开可用的吗? - Anderson Green
@AndersonGreen 我不知道,但是他们的开发博客上有很多人要求他们开源。他们使用了与UglifyJS库不同的方法来操作AST。 - Daniel
此外,SweetJS页面并没有特别提到requireJS。是否有其他相关信息可用? - Anderson Green
@AndersonGreen 没错。它只提到了宏。你需要为模块系统转换构建自己的宏。类宏可以帮助你入门。我正在构建我的模块转换宏,所以我会看看我是否还有它们。 - Daniel
@AndersonGreen 添加了一个模块,可以转换/转译模块格式。 - Daniel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接