2012-09-24 54 views
18

He creado un módulo de nodo que es básicamente solo un JS útil que también se puede usar desde el lado del cliente. Sé que require.js puede cargar componentes de common.js, pero no necesariamente quiero hacer un mandato que todos los que usan mi módulo de cliente necesiten también, common.js o algo así. Tampoco quiero obligarlos a eliminar el module.exports = ... en la parte inferior del archivo. ¿Cómo otros resuelven este problema? ¿Simplemente creas 2 versiones, o 2 versiones "compiladas"? ¿Module.exports funciona en todos lados?module.exports client side

+2

La mejor exposición sobre este tema que conozco es http://www.2ality.com/2011/11/module-gap.html. El autor analiza las ventajas/desventajas y los modos de desarrollo/despliegue. –

Respuesta

16

Esto es lo que hace underscore.js:

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

Ahh sí, eso es genial! – Parris

+0

Me pregunto cómo puede probar esta parte del código para verificar que se exporte con éxito. – Jun

4

Esto ha funcionado para mí (CoffeeScript). Suponga 'Espacio de nombres' es lo que quiere reclamar en el ámbito window para el cliente

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

continuación, puede utilizar require('namespace').my === 'cool' en Node.js o Namespace.my === 'cool' en el navegador. Esto se traduce en JS como

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

Me parece más simple:

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

Este archivo se puede incluir tanto en el navegador y node.js.