2011-08-31 7 views
15

no lo hago muy parecido a la forma estándar para requerir módulos, que es algo como esto:mejor manera de requerir varios módulos en NodeJS

connect = require 'connect' 
express = require 'express' 
redis = require 'redis' 
sys = require 'sys' 
coffee = require 'coffee-script' 
fs = require 'fs' 

No es exactamente SECO. ¡En un modesto servidor CoffeeScript, el requerimiento de baile ocupa una parte considerable de todo el guión! He estado toying con la siguiente alternativa:

"connect,express,redis,sys,coffee-script,fs" 
    .split(',').forEach (lib) -> global[lib] = require lib 

personas Puesto que no he visto tratan de refactorizar el método estándar, yo pensé en preguntar si parece razonable hacerlo, y si es así, son Hay alguna forma mejor de hacerlo?

+3

Pregunta inteligente. Favorecer con la esperanza de aprender algo interesante: D – Kheldar

+0

@mahemoff alcance global :( – Raynos

+0

No estoy seguro del argumento del alcance global. Después de todo, NPM implica un espacio de nombre global de todos modos. Sin duda es una solución de compromiso para considerar como hay claras desventajas en la interrupción en persona de la lógica de negocios/aplicaciones para realizar una declaración de requerimiento a nivel de infraestructura. – mahemoff

Respuesta

5

Tenga en cuenta que coffee-script no es un identificador válido, por lo que su código no está realmente importa correctamente. Puede usar los literales de objeto flexibles de CoffeeScript para manejar esto bastante bien. También usaría ?= para evitar la innecesaria reimportación de módulos. Construido a partir user211399's answer:

 
global[id] ?= require name for id, name of { 
    "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" } 

                    [ Compile to JS ] 

Desde que estoy que le permite importar con diferentes identificadores en diferentes módulos, utilizando el espacio de nombres global se siente particularmente inseguro. Los importaría localmente, como se muestra a continuación. Tenga en cuenta que, debido a que esto usa eval, podría no fallar correctamente si especifica un identificador ilegal.

 
eval "#{id} = require(#{JSON.stringify name})" name for id, name of { 
    "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" } 

                    [ Compile to JS ] 
+0

es válido identificador. Solo necesita referirse a él como 'global [" coffee-script "]' – Raynos

+2

@Raynos: Puede usar eso como referencia, pero eso no es lo que significa ser un identificador (ECMA-262 5e [ Sección 7.6] (http://ecma262-5.com/ELS5_Section_7.htm#Section_7.6), [Sección 10.3.1] (http://ecma262-5.com/ELS5_Section_10.htm#Section_10.3.1), [ Segundo ción 11.1.2] (http://ecma262-5.com/ELS5_Section_11.htm#Section_11.1.2)). Tampoco es así como te referirías a él si lo hubieras importado normalmente, por lo que no lo considero como "realmente importándolo correctamente". –

3
global[lib] = require lib for lib in "connect,express,redis,sys,coffee-script,fs".split ',' 
4

Jugué con la idea hace algún tiempo, y terminamos con esto:

global[mod.replace /\W/g, ''] = require mod for mod in [ 
    "connect" 
    "express" 
    "redis" 
    "sys" 
    "coffee-script" 
] 

Terminamos el rasguño de ella y acaba de hacerlo de la manera habitual - que termina siendo una molestia más grande. Hay muchas veces en las que necesita tomar la propiedad de un módulo o utilizar un esquema de nombres diferente. Además, asignar al alcance global no es lo mismo que un require "normal". La alineación de las tareas hace que sea más fácil de leer:

connect = require 'connect' 
express = require 'express' 
mongoose = require 'mongoose' 
coffee = require 'coffee-script' 
fs  = require 'fs' 
{ exec } = require 'child_process' 

que sólo está haciendo esto una vez, haciendo abstracción es sólo una complejidad innecesaria.

Cuestiones relacionadas