Header Ads Widget

Ticker

6/recent/ticker-posts

Almacenamiento en caché de módulos en NodeJS

 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 node app.js, a primera vista, esperaríamos que el resultado fuera:

1
2
3
Heyyyyyy?
Yooo!
Heyyyyyy?

Nuestra lógica es que greet2.greet() 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 greet1 función llama a la  require("./module/greet")función, greet.jsse crea y compila un nuevo módulo para  Después de la compilación y antes de regresar, el nodo almacena la copia module.exports en caché de en la variable cachedModule.exportsy luego regresamodule.exports

Dado que los objetos en Javascript se pasan por referencia,  cachedModule.exportsapunta hacia la misma ubicación en la memoria donde greet1 apunta. Ahora, cuando hicimos un cambio greet1 mutando la greeting propiedad, cachedModule.exports también cambia porque, en última instancia, ambos  cachedModule.exportsgreet1 son iguales. Apuntan al mismo objeto.

Entonces, cuando greet2 llama a la  require("./module/greet")función, en lugar de recompilar greet.js, el nodo verifica si hay una copia en caché de module.exports.Si se encuentra, la devuelve y, por lo tanto, ahorra tiempo que se habría perdido en la recompilación greet.js.

Entonces, greet2 esencialmente obtiene el mismo objeto al que apunta greet1Esta es la razón por la que  greet2.greeting()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.

Publicar un comentario

0 Comentarios