已经可以将 commonjs 模块转换为 requirejs,但我仍然想知道是否可以反过来。有什么方法可以将 requireJS 模块转换为 commonJS,而不是反之亦然?
3 回答
手动应该可以的。
一个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() {
}
};
编辑: 转换也是可能的。
是的,如果您使用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。
是的,有可能。包括 Sound Cloud 在内的许多网站都开发了自己的转换工具。
Mozilla 开发了一个不错的小模块,称为 SweetJS。基本上允许您在 JavaScript 中定义宏。要在 Node.js 中使用,您需要使用它的二进制文件来实际使用宏,因为它在运行时不可用。
编辑:
Ember.js 的开发者之一 Yehuda发布了一个转译器模块。
它是用 Ruby 编写的,而不是 JavaScript,但也许有人会将它转换过来。尽管如此,您可以通过 fork 一个 ruby 进程在 Node.js 中使用它。