[英]Suggestions for dealing with `exports` in node.js
理論:
關於node.js吸引我的一件事是將它用作命令行工具。
從理論上講,我可以用Javascript編寫庫並將它們放在我的~/.node_libraries
目錄中,然后我可以重用這些庫。
所以,例如,我在~/.node_libraries
有一個~/.node_libraries
,它有一堆我反復使用的文本相關函數( depunctuate()
, tokenize_text()
,類似的東西)。
這樣做的text.js
是我可以在命令行腳本和服務器端使用相同的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文件的使用?
如何在粘貼東西之前測試exports
對象的存在?
到目前為止,這對我來說效果很好,但也許有更好的想法:
if(typeof(exports) !== 'undefined' && exports !== null) {
exports.foo = foo;
exports.bar = bar;
}
在CoffeeScript中,這可以更簡潔地完成:
[exports.foo, exports.bar] = [foo, bar] if exports?
所以這就成了一個命名空間問題。 除非使用new運算符調用函數,否則將獲得此上下文===到窗口(全局)。 一種躲閃的方法是:
(function( exports ) {
/* put your depuncuate definition here to keep it from leaking to the global */
exports.depunctuate = depunctuate;
})( (typeof exports === 'undefined') ? myAppNamespace : exports );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.