Heim  >  Artikel  >  Web-Frontend  >  Ausführliche Erläuterung des Lade- und Funktionsprinzips des Nodejs-Moduls

Ausführliche Erläuterung des Lade- und Funktionsprinzips des Nodejs-Moduls

小云云
小云云Original
2018-02-24 09:07:272822Durchsuche

Bei der Verwendung von Nodejs ist es unvermeidlich, auf Module von Drittanbietern zu verweisen. Einige von ihnen werden mit Nodejs geliefert (z. B. http, net ...), andere werden auf npm veröffentlicht (z. B. mssql, elasticsearch). .)

Dieses Kapitel konzentriert sich auf drei Themen:

  1. Nodejs-Modulladevorgang.

  2. Der Prozess des Anwendungsstarts.

  3. Wie die Anwendung abhängige Module lädt.

1. Modulladevorgang

Nodejs-Module können grob in 4 Typen unterteilt werden:

a) integrierte Modul-Nodejs Modul, das in C++ bereitgestellt wird.

b) Konstantenmodul Ein Modul, das Konstanten in Nodejs definiert.

c) natives Modul Modul, das in Javascript-Form in Nodejs bereitgestellt wird.

d) Drittmodul Module, die von Dritten bereitgestellt werden.

Sehen wir uns zunächst den Generierungsprozess des integrierten Moduls und des nativen Moduls an.

Die Generierung des nativen JS-Moduls ist relativ kompliziert. Nach der Kompilierung wird eine node_natives.h im Verzeichnis /out/release/obj/gen generiert.

Diese Datei wird von js2c.py generiert, das alle js-Dateien im lib-Verzeichnis im Nodejs-Quellcode in ASCII-Codes konvertiert und im entsprechenden Array speichert.

Der Prozess der integrierten C++-Modulgenerierung ist relativ einfach. Jeder integrierte C++-Moduleintrag wird durch das Makro NODE_MODULE_CONTEXT_AWARE_BUILTIN zu einer Funktion erweitert wird in die statische Attributfunktion (Konstruktor) void register_tcp_wrap() erweitert.

Freunde, die mit GCC vertraut sind, wissen, dass die durch das Attribut (Konstruktor) geänderte Funktion vor der main()-Funktion von Nodejs ausgeführt wird. Mit anderen Worten, das integrierte C++-Modul wird vor main() geladen. Funktion. modlist_builtin list und modlist_builtin ist ein Zeiger vom Typ struct node_module, get_builtin_module() wird durchlaufen, um das benötigte Modul zu finden.

Tatsächlich wird es letztendlich in eine ausführbare Datei kompiliert, egal ob es sich um ein naives JS-Modul oder ein integriertes C++-Modul handelt. Die Extraktionsmethoden der beiden sind sehr unterschiedlich. Das js-Modul verwendet Process.binding('natives'), während das C++-Modul get_builtin_module() direkt verwendet.

Eine binding()-Funktion wird in node.cc bereitgestellt. Wenn wir require() verwenden, um auf ein anderes Modul zu verweisen, wird die binding()-Funktion eingeführt. Lassen Sie uns diese Funktion analysieren:

Es ist visuell zu erkennen, dass die Funktion hauptsächlich drei Module bedient: eingebaut, konstant und nativ.

builtin hat die höchste Priorität und wird in modlist_builtin durchsucht. Der Vorgang ist sehr einfach: Durchsuchen Sie einfach die gesamte Liste und suchen Sie nach Modulen mit demselben Namen. Nachdem es gefunden wurde, wird zuerst die Registrierungsfunktion des Moduls ausgeführt und dann werden die Datenexporte zurückgegeben.

Das Konstantenmodul hat die zweite Priorität und die Konstantendefinitionen in Nodejs werden über Konstanten exportiert.

nativ hat die niedrigste Priorität.

2. Anwendungsstartprozess

Das obige Bild ist ein Flussdiagramm, das den Start von test.js als beschreibt Parameter beginnen und schließlich ausgeführt werden. Der gesamte Prozess kann in 4 Schritte unterteilt werden:

1. Ausführbarer Dateiknoten: Knoteneintrag, der hauptsächlich die Rolle der Umgebungsvorbereitung während des Startvorgangs spielt

2.src/node.js : Startskript

3.Natives Modul: Bereiten Sie sich auf die Ausführung von module.js vor

4.module.js: natives Modul, das zum Laden, Kompilieren und Ausführen von Anwendungen verwendet wird

Wie die Anwendung abhängige Module lädt

Wie bereits erwähnt, ist NativeModule.require() nur dafür verantwortlich, bei der Referenzierung nativer Module zu helfen, was für lib/module.js ausreicht.

Aber es ist offensichtlich, dass allgemeine Anwendungen nicht nur auf das Matatives-Modul, sondern auch auf Module von Drittanbietern verweisen müssen. Werfen wir einen Blick auf die Funktion Module.prototype._require() in module.js.

Verwandte Empfehlungen:

Grundlegende Verwendung des NodeJS-Moduls Nodemailer – Beispielcode für den E-Mail-Versand, der Anhänge unterstützt (Bild)

Umfassendes Verständnis von NodeJS

nodeJS implementiert die gemeinsame Nutzung von WeChat-Funktionen

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des Lade- und Funktionsprinzips des Nodejs-Moduls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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