En esta publicación, estoy hablando del almacenamiento en caché de módulos en NodeJS.
Tenemos los siguientes archivos
1 2 3 4 5 6 7 | //greet.js module.exports = { greeting: "Hello!" , greet: function (){ console.log(this.greeting); } } |
01 02 03 04 05 06 07 08 09 10 | //app.js var greet1 = require ( "./module/greet" ); greet1.greet(); greet1.greeting = "Yooo!" ; greet1.greet(); var greet2 = require ( "./module/greet" ); greet2.greet(); |
Al ejecutar , a primera vista, esperaríamos que el resultado fuera:
1 2 3 | Heyyyyyy? Yooo! Heyyyyyy? |
Nuestra lógica es que imprimiría "Heyyyyyy?" porque obtendrá una copia nueva de module.export del archivo greet.js.
Pero por el contrario, la salida del programa anterior es:
1 2 3 | Heyyyyyy? Yooo! Yooo! |
Entonces, lo que realmente sucede es que, cuando la función llama a la función, se crea y compila un nuevo módulo para . Después de la compilación y antes de regresar, el nodo almacena la copia en caché de en la variable y luego regresa
Dado que los objetos en Javascript se pasan por referencia, apunta hacia la misma ubicación en la memoria donde apunta. Ahora, cuando hicimos un cambio mutando la propiedad, también cambia porque, en última instancia, ambos y son iguales. Apuntan al mismo objeto.
Entonces, cuando llama a la función, en lugar de recompilar , el nodo verifica si hay una copia en caché de Si se encuentra, la devuelve y, por lo tanto, ahorra tiempo que se habría perdido en la recompilación .
Entonces, esencialmente obtiene el mismo objeto al que apunta . Esta es la razón por la que imprime “¡Yooo!”.
Node también proporciona una función para eliminar la caché almacenada. Se hace ejecutando la siguiente declaración:
1 | delete require .cache[ require .resolve(module)] |
Entonces, si uno quiere recargar siempre el módulo, puede agregar esta función:
1 2 3 4 | function requireUncached(module){ delete require .cache[ require .resolve(module)] return require (module) } |
Conclusiones de esta lección:
Siempre que se requiere un módulo, el nodo comprueba si existe una copia en caché de su module.exports. Si existe, devuelve la copia en caché; de lo contrario, compila ese módulo y hace una copia en caché de su module.exports y luego devuelve module.exports.
0 Comentarios
Dejanos tu comentario para seguir mejorando!