【发布时间】:2012-12-18 11:34:03
【问题描述】:
是already possible to convert commonjs modules to requirejs,但我还是想知道是否可以反过来。有没有办法将 requireJS 模块转换为 commonJS,而不是反之亦然?
【问题讨论】:
是already possible to convert commonjs modules to requirejs,但我还是想知道是否可以反过来。有没有办法将 requireJS 模块转换为 commonJS,而不是反之亦然?
【问题讨论】:
手动应该是可以的。
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 也是可能的。
【讨论】:
function1 相同的回调中声明吗?
define 函数?是写成define('module', function(){});,还是需要写成define('module', [], function(){});?
是的,这是可能的。包括 Sound Cloud 在内的许多网站都开发了自己的转换工具。
Mozilla 开发了一个不错的小模块,称为 SweetJS。基本上允许您在 JavaScript 中定义宏。要在 Node.js 中使用,您需要使用它的二进制文件来实际使用宏,因为它在运行时不可用。
编辑:
Yehuda,Ember.js 的开发者之一has released a transpiler module.
它是用 Ruby 编写的,而不是 JavaScript,但也许有人会将它转换过来。尽管如此,您可以通过 fork 一个 ruby 进程在 Node.js 中使用它。
【讨论】:
是的,如果您使用 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 而无需样板。
【讨论】: