2011-11-07 7 views
2

J'ai un javascript lib, cela est fondamentalement la façon dont il est structuré jusqu'à présent:Faire un beau travail de script avec le navigateur et le noeud (NPM)

var Ns = (function(){ 
    var that = {}; 

    // add stuff to 'that' 

    return that; 
})(); 

//use Ns.foo() and Ns.bar() 

La chose est que maintenant, je voulais le même lib être disponible avec node et npm. Jusqu'à présent, ce que je pouvais venir avec:

this.Ns = (function(){ //same as previous snippet })() 

//use Ns.foo() and Ns.bar() 

Le problème est que, bien que cela fonctionne dans le navigateur, dans le nœud que je dois faire ceci:

var Ns = require('ns').Ns 

Problème: I J'aimerais être en mesure de faire var Ns = require('ns') mais pour ce faire, je dois exporter this.foo et this.bar qui va briser l'inclusion du navigateur. Des idées?

Répondre

3
// create local scope. 
(function() { 

    var myModule = ... 

    // check for node module loader 
    if (typeof module !== "undefined" && typeof require !== "undefined") { 
    module.exports = myModule; 
    } else { 
    window["name"] = myModule; 
    } 

})(); 
0

Création d'un champ est probablement le meilleur itinéraire pour aller (vous n'avez pas de problèmes nom de collision), mais un moyen plus facile de le faire, en polluant la portée globale, ressemble à ceci:

au lieu de

var x = require('x'); 

écrire

var x = (typeof require !== "undefined") ? require('x') : window; 

et même, avant ajoutée aux exportations, vérifier si obj ect existe:

if (typeof exports !== "undefined) 
    exports.my_func = my_func; 

Les conséquences de cela, cependant, est que, dans la version du navigateur tout est rejeté dans une portée globale. En outre, il suppose que la version du navigateur charge les scripts nécessaires dans la page. Facile à travailler sur une petite échelle ... mais je suppose que ça ne va pas bien évoluer.

Questions connexes