Maison  >  Article  >  interface Web  >  Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

WBOY
WBOYoriginal
2016-05-16 16:47:001173parcourir

Présentation et informations

Grâce à l'API officielle de Node.js, vous pouvez voir que Node.js lui-même fournit de nombreux modules de base http://nodejs.org/api/ Ces modules de base sont compilés dans des fichiers binaires et peuvent nécessiter ('nom du module. ') Allez le chercher ; le module principal a la priorité de chargement la plus élevée (cela se reflétera lorsqu'il y aura un module portant le même nom que le module principal)

(Cette fois je parle principalement de modules personnalisés)

Node.js possède également un type de module appelé module de fichier, qui peut être un fichier de code JavaScript (.js comme suffixe de fichier), un fichier texte au format JSON (.json comme suffixe de fichier) ou un fichier édité. Fichier C/C (.node comme suffixe de fichier) ;

La méthode d'accès au module de fichier se fait via require('/filename.suffix') require('./filename.suffix') requrie('../filename.suffix') pour y accéder, le suffixe du fichier peut être omis ; avec Commencer par "/" signifie charger avec un chemin absolu, commencer par "./" et commencer par "../" signifie charger avec un chemin relatif, et commencer par "./" signifie charger des fichiers dans le même répertoire,

Comme mentionné précédemment, le suffixe du fichier peut être omis. Nodejs essaie de charger le fichier js prioritaire >

Créer un module personnalisé

Prenons un compteur comme exemple

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

