2010-10-06 13 views
5

Théorie:Suggestions pour traiter `exports` dans Node.js

L'une des choses qui fait appel à moi de Node.js est l'utiliser comme outil de ligne de commande.

En théorie, je peux écrire des bibliothèques en Javascript et les placer dans mon répertoire ~/.node_libraries, puis je peux réutiliser ces bibliothèques.

Ainsi, par exemple, j'ai text.js dans ~/.node_libraries, et il a un tas de fonctions liées à texte que j'utilise plus et plus (depunctuate(), tokenize_text(), des choses comme ça).

La beauté de ceci est que je pourrais utiliser le même fichier text.js avec mes scripts de ligne de commande et côté serveur. En ce moment je fais tout ce traitement de texte avec Python, mais je voudrais juste coller à une langue.

Pratique:

AFAICT, afin de créer un module Node.js, je dois attacher tout ce que je veux être disponible pour exports ou this. -À-dire, en text.js, je dois faire:

exports.depunctuate = depunctuate 

ou

this.depunctuate = depunctuate 

Si je exports, j'ai des problèmes avec l'aide de la bibliothèque côté serveur à la:

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

parce que je reçois exportations ne sont pas définies erreurs. Si j'utilise this, j'évite l'erreur, mais tout ce que j'exporte finit par être attaché à l'objet window.

Y at-il un moyen de configurer ces bibliothèques qui évitent ces deux problèmes? Par exemple, est-ce que je peux emballer l'exportation de exports de sorte que le var apparaisse au noeud, mais pas quand il est utilisé dans un fichier Javascript simple sur un serveur?

Répondre

7

Que diriez-vous de tester l'existence de l'objet exports avant de coller des choses dedans?

Cela a bien fonctionné pour moi jusqu'à présent, mais peut-être il y a de meilleures idées là-bas:

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

En CoffeeScript, cela peut être fait un peu plus laconique:

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

C'est fait! Je dois aimer Stackoverflow ... BTW, pourquoi je ne peux pas juste dire si (exportations) '? –

+0

Attendez, à la réflexion, je suis encore capable d'arriver à 'window.depunctuate'. –

7

donc ce vient dans un problème de namespacing. Sauf si une fonction est appelée avec le nouvel opérateur, vous obtiendrez un tel contexte === à window (global). Un moyen d'esquiver c'est:

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