【问题标题】:How to use CommonJS and AMD side by side in node.js如何在 node.js 中并排使用 CommonJS 和 AMD
【发布时间】:2013-08-08 04:56:20
【问题描述】:

一个多星期以来,我一直在研究 CommonJs、A​​MD、模块加载和相关问题。我觉得外面没有什么能满足我的需要。我的基本需求是在前端和后端之间无缝共享代码。围绕此存在各种问题,包括客户端的模块格式、脚本加载和模块格式转换/包装。我最近一直在努力解决的问题是如何在 node.js 中同时使用 CommonJS 和 AMD(或类似 AMD 的东西)。

你无法摆脱 node.js 中的 commonJs,所以我的想法是,如果我想使用 AMD,它必须与 commonJs 一起工作。我可以使用哪些工具、库或技术来获得类似 AMD 的工作?

例如,我希望能够编写这样的模块:

var x = require('x')

modules.exports = function(a, callback) {
  if(a) {
     require(['y','z'], function(y,z) {
       callback(x, y.o + z.k)
     }
  } else {
    callback(x, "ok")
  }
}

理想情况下:

  • node.js 和类似 amd 的模块都将具有以 node.js 方式解释的路径(注意 node_modules,除非模块路径以“/”、“./”或“../”开头)
  • 在构建步骤中不需要对服务器端进行源代码转换(即模块将在 node.js 中运行,而每个模块都不需要以编程方式转换)
  • modulerequire 不需要显式传递到类似 amd 的 require 函数中

【问题讨论】:

    标签: javascript node.js amd commonjs


    【解决方案1】:

    您可以查看,http://dojotoolkit.org/documentation/tutorials/1.9/node/ 我只玩过一点,但已经尝试过。我让它与 node-orm 一起工作,并记住这很痛苦,但可能只是我在玩它时弄得一团糟。

    基本上你最终会在服务器上使用 AMD,例如:

    require(["dojo/node!orm","other/amd/module"], function(orm){
        //use third party commonjs module and your own amd modules here
    }
    

    您似乎已经研究了 Requirejs 的建议,即将 commonjs 模块包装在 AMD 需求中(在构建过程中自动使用 r.js)。

    【讨论】:

    • 是的,我已经检查了 r.js,但试图弄清楚如何让它在 node.js 生态系统中真正发挥作用有点费解。
    • uRequire 看起来很有帮助
    【解决方案2】:

    uRequire 是满足此要求的完美工具,它完全涉及模块格式之间的互操作性及其不兼容性。

    本质上 uRequire 将模块从 nodejs 转换或转换为 AMD,反之亦然,再加上在 nodejs 和浏览器上运行的 UMD 格式或不需要浏览器上的 AMD 加载程序的组合 .is。

    虽然它需要一个构建步骤,但与产品相比,这是一个小问题。

    【讨论】:

    • 我查看了 uRequire,但 UMD 格式对我来说似乎相当臃肿。每个模块都有相同的样板。它当然很有用,但不是我正在寻找的理想解决方案。 +1 提及 tho
    • uRequire 的 UMD 添加了必要的样板,但它是机器生成的,因此您不必自己添加,这很痛苦。它也主要用于跨运行时开发和调试。部署时,您将使用 r.js 优化或 uRequire 的“组合”模板,将所有文件构建为一个(添加最少的 bolierplate)。您也可以尝试删除“urequire”依赖的“UMDplain”模板,甚至是普通的“AMD”或“nodejs”模板。
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2014-01-14
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多