Actualmente estoy haciendo esto:
foo.js
const FOO = 5;
module.exports = {
FOO: FOO
};
Y usándolo en bar.js
:
var foo = require('foo');
foo.FOO; // 5
¿Hay una mejor manera de hacer esto? Se siente incómodo declarar la constante en el objeto de exportaciones.
javascript
node.js
Torre
fuente
fuente
exports
. ¿Qué tiene de incómodo eso?export const FOO = 5;
.module.exports={FOO:5};
?Respuestas:
Puede exportarlo explícitamente al ámbito global con
global.FOO = 5
. Entonces simplemente necesita solicitar el archivo, y ni siquiera guardar su valor de retorno.Pero realmente, no deberías hacer eso. Mantener las cosas correctamente encapsuladas es algo bueno. Ya tienes la idea correcta, así que sigue haciendo lo que estás haciendo.
fuente
En mi opinión, la utilización
Object.freeze
permite un SECADOR y un estilo más declarativo. Mi patrón preferido es:./lib/constants.js
./lib/some-module.js
Advertencia de rendimiento desactualizado
El siguiente problema se solucionó en v8 en enero de 2014 y ya no es relevante para la mayoría de los desarrolladores:
Tenga en cuenta que tanto la configuración de escritura como falsa y el uso de Object.freeze tienen una penalización de rendimiento masiva en v8: https://bugs.chromium.org/p/v8/issues/detail?id=1858 y http://jsperf.com / performance-frozen-object
fuente
Técnicamente,
const
no forma parte de la especificación ECMAScript. Además, utilizando el patrón "Módulo CommonJS" que ha notado, puede cambiar el valor de esa "constante" ya que ahora es solo una propiedad de objeto. (no estoy seguro si eso cambiará en cascada a otros scripts que requieren el mismo módulo, pero es posible)Para obtener una constante real que también se puede compartir, revisar
Object.create
,Object.defineProperty
yObject.defineProperties
. Si establecewritable: false
, entonces el valor en su "constante" no puede modificarse. :)Es un poco detallado (pero incluso eso se puede cambiar con un pequeño JS), pero solo debería hacerlo una vez para su módulo de constantes. Usando estos métodos, cualquier atributo que omita por defecto
false
. (a diferencia de la definición de propiedades mediante asignación, que predetermina todos los atributostrue
)Por lo tanto, hipotéticamente, podría simplemente configurar
value
yenumerable
, omitiendowritable
yconfigurable
ya que estarán predeterminadosfalse
, los he incluido para mayor claridad.Actualización : he creado un nuevo módulo ( constantes de nodo ) con funciones auxiliares para este mismo caso de uso.
constants.js - Bueno
constants.js - Mejor
script.js
fuente
Object.defineProperty()
. Todas las propiedades no especificadas se suponenfalse
en este contexto.ES6 camino.
exportar en foo.js
importar en bar.js
fuente
const
in elbar.js
que impone la inmutabilidad de la variable desestructurada, no elconst
infoo.js
. Es decir, se puede utilizarlet {FOO} =
enbar.js
y mutar la variable "constante". AFAIK, para imponer la inmutabilidad de las exportaciones, uno todavía necesita módulos ES oObject.freeze
.FOO
dentrofoo.js
.Encontré la solución que Dominic sugirió para ser la mejor, pero todavía falta una característica de la declaración "const". Cuando declara una constante en JS con la palabra clave "const", la existencia de la constante se verifica en tiempo de análisis, no en tiempo de ejecución. Entonces, si escribe mal el nombre de la constante en algún lugar más adelante en su código, obtendrá un error cuando intente iniciar su programa node.js. Lo cual es una verificación de ortografía mucho mejor.
Si define la constante con la función define () como sugirió Dominic, no obtendrá un error si escribe mal la constante, y el valor de la constante mal escrita no estará definido (lo que puede provocar dolores de cabeza de depuración).
Pero supongo que esto es lo mejor que podemos obtener.
Además, aquí hay una especie de mejora de la función de Dominic, en constans.js:
De esta manera, puede usar la función define () en otros módulos, y le permite definir constantes tanto dentro del módulo constants.js como constantes dentro de su módulo desde el que llamó a la función. La declaración de las constantes del módulo se puede hacer de dos maneras (en script.js).
Primero:
Segundo:
Además, si desea que la función define () se invoque solo desde el módulo de constantes (no para hinchar el objeto global), debe definirla así en constants.js:
y úsalo así en script.js:
fuente
De la experiencia previa del proyecto, esta es una buena manera:
En las constantes.js:
En main.js (o app.js, etc.), úselo de la siguiente manera:
fuente
pienso que
const
resuelve el problema para la mayoría de las personas que buscan esta respuesta. Si realmente necesita una constante inmutable, busque las otras respuestas. Para mantener todo organizado, guardo todas las constantes en una carpeta y luego requiero la carpeta completa.archivo src / main.js
src / consts_folder / index.js
PD. aquí el
deal
ynote
será el primer nivel en main.jssrc / consts_folder / note.js
PD.
obj
será el segundo nivel en main.jssrc / consts_folder / deal.js
PD.
str
será el segundo nivel en main.jsResultado final en el archivo main.js:
console.log(constants.deal);
Ouput:console.log(constants.note);
Ouput:fuente
import
yexport
(probablemente necesite algo como babel a partir de 2018 para usar la importación)tipos.js
myApp.js
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
fuente
Como alternativa, puede agrupar sus valores "constantes" en un objeto local y exportar una función que devuelva un clon superficial de este objeto.
Entonces no importa si alguien reasigna FOO porque solo afectará su copia local.
fuente
Dado que Node.js usa los patrones CommonJS, solo puede compartir variables entre módulos con
module.exports
o configurando una variable global como lo haría en el navegador, pero en lugar de usar la ventana que usaglobal.your_var = value;
.fuente
Terminé haciendo esto exportando un objeto congelado con funciones getter anónimas, en lugar de las constantes mismas. Esto reduce el riesgo de errores desagradables introducidos debido a un simple error tipográfico del nombre constante, ya que se generará un error de tiempo de ejecución en caso de un error tipográfico. Aquí hay un ejemplo completo que también usa Símbolos ES6 para las constantes, asegurando la unicidad y las funciones de flecha ES6. Agradecería comentarios si algo en este enfoque parece problemático.
fuente
Recomiendo hacerlo con webpack (se supone que está usando webpack).
Definir constantes es tan simple como configurar el archivo de configuración del paquete web:
De esta manera, los define fuera de su fuente y estarán disponibles en todos sus archivos.
fuente
No creo que sea una buena práctica invadir el espacio GLOBAL desde los módulos, pero en escenarios donde podría ser estrictamente necesario implementarlo:
Tiene que considerarse el impacto de este recurso. Sin un nombre apropiado de esas constantes, el riesgo de SOBRESCRIBIR variables globales ya definidas es algo real.
fuente