Heim >Web-Frontend >js-Tutorial >Lernen Sie Nodejs mit mir --- Node.js-Modul
Einführung und Informationen
Über die offizielle API von Node.js können Sie sehen, dass Node.js selbst viele Kernmodule bereitstellt: http://nodejs.org/api/ Diese Kernmodule sind kompiliert Binärdateien können Sie mit require('module name') abrufen. Das Kernmodul hat die höchste Ladepriorität (dies wird angezeigt, wenn es ein Modul mit demselben Namen wie das Kernmodul gibt)
( Dieses Mal sprechen wir hauptsächlich über benutzerdefinierte Module)
Node.js verfügt auch über einen Modultyp namens Dateimodul, bei dem es sich um eine JavaScript-Codedatei (.js als Dateisuffix) und eine Textdatei im JSON-Format handeln kann (.json als Dateisuffix) oder eine bearbeitete C/C++-Datei (.node als Dateisuffix);
Die Zugriffsmethode für das Dateimodul erfolgt über require('/filename.suffix') require('. /filename.suffix') requrie('../filename. suffix ') Für den Zugriff kann das Dateisuffix weggelassen werden. Beginnend mit „/“ bedeutet das Laden mit einem absoluten Pfad, beginnend mit „./“ und beginnend mit „. ./“ bedeutet Laden mit einem relativen Pfad und beginnend mit „./“ Zeigt Dateien im Verzeichnis derselben Ebene an,
Wie bereits erwähnt, kann das Dateisuffix weggelassen werden. Die Prioritäts-JS-Datei, die Nodejs zu laden versucht >JSON-Datei>Knotendatei
Erstellen Sie ein benutzerdefiniertes Modul
Nehmen Sie einen Zähler als Beispiel
var outputVal = 0; //输出值 var increment = 1; //增量 /* 设置输出值 */ function seOutputVal (val) { outputVal = val; } /* 设置增量 */ function setIncrement(incrementVal){ increment = incrementVal; } /* 输出 */ function printNextCount() { outputVal += increment; console.log(outputVal) ; } function printOutputVal() { console.log(outputVal); } exports.seOutputVal = seOutputVal; exports.setIncrement = setIncrement; module.exports.printNextCount = printNextCount; 自定义模块 示例源码
Der Fokus des Das Beispiel bezieht sich auf exports und module.exports. Rufen Sie es unten auf, um den Effekt zu sehen:
Beim Ausführen können Sie feststellen, dass auf alle über exports und module.exports verfügbar gemachten Methoden zugegriffen werden kann!/* 一个Node.js文件就是一个模块,这个文件可能是Javascript代码、JSON或者编译过的C/C++扩展。 重要的两个对象: require是从外部获取模块 exports是把模块接口公开 */ var counter = require('./1_modules_custom_counter'); console.log('第一次调用模块[1_modules_custom_counter]'); counter.seOutputVal(10); //设置从10开始计数 counter.setIncrement (10); //设置增量为10 counter.printNextCount(); counter.printNextCount(); counter.printNextCount(); counter.printNextCount(); /* require多次调用同一模块不会重复加载 */ var counter = require('./1_modules_custom_counter'); console.log('第二次调用模块[1_modules_custom_counter]'); counter.printNextCount(); 自定义模式调用 源码
Wie Sie im Beispiel sehen können, habe ich das Modul zweimal über require('./1_modules_custom_counter') erhalten, aber die Methode printNextCount() startete nach der zweiten Referenz bei 60~~~
Der Grund dafür ist, dass node.js das gleiche Modul nicht mehrmals über requirerequire lädt. Node.js speichert alle geladenen Dateimodule entsprechend dem Dateinamen, sodass es nicht neu geladen wird
Hinweis: Von Dateiname Der Cache bezieht sich auf den tatsächlichen Dateinamen und wird nicht als eine andere Datei erkannt, nur weil das übergebene Pfadformat anders ist.
In der von mir erstellten Datei 1_modules_custom_counter gibt es eine printOutputVal()-Methode , das keine Exporte übergibt Oder module.exports bietet externe öffentliche Zugriffsmethoden,
Was passiert, wenn direkt auf die Datei 1_modules_load zugegriffen und diese ausgeführt wird?
Die Antwort lautet: TypeError: Object #
Der Unterschied zwischen exports und module.exports
Nach dem obigen Beispiel durch Exporte und Module Auf alle Methoden, die in .exports der Außenwelt zugänglich gemacht werden, kann zugegriffen werden! Da also beide den Effekt erzielen können, muss es einige Unterschiede geben ~~~ Nehmen wir ein Beispiel!
Erstellen Sie eine neue 2_modules_diff_exports_load.js-Datei und nennen Sie sievar counter = 0; exports.printNextCount = function (){ counter += 2; console.log(counter); } var isEq = (exports === module.exports); console.log(isEq); 2_modules_diff_exports.js 文件源码Nach dem Aufruf ausführen Das Ergebnis ist wie oben gezeigt
var Counter = require('./2_modules_diff_exports'); Counter.printNextCount();
Ich gebe den Wert von isEq in der Datei 2_modules_diff_exports_load.js aus ( var isEq = (exports === module.exports); ) und der zurückgegebene Wert true
PS: Beachten Sie, dass drei Gleichheitszeichen vorhanden sind. Wenn Sie sich nicht sicher sind, überprüfen Sie die Informationen bitte selbst!
Ziehen Sie keine voreiligen Schlüsse, sondern ändern Sie diese beiden JS-Dateien in die entsprechenden Codes von module.exports.
//修改后的2_modules_diff_exports.js源码如下 var counter = 0; module.exports = function(){ counter += 10; this.printNextCount = function() { console.log(counter); } } var isEq = (exports === module.exports); console.log(isEq);
//修改后的2_modules_diff_exports_load.js文件源码如下 var Counter = require('./2_modules_diff_exports'); var counterObj = new Counter(); counterObj.printNextCount();
Nach dem Anruf , das Ausführungsergebnis ist wie oben gezeigt
Ich gebe den Wert von isEq in der Datei 2_modules_diff_exports_load.js aus ( var isEq = (exports === module.exports); ), und der zurückgegebene Wert „false“ unterscheidet sich vom vorheriges Ergebnis. Inkonsistent!
PS: Verwenden Sie nicht Counter.printNextCount(); um darauf zuzugreifen, erhalten Sie nur eine Fehlermeldung
Die API liefert eine Erklärung
http://nodejs. org /api/modules.html
Beachten Sie, dass exports ein Verweis auf module.exports ist und daher nur für die Erweiterung geeignet ist. Wenn Sie ein einzelnes Element wie einen Konstruktor exportieren, sollten Sie module.exports direkt verwenden Stattdessen ist
Exports nur eine Adressreferenz von module.exports. nodejs exportiert nur den Punkt von module.exports. Wenn sich der Exportzeiger ändert, bedeutet dies, dass exports nicht mehr auf module.exports zeigt und daher nicht mehr exportiert wird module.exports ist die eigentliche Schnittstelle und exports ist nur ein Hilfstool dafür. Was letztendlich an den Aufruf zurückgegeben wird, ist module.exports anstelle von exports.
Alle durch Exporte gesammelten Attribute und Methoden werden Module.exports zugewiesen. Dafür gibt es natürlich eine Voraussetzung, dass module.exports selbst keine Eigenschaften und Methoden hat.
Wenn module.exports bereits über einige Eigenschaften und Methoden verfügt, werden die von exports gesammelten Informationen ignoriert.
Abdeckung von Exporten und module.exports
Das Obige versteht im Grunde auch die Beziehung und den Unterschied zwischen Exporten und module.exports, aber wenn es Exporte und module.exports für die Methode printNextCount() gibt zur gleichen Zeit, das Ergebnis, wie?
Anrufergebnis
Aus dem Ergebnis ist ersichtlich, dass kein Fehler gemeldet wird, was darauf hindeutet, dass dies der Fall sein kann Auf diese Weise definiert, aber am Ende deckt das Modul .exports Exporte ab
Obwohl das Ergebnis kein Fehler ist, wird es bei dieser Verwendung zwangsläufig zu Problemen während der Entwicklung kommen, also
1. Es ist am besten, module.exports und exports
2. NodeJs-Entwickler empfehlen die Verwendung von module.exports zum Exportieren von Objekten und exports zum Exportieren mehrerer Methoden und Variablen Andere... Andere Methoden werden auch in der API bereitgestellt. Basierend auf dem obigen Beispiel werden Sie es selbst wissen, sobald Sie ausgeben module.id Gibt die Modul-ID des String-Typs zurück, normalerweise den vollständig analysierten Dateinamen Module.filename Gibt einen vollständig analysierten Dateinamen des String-Typszurück
module.loaded Gibt einen Bool-Typ zurück, der angibt, ob der Ladevorgang abgeschlossen ist Module.parent Gibt das Modul zurück, das auf dieses Modul verweist module.children Gibt ein Array aller Modulobjekte zurück, auf die dieses Modul verweist Weitere Artikel zu Node.js-Modulen finden Sie auf der chinesischen PHP-Website!