理论值:
有关node.js的一些吸引我的事情是将它用作命令行工具。
理论上,我可以用Javascript编写库并将它们放在我的~/.node_libraries
目录中,然后我可以重用这些库。
例如,我在~/.node_libraries
中有一个text.js,它有一堆我反复使用的文本相关函数(depunctuate()
,tokenize_text()
,类似于那)。
这样做的好处是我可以在命令行脚本和服务器端使用相同的text.js
文件。现在我正在使用Python进行所有文本处理工作,但我只想坚持使用一种语言。
实践:
AFAICT,为了创建node.js模块,我必须将我希望可用的所有内容附加到exports
或this
。即,在text.js
中,我必须这样做:
exports.depunctuate = depunctuate
或
this.depunctuate = depunctuate
如果我使用exports
,我在使用库服务器端àla:
<script src=text.js></script>
因为我得到导出未定义错误。
如果我使用this
,我会避免错误,但我导出的所有内容最终会附加到窗口对象。
有没有什么方法可以设置这些库以避免这两个问题?例如,我是否可以通过某种方式包装exports
的导出,以便var对节点显而易见,但是当它在服务器上的普通Javascript文件中使用时却不明显?
答案 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 );