在node.js中处理`exports`的建议

时间:2010-10-06 22:31:03

标签: javascript node.js this require

理论值:

有关node.js的一些吸引我的事情是将它用作命令行工具。

理论上,我可以用Javascript编写库并将它们放在我的~/.node_libraries目录中,然后我可以重用这些库。

例如,我在~/.node_libraries中有一个text.js,它有一堆我反复使用的文本相关函数(depunctuate()tokenize_text(),类似于那)。

这样做的好处是我可以在命令行脚本和服务器端使用相同的text.js文件。现在我正在使用Python进行所有文本处理工作,但我只想坚持使用一种语言。

实践:

AFAICT,为了创建node.js模块,我必须将我希望可用的所有内容附加到exportsthis。即,在text.js中,我必须这样做:

exports.depunctuate = depunctuate

this.depunctuate = depunctuate

如果我使用exports,我在使用库服务器端àla:

时遇到问题
<script src=text.js></script>

因为我得到导出未定义错误。

如果我使用this,我会避免错误,但我导出的所有内容最终会附加到窗口对象。

有没有什么方法可以设置这些库以避免这两个问题?例如,我是否可以通过某种方式包装exports的导出,以便var对节点显而易见,但是当它在服务器上的普通Javascript文件中使用时却不明显?

2 个答案:

答案 0 :(得分:7)

如何在粘贴内容之前测试exports对象的存在?

到目前为止,这对我来说效果很好,但也许有更好的想法:

if(typeof(exports) !== 'undefined' && exports !== null) {
  exports.foo = foo;
  exports.bar = bar;
}

在CoffeeScript中,这可以更简洁地完成:

[exports.foo, exports.bar] = [foo, bar] if exports?

答案 1 :(得分:7)

所以这就成了一个命名空间问题。除非使用new运算符调用函数,否则将获得此上下文===到窗口(全局)。避免这种情况的一种方法是:

(function( exports ) {
  /* put your depuncuate definition here to keep it from leaking to the global */
  exports.depunctuate = depunctuate;
})( (typeof exports === 'undefined') ? myAppNamespace : exports );