2011-04-17 17 views
33

Estoy trabajando en un proyecto con Node.js y el código del lado del servidor es lo suficientemente grande como para dividirlo en varios archivos. Parece que esto se ha hecho desde el lado del cliente durante años, el desarrollo se hace insertando una etiqueta script para cada archivo y solo para la distribución se usa algo como "Hacer" para unir todo. Me doy cuenta de que no tiene sentido conquistar todo el código del lado del servidor, así que no estoy preguntando cómo hacerlo. Lo más parecido que puedo encontrar para usar es require(), sin embargo, no se comporta del mismo modo que script en el navegador en el que los archivos requeridos no comparten un espacio de nombres común.Cómo administrar múltiples archivos JS del lado del servidor con Node.js

Mirando algunos proyectos anteriores de Node.js, como Shooter, parece que alguna vez no fue así, o me falta algo muy simple en mi código. Mis archivos requeridos no pueden acceder al espacio de nombres de llamadas globales en tiempo de compilación ni tiempo de ejecución. ¿Hay alguna forma simple de evitar esto o estamos obligados a hacer que todos nuestros archivos JS requeridos sean completamente autónomos desde el alcance de la llamada?

Respuesta

47

No desea un espacio de nombres común porque los globales son malvados. En el nodo definimos módulos

// someThings.js 

(function() { 
    var someThings = ...; 

    ... 

    module.exports.getSomeThings = function() { 
     return someThings(); 
    } 

}()); 

// main.js 

var things = require("someThings"); 
... 
doSomething(things.getSomeThings()); 

Se define un módulo y luego expone una API pública para el módulo escribiendo a exports.

La mejor manera de manejar esto es la inyección de dependencia. Su módulo expone una función init y pasa un hash de dependencias a su módulo.

Si realmente insiste en acceder al alcance global, puede acceder a través de global. Cada archivo puede escribir y leer en el objeto global. De nuevo, no quieres usar globales.

+0

Gracias por la información, marcando como correcto. En general, estoy de acuerdo con el concepto mal global == pero parece que sí tienen su lugar. ¿Qué sucede si, por ejemplo, tengo una propiedad base que quiero establecer para una "clase" dada que depende de un valor en otro lugar? Ejemplo: 'SomeClass.prototype.baseProp = SomeOtherClass.prototype.prop * 2;' En este caso, me veo obligado a configurar esto en instanciación de objetos a través del constructor, o bien, uso el objeto 'global' como sugirió . Creo que el último puede ser el más apropiado. –

+2

@XHR Luego 'SomeClass' tiene una dependencia en' SomeOtherClass' y 'require ('SomeOtherClass')' dentro de SomeClass.js. Tengo una única variable global en mi código. 'global._ = require (" guión bajo ")' porque lo uso _every_archivo único. Ese es el único caso de uso para 'global'. – Raynos

29

re @Raynos answer, si el archivo de módulo está junto al archivo que lo incluye, debe ser

var things = require("./someThings"); 

Si el módulo se publica en, y se instala a través de, la NGP, o explícitamente pone en la carpeta ./node_modules/ , entonces el

var things = require("someThings"); 

es correcto.

+4

Si necesita un módulo de nodo real (instalado a través de npm, instalado en PROJECT_ROOT/node_modules), se necesita la segunda línea de código. Si necesita su propio archivo (por ejemplo, ROOT_DIR/models/thing.js), debe hacer la primera línea de código (aunque puede quitar la extensión .js). –

+0

No estoy seguro, pero es posible que pueda modificar este comportamiento utilizando [la propiedad de extensiones del objeto requerido] (http://nodejs.org/api/globals.html#globals_require_extensions). – snapfractalpop

+0

Gracias por la corrección, lo actualicé. – michielbdejong

Cuestiones relacionadas