Pregunté aquí: node.js requiere herencia?
y me dijeron que puedo establecer variables en el ámbito global al omitir la var.
Esto no funciona para mi.
es decir:
_ = require('underscore');
No hace que _ esté disponible en los archivos requeridos. Sin app.set
embargo, puedo configurarlo con express y tenerlo disponible en otro lugar.
¿Alguien puede confirmar que se supone que esto funciona? Gracias.
javascript
node.js
express
Harry
fuente
fuente
exports
. Es mucho, mucho mejor.Respuestas:
Puedes usar
global
así:fuente
window
es el objeto global.document
es propiedad dewindow
.En el nodo, puede establecer variables globales a través del objeto "global" o "GLOBAL":
o más útilmente ...
Desde el origen del nodo, puede ver que estos tienen un alias entre sí:
En el código anterior, "esto" es el contexto global. Con el sistema de módulos commonJS (qué nodo usa), el objeto "este" dentro de un módulo (es decir, "su código") NO es el contexto global. Para probar esto, vea a continuación donde arrojo el objeto "este" y luego el objeto gigante "GLOBAL".
** Nota: con respecto a la configuración "GLOBAL._", en general solo debes hacer
var _ = require('underscore');
. Sí, lo haces en cada archivo que usa guión bajo, al igual que en Javaimport com.foo.bar;
. Esto hace que sea más fácil averiguar qué está haciendo su código porque los enlaces entre archivos son 'explícitos'. Ligeramente molesto, pero algo bueno. .... Esa es la predicación.Hay una excepción a cada regla. He tenido exactamente UNA instancia en la que necesitaba configurar "GLOBAL._". Estaba creando un sistema para definir archivos "config" que eran básicamente JSON, pero estaban "escritos en JS" para permitir un poco más de flexibilidad. Dichos archivos de configuración no tenían declaraciones 'require', pero quería que tuvieran acceso a guión bajo (el sistema ENTERO se basaba en plantillas de guión bajo y guión bajo), por lo que antes de evaluar la "configuración", establecería "GLOBAL._". Entonces, sí, para cada regla, hay una excepción en alguna parte. Pero es mejor que tenga una buena razón y no solo "me canso de escribir 'require', así que quiero romper con la convención".
fuente
.js
archivo normal y llamarrequire
antes de exportar las configuraciones?Las otras soluciones que usan la palabra clave GLOBAL son una pesadilla para mantener / legibilidad (+ contaminación de espacio de nombres y errores) cuando el proyecto se hace más grande. He visto este error muchas veces y tuve la molestia de arreglarlo.
Use un archivo JS y luego use exportaciones de módulos.
Ejemplo:
globals.js
Luego, si desea utilizarlos, use require.
fuente
globals.domain
?¿Qué pasa con un espacio de nombres global como
global.MYAPI = {}
Edite después del comentario de camilo-martin : Todos los otros carteles hablan sobre el mal patrón involucrado. Dejando a un lado esa discusión, la mejor manera de tener una variable definida globalmente (pregunta de OP) es a través de espacios de nombres.
@ consejo: http://thanpol.as/javascript/development-using-namespaces
fuente
require
está! Está bien usar espacios de nombres, pero no vayas a todosglobal.foo = global.foo || {}
los archivos, o algo así. Requerir el archivo que define el espacio de nombres. Hazlo por los niños.Simplemente puede usar el objeto global.
fuente
Estoy de acuerdo en que usar el espacio de nombres global / GLOBAL para establecer algo global es una mala práctica y no lo uso en absoluto en teoría ( en teoría es la palabra clave). Sin embargo (sí, el operativo) lo uso para configurar clases de error personalizadas:
Sí, tabú aquí, pero si su sitio / proyecto usa errores personalizados en todo el lugar, básicamente necesitaría definirlo en todas partes, o al menos en algún lugar para:
Definir mis errores personalizados en el espacio de nombres global me ahorra la molestia de requerir la biblioteca de errores de mi cliente. Imágenes que arrojan un error personalizado donde ese error personalizado no está definido.
Además, si esto está mal, hágamelo saber, ya que recién comencé a hacer esto recientemente.
fuente