在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 ); 
    Interesting Posts