2016-07-05 2 views
1

Ich versuchen, einen kleinen Web-App zu erstellen, und ich habe eine Frage zu module.exportsmodule.exports und lokale Variablen

supppose I counter.js

var counter = 0; 

module.exports = { 
    add: function() { 
     counter++; 
    }, 
    get: function() { 
     return counter; 
    } 
} 

eine Datei habe, und ich versuche zu verweisen diese Datei in mehrere Dateien annehmen app.js und count.js alle in demselben Verzeichnis befinden

// from app.js 

var a = require('./counter.js'); 

a.add(); 
console.log(a.get()); // the value is 1 


// from count.js 

var b = require('./counter.js'); 

b.add(); 
console.log(b.get()); // the value is 2? 

wird der Wert 1 oder 2 sein?

Antwort

1

Wenn Sie meinen, dass (zB) app.jscount.js über require() enthalten wird oder dass beide app.js und count.js wird durch eine dritte Datei über require() aufgenommen werden, dann teilen sie alle eine Instanz und die Antwort ist 2.

Wenn Sie meinen, was passiert, wenn Sie node app.js laufen und dann node count.js laufen, dann in diesem Fall erhält jede Datei eine eigene Instanz des gewünschten Moduls, so dass es 1 sein wird.

+0

Gibt es eine Möglichkeit, den Variablenzähler von beiden Dateien gemeinsam nutzen zu lassen? – Rockstar5645

+0

Ja. Ich habe meine Antwort aktualisiert. – Trott

+0

Ich meine, dass 'app.js' und' count.js' zwei getrennte Dateien sind, einschließlich 'counter.js' über' require() ' – Rockstar5645

1

wird das Ergebnis 2

Von nodejs.org doc

Module nach dem ersten Mal, wenn sie geladen werden zwischengespeichert werden, sein. Dies bedeutet (unter anderem) , dass jeder Aufruf zu fordern ('foo') wird genau das gleiche Objekt zurückgegeben, wenn es in der gleichen Datei auflösen würde.

Mehrere Aufrufe von require ('foo') dürfen nicht dazu führen, dass der Modulcode mehrmals ausgeführt wird. Dies ist ein wichtiges Merkmal. Mit ihm können "tlw-done" -Objekte zurückgegeben werden, wodurch transitive Abhängigkeiten geladen werden können, selbst wenn sie Zyklen verursachen würden.