如何在 node.js 中并排使用 CommonJS 和 AMD

B T*_*B T 5 javascript amd commonjs node.js

一个多星期以来,我一直在研究 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")
  }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下:

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

zcl*_*ark 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
}
Run Code Online (Sandbox Code Playgroud)

看起来您已经研究了 Requirejs 的建议,将 commonjs 模块包装在 AMD require 中(在构建期间自动最有可能使用 r.js)。