Maison > Article > interface Web > Explication détaillée du chargement du module Nodejs et du principe de fonctionnement
Lors de l'utilisation de Nodejs, il est inévitable de référencer des modules tiers. Certains d'entre eux sont livrés avec Nodejs (par exemple : http, net...), et certains sont publiés sur npm (par exemple : mssql, elasticsearch.. .)
Ce chapitre se concentre sur 3 problématiques :
Le processus de chargement du module Nodejs.
Le processus de démarrage de l'application.
Comment l'application charge les modules dépendants.
1. Processus de chargement des modules
Les modules Nodejs peuvent être grossièrement divisés en 4 types :
a) module intégré Nodejs module fourni en C++.
b) module constante Un module qui définit les constantes dans Nodejs.
c) module natif Module fourni sous forme javascript dans Nodejs.
d) Module tiers Modules fournis par des tiers.
Regardons d'abord le processus de génération du module intégré et du module natif.
La génération du module JS natif est relativement compliquée. Après compilation, un node_natives.h sera généré dans le répertoire /out/release/obj/gen.
Ce fichier est généré par js2c.py, qui convertit tous les fichiers js du répertoire lib du code source Nodejs en codes ASCII et les stocke dans le tableau correspondant.
Le processus de génération du module C++ intégré est relativement simple. Chaque entrée du module C++ intégré sera développée en fonction via la macro NODE_MODULE_CONTEXT_AWARE_BUILTIN. Par exemple, pour le module tcp_wrap, il. sera développé en fonction d'attribut (constructeur) static void register_tcp_wrap().
Les amis qui connaissent GCC savent que la fonction modifiée par attribut (constructeur) sera exécutée avant la fonction main() de Nodejs En d'autres termes, le module C++ intégré sera chargé avant la fonction main(). fonction. modlist_builtin list, et modlist_builtin est un pointeur de type struct node_module, get_builtin_module() parcourra pour trouver le module dont nous avons besoin.
En fait, qu'il s'agisse d'un module JS naïf ou d'un module C++ intégré, il sera éventuellement compilé dans un fichier exécutable. Les méthodes d'extraction des deux sont assez différentes. Le module js utilise process.binding('natives'), tandis que le module C++ utilise directement get_builtin_module().
Une fonction liaison() est fournie dans node.cc. Lorsque nous utilisons require() pour référencer un autre module, la fonction liaison() sera introduite. Analysons cette fonction :
On peut voir visuellement que la fonction dessert principalement trois modules : intégré, constants et natif.
builtin a la priorité la plus élevée et sera recherché dans modlist_builtin. Le processus est très simple, il suffit de parcourir toute la liste et de rechercher les modules portant le même nom. Une fois trouvée, la fonction d'enregistrement du module sera exécutée en premier, puis les exportations de données seront renvoyées.
Le module constantes a la deuxième priorité, et les définitions de constantes dans Nodejs sont exportées via des constantes.
natif a la priorité la plus basse.
2. Processus de démarrage de l'application
L'image ci-dessus est un organigramme, qui décrit le démarrage de test.js comme un paramètre Begin et éventuellement être exécuté. L'ensemble du processus peut être divisé en 4 étapes :
1. Nœud de fichier exécutable : entrée du nœud, qui joue principalement le rôle de préparation de l'environnement lors du processus de démarrage
2.src/node.js : script de démarrage
3.Native Module : Préparer l'exécution de module.js
4.module.js : module natif, utilisé pour charger, compiler et exécuter des applications
Comment l'application charge les modules dépendants
Comme mentionné précédemment, NativeModule.require() est uniquement chargé d'aider à référencer les modules natifs, ce qui est suffisant pour lib/module.js.
Mais il est évident que les applications générales doivent référencer non seulement le module matatives, mais également les modules tiers. Jetons un coup d'œil à la fonction Module.prototype._require() dans module.js.
Recommandations associées :
Compréhension approfondie de NodeJS
nodeJS implémente le partage de fonctions WeChat
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!