2012-09-24 14 views
18

Ich habe ein Knotenmodul erstellt, das im Wesentlichen nur einige nützliche JS ist, die auch clientseitig verwendet werden können. Ich weiß, dass request.js common.js-Komponenten laden kann, aber ich möchte nicht unbedingt ein Mandat machen, dass jeder, der meine Modul-Client-Seite verwendet, auch benötigt oder common.js oder so etwas. Ich möchte sie auch nicht zwingen, die module.exports = ... am Ende der Datei zu entfernen. Wie lösen andere dieses Problem? Schaffst du einfach 2 Versionen oder 2 "kompilierte" Versionen? Funktioniert module.exports überall?module.exports clientseitige

+2

Die beste Exposition zu diesem Thema, die ich kenne, ist http://www.2ality.com/2011/11/module-gap.html. Der Autor diskutiert Vorteile/Nachteil und Entwicklungs-/Deployment-Modi. –

Antwort

16

Dies ist, was Underscore.js tut:

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

Ahh ja, das ist cool! – Parris

+0

Ich frage mich, wie Sie diesen Teil des Codes testen können, um zu überprüfen, ob es erfolgreich exportiert wird. – Jun

4

Das ist für mich (Coffee) gearbeitet hat. Es sei angenommen, ‚Namespace‘ ist, was Sie auf dem window Umfang für die Kunden

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

Dann können Sie require('namespace').my === 'cool' in Node.js oder Namespace.my === 'cool' im Browser verwenden, geltend machen wollen. Dies schlägt sich in JS als

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

ich diese einfacher finden:

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

Diese Datei in eingeschlossen werden können, sowohl den Browser und node.js.