【问题标题】:Is it possible to convert requirejs modules to commonjs?是否可以将requirejs模块转换为commonjs?
【发布时间】:2012-12-18 11:34:03
【问题描述】:

already possible to convert commonjs modules to requirejs,但我还是想知道是否可以反过来。有没有办法将 requireJS 模块转换为 commonJS,而不是反之亦然?

【问题讨论】:

    标签: requirejs commonjs


    【解决方案1】:

    手动应该是可以的。

    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 也是可能的。

    【讨论】:

    • 实际上有可用的转换工具 - 请参阅此问题的最新答案。
    • 上面的 require.js 示例使用多个函数会是什么样子?其他函数会在与function1 相同的回调中声明吗?
    • 如果你使用一个对象,你可以返回多个函数,正如我在答案中添加的那样。
    • 另外,如果模块不需要任何其他模块,如何调用define 函数?是写成define('module', function(){});,还是需要写成define('module', [], function(){});
    • define('module', function(){});甚至更短:define(function(){});
    【解决方案2】:

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

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

    http://sweetjs.org/

    编辑:

    Yehuda,Ember.js 的开发者之一has released a transpiler module.

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

    【讨论】:

    • SoundCloud 的转换工具是公开的吗?
    • @AndersonGreen 虽然我不知道,但他们开发博客上的很多人都要求它,所以他们可能会开源它。他们对 UglifyJS 库使用了不同的方法来操作 AST。
    • 另外,SweetJS 的页面并没有特别提到 requireJS。是否有任何进一步的相关信息?
    • @AndersonGreen 没错。它只提到宏。您必须为模块系统转换构建自己的宏。类宏可以帮助您入门。我正在构建我的模块转换宏,所以我看看我是否还有它们。
    • 祝你好运找到宏 - 这听起来真的很有用。 :)
    【解决方案3】:

    是的,如果您使用 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 而无需样板。

    【讨论】:

    • 干得好,但是那里没有记录具体的 AMD 到 commonsjs 的转换。您能否使用 urequire 创建一个关于执行 AMD-to-commonsjs 的示例,因为这是所要求的?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2013-11-13
    • 2017-10-27
    • 2015-04-22
    • 2017-07-26
    • 2011-05-08
    相关资源
    最近更新 更多