var outputVal = 0 //Valeur de sortie;
var incrément = 1; //Incrément
/* Définir la valeur de sortie*/
function seOutputVal (val) {
outputVal = val;
}
/* Définir l'incrément */
function setIncrement(incrementVal){
incrément = incrémentVal;
}
/* sortie*/
fonction printNextCount()
{
outputVal = incrément;
console.log(outputVal) ;
>
function printOutputVal() {
console.log(outputVal);
>
exports.seOutputVal = seOutputVal;
exports.setIncrement = setIncrement;
module.exports.printNextCount = printNextCount;
Exemple de code source du module personnalisé


L'exemple se concentre sur les exportations et module.exports ; il fournit une interface pour un accès externe. Appelons-le ci-dessous pour voir l'effet.

Appeler le module personnalisé

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

/*
Un Node.js est un module, ce fichier peut être du code Javascript, JSON ou une extension C/C compilée.
Deux objets importants :
require consiste à obtenir le module de l'extérieur
exports consiste à exposer l'interface du module
*/
var counter = require('./1_modules_custom_counter');
console.log('Premier appel au module [1_modules_custom_counter]');
counter.seOutputVal(10); //Définir le comptage à partir de 10
counter.setIncrement (10);
counter.printNextCount); ();
counter.printNextCount();
counter.printNextCount();
counter.printNextCount();
/*
nécessite d'appeler le même module plusieurs fois Ne se chargera pas à plusieurs reprises
*/
var counter = require('./1_modules_custom_counter');
console.log('Deuxième appel au module [1_modules_custom_counter]');
counter.printNextCount( );
Custom mode appelant le code source

Lors de l'exécution, vous pouvez constater que toutes les méthodes exposées via exports et module.exports sont accessibles !

Comme vous pouvez le voir dans l'exemple, j'ai obtenu le module via require('./1_modules_custom_counter') deux fois, mais la méthode printNextCount() a démarré à partir de 60 après la deuxième référence~~~

La raison est que si node.js appelle le même module plusieurs fois via requirerequire, il ne sera pas chargé à plusieurs reprises. Node.js mettra en cache tous les modules de fichiers chargés en fonction du nom du fichier, il ne sera donc pas rechargé

Remarque : la mise en cache par nom de fichier fait référence au nom de fichier réel, et il ne sera pas considéré comme un fichier différent simplement parce que le formulaire du chemin entrant est différent

.

Il existe une méthode printOutputVal() dans le fichier 1_modules_custom_counter que j'ai créé, qui ne fournit pas de méthodes d'accès public externes via exports ou module.exports,

Que se passera-t-il si le fichier 1_modules_load est directement accédé et exécuté ?

La réponse est : TypeError : l'objet # n'a pas de méthode 'printOutputVal'

La différence entre les exportations et module.exports

Après l'exemple ci-dessus, il est accessible via les méthodes publiques exports et module.exports ! Donc, puisque les deux peuvent produire l'effet, il doit y avoir quelques différences ~~~ Prenons un exemple !

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

Copier le code Le code est le suivant :
var counter = 0
exports; .printNextCount = function (){
counter = 2;
console.log(counter);
}
var isEq = (exports === module.exports);
console.log (isEq) ;
Code source du fichier 2_modules_diff_exports.js

Créons un nouveau fichier 2_modules_diff_exports_load.js et appelons-le

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

Copier le code Le code est le suivant :
var Counter = require('./2_modules_diff_exports ');
Counter.printNextCount();

Après l'appel, le résultat de l'exécution est comme indiqué ci-dessus

J'affiche la valeur de isEq dans le fichier 2_modules_diff_exports_load.js ( var isEq = (exports === module.exports); ), et le vrai renvoyé

PS : Notez qu'il y a trois signes égaux. Si vous n'êtes pas sûr, veuillez vérifier vous-même les informations !

Ne vous précipitez pas pour tirer des conclusions, changez ces deux fichiers JS dans les codes correspondants de module.exports

Copier le code Le code est le suivant :
//Le code source 2_modules_diff_exports.js modifié est le suivant
var counter = 0;
module.exports = function(){
counter = 10;
this.printNextCount = function()
{
console.log( compteur);
}
>
var isEq = (exports === module.exports);
console.log(isEq);

Copier le code Le code est le suivant :
//La source du fichier 2_modules_diff_exports_load.js modifié le code est le suivant
var Counter = require('./2_modules_diff_exports');
var counterObj = new Counter();
counterObj.printNextCount();

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

Après l'appel, le résultat de l'exécution est comme indiqué ci-dessus

J'ai affiché la valeur de isEq dans le fichier 2_modules_diff_exports_load.js ( var isEq = (exports === module.exports); ), et j'ai renvoyé false, ce qui est incohérent avec les résultats obtenus précédemment !

PS : N'utilisez pas Counter.printNextCount(); pour y accéder, vous n'aurez qu'un message d'erreur

L'API fournit des explications

http://nodejs.org/api/modules.html

Notez que exports est une référence à module.exports, ce qui le rend adapté uniquement à l'augmentation. Si vous exportez un seul élément tel qu'un constructeur, vous souhaiterez utiliser module.exports directement à la place.
exports n'est que module.exports. une référence d'adresse. Nodejs n'exportera que le point de module.exports. Si le pointeur d'exports change, cela signifie que exports ne pointe plus vers module.exports, il ne sera donc plus exporté

.

Se référer à d'autres interprétations :

http://www.hacksparrow.com/node-js-exports-vs-module-exports.html

http://zihua.li/2012/03/use-module-exports-or-exports-in-node/

module.exports est la véritable interface, et exports n'est qu'un outil auxiliaire pour celle-ci. Ce qui est finalement renvoyé à l'appel est module.exports au lieu d'exports.
Tous les attributs et méthodes collectés par les exports sont attribués à Module.exports. Bien sûr, il y a une prémisse pour cela, c'est-à-dire que module.exports lui-même n'a aucune propriété ni méthode.
Si module.exports possède déjà des propriétés et des méthodes, alors les informations collectées par les exportations seront ignorées.

les exportations et module.exports couvrent

Ce qui précède comprend également fondamentalement la relation et la différence entre exports et module.exports, mais quel est le résultat si exports et module.exports existent pour la méthode printNextCount() en même temps ?

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

Résultat de l'appel

Apprenez Nodejs avec moi (3) --- Compétences Node.js module_javascript

Il ressort des résultats qu'aucune erreur n'est signalée, indiquant qu'elle peut être définie de cette manière, mais à la fin module.exports remplace les exportations

Bien que le résultat ne signalera pas d'erreur, il y aura inévitablement des problèmes lors du développement s'il est utilisé de cette manière, donc

1. Il est préférable de ne pas définir module.exports et exports séparément

2. Les développeurs NodeJs recommandent d'utiliser module.exports pour exporter des objets et exports

pour exporter plusieurs méthodes et variables.

Autres...

Il existe d'autres méthodes fournies dans l'API, donc je n'entrerai pas dans les détails. Sur la base de l'exemple ci-dessus, vous le saurez par vous-même dès que vous le sortirez

module.id

Renvoie l'identifiant du module de type chaîne, généralement le nom du fichier entièrement analysé

module.filename

Renvoie un nom de fichier entièrement analysé de type chaîne

Module.chargé

Renvoie un type booléen indiquant si le chargement est terminé

module.parent

Renvoie le module qui référence ce module

module.enfants

Renvoie un tableau de tous les objets de module référencés par ce module

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn