Introduction et informations
Grâce à l'API officielle de Node.js, nous pouvons 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 être obtenus en nécessitant («nom du module»); Le module de base a la priorité de chargement la plus élevée (il sera reflété en cas de module et du module de base avec le même nom)
(Cette fois, nous parlons principalement de modules personnalisés)
Node.js a également un type de module qui est un module de fichier, qui peut être un fichier de code JavaScript (.js en tant que suffixe de fichier), un fichier texte de format JSON (.json en tant que suffixe de fichier), ou un fichier c / c ++ édité (.Node en tant que suffixe de fichier);
La méthode d'accès au module de fichier est accessible via require ('/ filename.suffix') require ('./ filename.suffix') requrie ('../ filename.suffix') et le suffixe de fichier peut être omis; À commencer par "/" est chargé d'un chemin absolu, en commençant par "./" et commencer par "../" signifie charger avec un chemin relatif, et commencer par "./" signifie charger un fichier dans un répertoire du même niveau,
Le suffixe de fichier mentionné précédemment peut être omis, le fichier JS prioritaire que Nodejs essaie de charger> Fichier JSON> Fichier Node
Créer un module personnalisé
Prenez un comptoir comme exemple
La copie de code est la suivante:
var outputVal = 0; // Valeur de sortie
Var incrément = 1; //Incrément
/ * Définir la valeur de sortie * /
fonction SeOutputVal (Val) {
OutputVal = Val;
}
/ * Définir l'incrément * /
fonction setInCrement (incmentVal) {
Incrément = incrémentVal;
}
/* Sortir*/
fonction printNextCount ()
{
outputVal + = incrément;
Console.log (OutputVal);
}
fonction printOutputVal () {
Console.log (OutputVal);
}
exports.seoutputVal = seOutputVal;
export.setincrement = setInCment;
module.exports.printNextCount = printNextCount;
Exemple de code source de module personnalisé
Le foyer de l'exemple est les exportations et modules.Exports; Il fournit une interface d'accès externe. Appelons-le pour voir l'effet.
Appeler des modules personnalisés
La copie de code est la suivante:
/ *
Un fichier node.js est un module, qui peut être des extensions JavaScript, JSON ou compilées C / C ++.
Deux objets importants:
exiger est d'obtenir des modules de l'extérieur
Les exportations expose l'interface du module
* /
var compter = require ('./ 1_modules_custom_counter');
console.log ('premier appel à module [1_Modules_Custom_counter]');
compter.seOutputVal (10); // définir le comptage à partir de 10
Counter.SetIncrement (10); // Réglez l'incrément sur 10
compter.printNextCount ();
compter.printNextCount ();
compter.printNextCount ();
compter.printNextCount ();
/ *
Exiger des appels vers le même module plusieurs fois ne seront pas chargés à plusieurs reprises
* /
var compter = require ('./ 1_modules_custom_counter');
Console.log ('Deuxième module d'appel [1_Modules_Custom_Counter]');
compter.printNextCount ();
Code source d'appel de mode personnalisé
Exécutez-le et constatez que les deux méthodes exposées au public via les exportations et le module.Exports sont accessibles!
Comme vous pouvez le voir dans l'exemple, j'obtiens le module deux fois en nécessitant ('./ 1_modules_custom_counter'), mais après la deuxième référence, j'appelle la méthode printNextCount () à partir de 60 ~~~
La raison en est que Node.js appelle le même module plusieurs fois via BesoinRequirequire et ne se chargera pas à 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 via le nom de fichier fait référence au nom de fichier réel, et il ne sera pas considéré comme différents fichiers car le 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 via exports ou module.exports,
Que se passe-t-il si vous accédez directement au fichier 1_Modules_load?
La réponse est: TypeError: objet # <objet> n'a pas de méthode 'printOutputVal'
Différence entre les exportations et le module.Exports
Grâce à l'exemple ci-dessus, les exportations et modules.Exports sont disponibles pour l'accès! Étant donné que les deux peuvent réaliser l'effet, il doit y avoir une petite différence ~~~ Prenons un exemple!
La copie de code est la suivante:
var compter = 0;
export.printNextCount = function () {
compteur + = 2;
console.log (compteur);
}
var iseq = (exports === module.exports);
Console.log (ISEQ);
2_modules_diff_exports.js Code source de fichier
Créons un nouveau fichier 2_modules_diff_exports_load.js et appelez-le
La copie de code est la suivante:
var compter = require ('./ 2_modules_diff_exports');
Compter.printNextCount ();
Après l'appel, le résultat de l'exécution est comme indiqué dans la figure ci-dessus
Je publie la valeur de l'ISEQ dans le fichier 2_modules_diff_exports_load.js (var iseq = (exports === module.exports);), le vrai true revire
PS: Notez qu'il y a trois signes égaux. Si vous ne savez pas ce que vous recherchez vous-même les informations!
Ne vous précipitez pas pour tirer des conclusions, modifiez ces deux fichiers JS en codes correspondants de module.Exports
La copie de code est la suivante:
// Le code source modifié 2_Modules_Diff_exports.js est le suivant
var compter = 0;
module.exports = function () {
compteur + = 10;
this.printNextCount = function ()
{
console.log (compteur);
}
}
var iseq = (exports === module.exports);
Console.log (ISEQ);
La copie de code est la suivante:
// Le code source de fichier modifié 2_Modules_Diff_exports_load.js est le suivant
var compter = require ('./ 2_modules_diff_exports');
var counteroBj = new Counter ();
CounterObj.printNextCount ();
Après l'appel, le résultat de l'exécution est comme indiqué dans la figure ci-dessus
Je publie la valeur de l'ISEQ dans le fichier 2_modules_diff_exports_load.js (var iseq = (exports === module.exports);), et le faux renvoyé, qui est incompatible avec le résultat obtenu avant!
PS: N'utilisez pas Counter.printNextCount (); Pour accéder, vous n'obtiendrez qu'une invite d'erreur
L'API fournit des explications
http://nodejs.org/api/modules.html
Notez que les exportations sont une référence à module.Exports le rendant adapté à l'augmentation uniquement. Si vous exportez un seul élément tel qu'un constructeur, vous voudrez utiliser le module.Exports directement à la place
Les exportations ne sont qu'une référence d'adresse à module.exports. NodeJS ne fera que l'exportation du pointeur de module.exports. Si le pointeur des exportations a changé, c'est simplement que les exportations ne pointent pas vers module.exports, ils ne seront donc plus exportés.
Reportez-vous à d'autres compréhensions:
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 l'interface réelle, les exportations ne sont qu'un outil auxiliaire. Le retour final à l'appel est module.exports au lieu d'exportations.
Toutes les propriétés et méthodes collectées par les exportations sont affectées à module.exports. Bien sûr, il y a une condition préalable à cela, c'est-à-dire que Module.Exports lui-même n'a aucun attribution ou méthodes.
Si module.exports a déjà certaines propriétés et méthodes, les informations collectées par les exportations seront ignorées.
exportations et module.Exports remplacer
Ce qui précède comprend également essentiellement la relation et la différence entre les exportations et le module.
Résultat de l'appel
Comme on peut le voir à partir des résultats, il n'y a pas d'erreur, ce qui signifie qu'il peut être défini comme celui-ci, mais dans le module de fin.
Bien que le résultat ne soit pas produit par l'erreur, si vous l'utilisez comme celui-ci, il y aura inévitablement des problèmes de développement.
1. Il est préférable de ne pas définir le module. Exports et exportations séparément
2.NODEJS Les développeurs recommandent Module.Exports à exporter des objets et des exportations pour exporter plusieurs méthodes et variables.
autre...
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 par vous-même dès que vous l'avez sorti.
module.id
Renvoie l'identifiant du module de la chaîne de type, qui est généralement le nom de fichier entièrement analysé
module.filename
Renvoie un nom de fichier entièrement analysé d'un type de chaîne
module.
Renvoie un type bool, indiquant si le chargement est terminé
module.parent
Renvoie le module qui fait référence au module
module.
Renvoie un tableau de tous les objets de module référencés par ce module