2012-09-24 19 views
18

Ho creato un modulo nodo che è essenzialmente solo un JS utile che può essere utilizzato anche lato client. So che require.js è in grado di caricare i componenti common.js, ma non voglio necessariamente stabilire che tutti coloro che utilizzano il lato client del modulo necessitino di require o common.js o qualcosa del genere. Inoltre, non voglio costringerli a rimuovere lo module.exports = ... nella parte inferiore del file. Come fanno gli altri a risolvere questo problema? Crei piuttosto 2 versioni o 2 versioni "compilate"? Module.exports funziona ovunque?module.exports lato client

+2

La migliore esposizione su questo argomento che conosco è http://www.2ality.com/2011/11/module-gap.html. L'autore discute vantaggi/svantaggi e modalità di sviluppo/implementazione. –

risposta

16

Questo è ciò che fa underscore.js:

if (typeof exports !== 'undefined') { 
    if (typeof module !== 'undefined' && module.exports) { 
    exports = module.exports = _; 
    } 
    exports._ = _; 
} else { 
    root['_'] = _; 
} 
+0

Ah sì che è bello! – Parris

+0

Mi chiedo come è possibile testare questa parte di codice per verificare che venga esportata correttamente. – Jun

4

Questo ha funzionato per me (CoffeeScript). Si supponga 'Namespace' è ciò che si desidera richiedere sulla portata window per il cliente

(module ? {}).exports = @Namespace = 
    my: 'cool' 
    module: '!' 

Quindi è possibile utilizzare require('namespace').my === 'cool' in Node.js o Namespace.my === 'cool' nel browser. Questo si traduce in JS come

(typeof module !== "undefined" && module !== null ? module : {}).exports = this.Namespace = { 
    my: 'cool', 
    module: '!' 
}; 
1

Trovo che questo sia più semplice:

try { 
    module.exports = exports = MyModule; 
} catch (e) {} 

Questo file può essere incluso sia nel browser e node.js.