簡體   English   中英

在node.js中處理`exports`的建議

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM