编写一个在nodejs和requirejs中都有效的模块

时间:2014-05-01 23:03:01

标签: node.js requirejs

我编写了一个目前在节点应用程序中运行的小解析器,但想知道是否有一种方法可以创建一个可以在NodeJS应用程序和使用requirejs的客户端应用程序中运行的模块?

path/to/lib/index.js

function someRandom(strings) {
  // we are doing something here
  return strings
}

exports.someRandom = someRandom;

现在我在客户端

得到这个
Uncaught ReferenceError: exports is not defined 

我知道我可以使用节点requirejs,然后将结构更改为使用define但是在没有添加节点requirejs的情况下还有其他方法吗?

这是我的js/main.js文件

require(["path/to/lib/index"], function(something) {
    // will do something here
});

1 个答案:

答案 0 :(得分:1)

我喜欢这样做的方法是用AMD语法编写所有模块(使用define)并使用amd-loader在Node中加载它们。请注意,即使使用了AMD语法,此解决方案也不使用RequireJS。

但是,有一种方法可以在不使用AMD语法的情况下完成。您可以使用r.js来包装Node模块。例如,如果将节点模块树放在in中,则可以执行以下操作:

$ r.js -convert in out

这将在out中创建一个文件树,这些文件与in中的文件对应,但包含define调用。然后,您可以使用RequireJS在浏览器中加载它们。有局限性。有些是显而易见的,比如无法使用依赖于Node运行时的Node模块(如fschild_process等)。有些更微妙,比如你不能使用require(foo) foo是变量(RequireJS只处理那里的字符串文字)。有关详细信息,请参阅documentation