在node.js中处理`exports`的build议
理论:
其中一个吸引我关于node.js的东西是使用它作为命令行工具。
从理论上说,我可以用Javascript编写库,并将它们放在我的~/.node_libraries
目录中,然后我可以重用这些库。
所以举例来说,我在~/.node_libraries
有一个text.js ~/.node_libraries
,它有一堆反复使用的文本相关函数( depunctuate()
, tokenize_text()
)。
这样做的text.js
在于,我可以使用与我的命令行脚本和服务器端相同的text.js
文件。 现在我正在用Python处理所有文本处理的东西,但我只想坚持一种语言。
实践:
AFAICT,为了创build一个node.js模块,我必须将所有我想要的东西都附加到exports
或者this
。 也就是说,在text.js
,我必须这样做:
exports.depunctuate = depunctuate
要么
this.depunctuate = depunctuate
如果我使用exports
,我在使用库服务器端àla时遇到问题:
<script src=text.js></script>
因为那我得到出口没有定义的错误。
如果我使用this
,我会避免这个错误,但是我导出的所有东西都会被附加到窗口对象上。
有没有办法可以设置这些避免这两个问题的库? 例如,是否有一些方法可以包装导出导出,以便var对于节点显而易见,但是不能在服务器上的纯Javascript文件中使用。
在插入东西之前如何testingexports
对象的存在?
到目前为止,这对我来说效果很好,但也许有更好的想法:
if(typeof(exports) !== 'undefined' && exports !== null) { exports.foo = foo; exports.bar = bar; }
在CoffeeScript中,这可以做得更简洁:
[exports.foo, exports.bar] = [foo, bar] if exports?
所以这到一个命名空间的问题。 除非使用新的操作符调用函数,否则您将获得一个此上下文===窗口(全局)。 一个闪避的方法是:
(function( exports ) { /* put your depuncuate definition here to keep it from leaking to the global */ exports.depunctuate = depunctuate; })( (typeof exports === 'undefined') ? myAppNamespace : exports );