Maison >interface Web >js tutoriel >Comprendre le chargement des modules dans Nodejs

Comprendre le chargement des modules dans Nodejs

青灯夜游
青灯夜游avant
2021-01-22 17:40:403008parcourir

Cet article vous présentera le chargement du module dans nodejs. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comprendre le chargement des modules dans Nodejs

Recommandations associées : "Tutoriel nodejs"

Lors de l'utilisation de Nodejs, il est inévitable de référencer des modules tiers . Certains sont intégrés avec Nodejs (par exemple : http, net...), et certains sont publiés sur npm (par exemple : mssql, elasticsearch...)

Ceci. L'article se concentre sur 3 questions :

1. Le processus de chargement du module Nodejs.

2. Processus de démarrage de l'application.

3. Comment l'application charge-t-elle 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é Un module fourni sous forme C++ dans Nodejs.

b) module constante Un module qui définit des constantes dans Nodejs.

c) module natif Un module fourni sous forme javascript dans Nodejs.

d) Module tiers Module fourni par un tiers.

Regardons d'abord le processus de génération du module intégré et du module natif.

Comprendre le chargement des modules dans Nodejs

La génération du module JS natif est relativement compliquée Après compilation, il sera in /out/. release/obj Générez un node_natives.h dans le répertoire /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.

module C++ intégré Le processus de génération est relativement simple. Chaque entrée du module C++ intégré sera développée en une fonction via la macro NODE_MODULE_CONTEXT_AWARE_BUILTIN, telle que la macro NODE_MODULE_CONTEXT_AWARE_BUILTIN. Module tcp_wrap Par exemple, il sera développé en une 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é, constantes 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 trouver 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é . Les définitions de constantes dans Nodejs sont exportées via des constantes.

le 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 comment test.js est démarré en tant que paramètre et finalement 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-t-elle les modules dépendants

Comme mentionné précédemment, NativeModule.require() est uniquement chargé d'aider au référencement des 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 aussi les modules tiers. Jetons un coup d'œil à la fonction Module.prototype._require(). dans module.js.

Pour plus de connaissances liées à la programmation, veuillez visiter : Enseignement de la programmation ! !

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer