Introduction 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. fichiers binaires, vous pouvez l'obtenir avec require('module name'); 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 on 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 du fichier), un fichier texte au format JSON (.json comme suffixe de fichier), ou un fichier C/C modifié File (.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 en commençant par "/" signifie un chargement avec un chemin absolu, commençant par "./" et commençant par " ; ../" signifie charger avec un chemin relatif et commencer par "./" Représente les fichiers dans le même répertoire,
Comme mentionné précédemment, le suffixe du fichier peut être omis. Le fichier js prioritaire que Nodejs essaie de charger> ; fichier json> fichier de nœud
Créer un module personnalisé
Prendre un compteur comme exemple
var outputVal = 0; //输出值 var increment = 1; //增量 /* 设置输出值 */ function seOutputVal (val) { outputVal = val; } /* 设置增量 */ function setIncrement(incrementVal){ increment = incrementVal; } /* 输出 */ function printNextCount() { outputVal += increment; console.log(outputVal) ; } function printOutputVal() { console.log(outputVal); } exports.seOutputVal = seOutputVal; exports.setIncrement = setIncrement; module.exports.printNextCount = printNextCount; 自定义模块 示例源码
Le focus du L'exemple est exports et module.exports ; il fournit une interface pour un accès externe. Appelons-le ci-dessous pour voir l'effet.
Appelons le module personnalisé
/* 一个Node.js文件就是一个模块,这个文件可能是Javascript代码、JSON或者编译过的C/C++扩展。 重要的两个对象: require是从外部获取模块 exports是把模块接口公开 */ var counter = require('./1_modules_custom_counter'); console.log('第一次调用模块[1_modules_custom_counter]'); counter.seOutputVal(10); //设置从10开始计数 counter.setIncrement (10); //设置增量为10 counter.printNextCount(); counter.printNextCount(); counter.printNextCount(); counter.printNextCount(); /* require多次调用同一模块不会重复加载 */ var counter = require('./1_modules_custom_counter'); console.log('第二次调用模块[1_modules_custom_counter]'); counter.printNextCount(); 自定义模式调用 源码
Exécutez-le et vous constaterez 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 l'appel de la méthode printNextCount() après la deuxième référence a commencé à partir de 60~~~
La raison est que node.js ne chargera pas le même module plusieurs fois via requirerequire. 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 : Par nom de fichier Le cache fait référence au nom réel du fichier, et il ne sera pas reconnu comme un fichier différent simplement parce que le format du chemin transmis est différent
Il existe une méthode printOutputVal() dans le fichier 1_modules_custom_counter I. créé, qui ne transmet pas les exportations Ou module.exports fournit des méthodes d'accès public externes,
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 #
La différence entre les exportations et module.exports
Après l'exemple ci-dessus, via exports et module Toutes les méthodes exposées au monde extérieur dans .exports sont accessibles ! Donc, puisque les deux peuvent obtenir l'effet, il doit y avoir quelques différences ~~~ Jetons un coup d'œil avec un exemple !
var counter = 0; exports.printNextCount = function (){ counter += 2; console.log(counter); } var isEq = (exports === module.exports); console.log(isEq); 2_modules_diff_exports.js 文件源码
Créez un nouveau fichier 2_modules_diff_exports_load.js et appelez-le
var Counter = require('./2_modules_diff_exports'); Counter.printNextCount();
Après l'appel, exécutez Le résultat 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 que Trois signes égaux, si vous n'êtes pas sûr, veuillez vérifier les informations vous-même !
Ne vous précipitez pas pour tirer des conclusions, changez ces deux fichiers JS respectivement dans les codes correspondants de module.exports
//修改后的2_modules_diff_exports.js源码如下 var counter = 0; module.exports = function(){ counter += 10; this.printNextCount = function() { console.log(counter); } } var isEq = (exports === module.exports); console.log(isEq);
//修改后的2_modules_diff_exports_load.js文件源码如下 var Counter = require('./2_modules_diff_exports'); var counterObj = new Counter(); counterObj.printNextCount();
Après avoir 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 false renvoyé est différent du résultat précédent. Incohérent !
PS : N'utilisez pas Counter.printNextCount(); pour y accéder, vous n'aurez qu'un message d'erreur
L'API fournit une explication
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 est juste une référence d'adresse de module.exports. 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é
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.
Couverture des exportations et module.exports
Ce qui précède comprend également fondamentalement la relation et la différence entre les exportations et module.exports, mais s'il existe des exportations et module.exports pour la méthode printNextCount() à en même temps, le résultat comment ?
Résultat de l'appel
Il ressort du résultat qu'aucune erreur n'est signalée, ce qui indique qu'elle peut être défini de cette manière, mais au final le module .exports couvre les exportations
Bien que le résultat ne soit pas une erreur, s'il est utilisé de cette manière, il y aura inévitablement des problèmes lors du développement, donc
1. Il est préférable de ne pas définir module.exports et exports
2. Les développeurs NodeJs recommandent d'utiliser module.exports pour exporter des objets et exports pour exporter plusieurs méthodes et variables Autres... D'autres méthodes sont également fournies dans l'API. 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 sortirez . module.id Renvoie l'identifiant du module de type chaîne, généralement le nom de fichier entièrement analysé Module.filename Renvoie un nom de fichier entièrement analysé de type chaînemodule.loaded Renvoie un type booléen, indiquant si le chargement est terminé Module.parent Renvoie le module qui fait référence à ce module module.children Renvoie un tableau de tous les objets module référencés par ce module Pour plus d'articles liés aux modules Node.js, veuillez faire attention au site Web PHP chinois !