如何在node.js中同时使用CommonJS和AMD?

5
我已经研究了CommonJs、AMD、模块加载和相关问题一个多星期。我感觉似乎没有一样东西可以满足我的需求。我的基本需求是在前端和后端之间无缝共享代码。这方面有各种问题,包括客户端的模块格式、脚本加载和模块格式转换/包装等。我最近一直在苦恼的是如何在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函数中
2个回答

2
uRequire是满足此需求的完美工具,它关注的是模块格式之间的互操作性及其不兼容性。
基本上,uRequire可以将模块从nodejs转换或翻译为AMD格式,反之亦然,还支持UMD格式,在nodejs和浏览器上都能运行,或者在浏览器上无需AMD加载器的合并.is格式。
虽然需要构建步骤,但与其提供的功能相比,这只是一个小问题。

我看了一下uRequire,但UMD格式对我来说似乎有些臃肿。每个模块都会有相同的样板代码。它确实很有用,但不是我正在寻找的理想解决方案。感谢提到它。 - B T
uRequire的UMD添加了必要的样板代码,但它是机器生成的,因此您不必自己添加,这相当痛苦。它主要用于跨运行时开发和调试。在部署时,您可以使用r.js优化或uRequire的“combined”模板将所有文件构建为一个文件(带有最少的样板代码)。此外,您还可以尝试“UMDplain”模板,该模板删除了“urequire”依赖项,甚至可以使用普通的“AMD”或“nodejs”模板。 - Angelos Pikoulas

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 require中(很可能是在构建过程中自动使用r.js)。


1
是的,我已经查看了r.js,但是在尝试弄清楚如何在node.js生态系统中真正使其工作方面,它有点令人费解。 - B T
uRequire看起来像是一样能够帮助很多的东西。 - B T

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