我编写了一个目前在节点应用程序中运行的小解析器,但想知道是否有一种方法可以创建一个可以在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
});
答案 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模块(如fs
,child_process
等)。有些更微妙,比如你不能使用require(foo)
foo
是变量(RequireJS只处理那里的字符串文字)。有关详细信息,请参阅documentation。