Heim >Web-Frontend >js-Tutorial >Lernen Sie Nodejs mit mir --- Node.js-Modul

Lernen Sie Nodejs mit mir --- Node.js-Modul

高洛峰
高洛峰Original
2016-12-26 09:25:131439Durchsuche

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

 Lernen Sie Nodejs mit mir --- Node.js-Modul

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:

 Lernen Sie Nodejs mit mir --- Node.js-Modul

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 # has no method 'printOutputVal'

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!

Lernen Sie Nodejs mit mir --- Node.js-Modul

Erstellen Sie eine neue 2_modules_diff_exports_load.js-Datei und nennen Sie sie
var counter  = 0;     
exports.printNextCount = function (){    
    counter += 2;
    console.log(counter);
}
var isEq = (exports === module.exports);
console.log(isEq);
2_modules_diff_exports.js 文件源码

Lernen Sie Nodejs mit mir --- Node.js-Modul

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();

Lernen Sie Nodejs mit mir --- Node.js-Modul 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?

Lernen Sie Nodejs mit mir --- Node.js-Modul

Anrufergebnis

Lernen Sie Nodejs mit mir --- Node.js-Modul

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-Typs

zurü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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn