2010-10-06 10 views
5

Theory:Propozycje czynienia z `exports` w node.js

Jedną z rzeczy, które przemawia do mnie o node.js używa go jako narzędzia wiersza poleceń.

Teoretycznie mogę pisać biblioteki w JavaScript i umieszczać je w moim katalogu ~/.node_libraries, a następnie mogę ponownie używać tych bibliotek.

Tak na przykład, mam text.js w ~/.node_libraries i ma kilka funkcji związanych tekstowych używam kółko (depunctuate(), tokenize_text(), takie rzeczy).

Piękno tego polega na tym, że mogłem użyć tego samego pliku text.js z moimi skryptami wiersza poleceń i po stronie serwera. W tej chwili robię wszystkie teksty z Pythonem, ale chciałbym trzymać się jednego języka.

Praktyka:

AFAICT, w celu stworzenia modułu node.js, muszę dołączyć wszystko, co chcesz mieć dostęp do exports lub this. Czyli w text.js mam zrobić:

exports.depunctuate = depunctuate 

lub

this.depunctuate = depunctuate 

Jeśli używam exports, mam problemy z wykorzystaniem biblioteki po stronie serwera à la:

<script src=text.js></script> 

ponieważ wtedy dostaję eksport nie jest zdefiniowany błędy.

Jeśli używam this, unikam błędu, ale wszystko, co eksportuję, kończy się dołączaniem do obiektu okna.

Czy istnieje sposób, w jaki mogę skonfigurować te biblioteki, aby uniknąć obu tych problemów? Na przykład, czy istnieje sposób, w jaki można zawinąć eksportowanie exports, tak aby var był widoczny dla węzła, ale nie wtedy, gdy jest używany w prostym pliku JavaScript na serwerze?

Odpowiedz

7

Co powiesz na testowanie istnienia obiektu exports przed umieszczeniem w nim materiału?

Ten pracował dobrze dla mnie do tej pory, ale być może istnieją lepsze pomysły tam:

if(typeof(exports) !== 'undefined' && exports !== null) { 
    exports.foo = foo; 
    exports.bar = bar; 
} 

W coffeescript, można to zrobić trochę bardziej zwięźle:

[exports.foo, exports.bar] = [foo, bar] if exports? 
+0

To się udało! Muszę kochać Stackoverflow ... BTW, dlaczego nie mogę po prostu powiedzieć 'if (exports)'? –

+0

Zaczekaj, po namyśle, wciąż jestem w stanie dostać się do 'window.depunctuate'. –

7

więc wchodzi w problem z przestrzenią nazw. O ile funkcja nie zostanie wywołana z nowym operatorem, otrzymasz ten kontekst === do okna (globalnie). Sposób uniknięcia tego:

(function(exports) { 
    /* put your depuncuate definition here to keep it from leaking to the global */ 
    exports.depunctuate = depunctuate; 
})((typeof exports === 'undefined') ? myAppNamespace : exports); 
Powiązane problemy