2016-07-20 17 views
4

Ich habe ein allgemeines und hohes Verständnis der Funktionalität und der Natur von Node.js 'require() Funktion und module.exports. Es gibt jedoch einige Verhaltensweisen, die für mich keinen Sinn ergeben.Verwirrung über das Verhalten von Node.js, wenn eine Datei ein Modul mit nichts benötigt

Nehmen wir an, ich habe zwei sehr einfache einzeilige Dateien a.js und b.js.

In a.js:

require('./b.js'); 

und in b.js:

console.log("testing"); 

und wenn ich node a.js im Terminal laufen, dann ist hier, was angemeldet ist:

$ node a.js 
testing. 

was bedeutet, dass nur durch Wenn Sie eine Datei/ein Modul benötigen, ist der Inhalt der angeforderten Datei expo sed auf die Datei, die die Anforderung ausgibt (, nicht wahr?)


Jetzt a.js dazu ich ändern:

require('./b.js'); 
testFunc(1, 2); 

und b.js dazu:

var testFunc = function(a, b) { 
    var result = a + b; 
    return result; 
} 

und Lauf wieder node a.js im Terminal:

$ node a.js 
/demo/a.js:3 
testFunc(1, 2); 
^ 

ReferenceError: testFunc is not defined 
...... 

Also, was ist hier los? Offensichtlich kann im ersten Beispiel, indem b.js gefordert wird, a.js auf Inhalt innerhalb von b.js zugreifen. Im zweiten Beispiel ist jedoch die in b.js definierte Funktion überhaupt nicht zugänglich, wie aus ReferenceError: testFunc is not defined ersichtlich ist. Was ist der Trick hier?

Liegt das daran, dass require() nur das erforderliche Skript ausführt, ohne den Inhalt tatsächlich der anfordernden Datei auszusetzen? Um den Inhalt eines anderen Moduls zu verwenden, muss dieses Modul unter Verwendung von module.exports?

+0

Ich habe keine Ahnung, was diese Frage mit ES6 zu tun hatte oder auszudrücken. – Bergi

Antwort

1

In Ihrem ersten Fall wird nichts dem a.js ausgesetzt. In Nodejs müssen Sie die exportierten Werte explizit in einer Variablen speichern.

Das heißt, wenn Sie ein Modul benötigen, wird der höchste Bereich ausgeführt, um zu erstellen, was exportiert wird. Deshalb sehen Sie, dass console.log ausgeführt wird.

Wenn Sie etwas von b.js exportieren wollten, würden Sie so etwas zu tun haben:

module.exports = { 
    testFunc: testFunc 
} 

Und in a.js

var b = require('./b.js') 
b.testFunc(1, 2) 

Mit anderen Worten, im Gegensatz zu vielen Sprachen, wenn erforderlich ein Modul. Kein Symbol wird an den globalen Gültigkeitsbereich angehängt, so dass nodejs nie wissen wird, was testFunc für das Modul b testFunc ist, ohne testFunc zu definieren.

2

Ihr Verständnis ist fehlerhaft.

"Datei Inhalt ist ausgesetzt, die Datei, die die Anfrage ausgibt" im Allgemeinen nein, nur module.exports ausgesetzt ist.

Knotenmodule werden in ihrem eigenen Bereich ausgeführt, sodass kein Code in Ihrem Modul außerhalb dieses Bereichs zugänglich ist.

module wrapper documentation

(function (exports, require, module, __filename, __dirname) { 
// Your module code actually lives in here 
}); 

Sie sehen die Log-Konsole, da alle Nachrichten auf der Konsole an den gleichen Ausgang gerichtet sind, das Terminal in diesem Fall.

Es ist ähnlich, wie console.log() Nachrichten in Browsern arbeiten. Obwohl der folgende Code in einem iframe ausgeführt wird und von der Hauptseite getrennt ist, werden die Konsolenmeldungen aus dem iframe und aus dem Hauptfenster beide an die Dev Tools-Konsole geleitet.

console.log("whoa");

1

kann eine gute Antwort auf diese in this post finden.

Wenn Sie ein Skript in Node JS (b.js in diesem Beispiel) benötigen, kann es nichts mit dem Code tun, außer es wird exportiert - es sei denn, Sie fragen das Skript, das Sie ausführen müssen.

Zum Beispiel:

a.js

'use strict'; 

    let b = require('./b.js'); 

    let result = b.testFunc(1, 4); 
    console.log(result); 

b.js

'use strict'; 

    module.exports.testFunc = function(a, b) { 
     let result = a + b; 
     return result; 
    } 

    console.log(this.testFunc(5,5));