编写一个在nodejs和requires中都能工作的模块



我写了一个小解析器,目前在节点应用程序中工作,但想知道是否有一种方法,我可以使一个模块,将工作在NodeJS应用程序和客户端应用程序使用需求?

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
});

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

然而,有一种方法可以做到这一点,而不必使用AMD语法。您可以使用r.js来包装Node模块。例如,如果将Node模块树放在in中,可以这样做:
$ r.js -convert in out

这将在out中创建一个文件树,该文件树与in中的文件树相对应,但被define调用包装。然后,您可以使用RequireJS在浏览器中加载这些文件。这是有局限性的。有些是显而易见的,比如不能使用依赖于Node运行时的Node模块(如fschild_process等)。有些更微妙,比如你不能在foo是变量的地方使用require(foo) (RequireJS将只处理字符串字面量)。

最新更新