Maison > interface Web > js tutoriel > le corps du texte

Apprenez Nodejs avec moi --- module Node.js

高洛峰
Libérer: 2016-12-26 09:25:13
original
1414 Les gens l'ont consulté

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

 Apprenez Nodejs avec moi --- module Node.js

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;
自定义模块 示例源码
Copier après la connexion

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é

 Apprenez Nodejs avec moi --- module Node.js

/*
    一个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();
自定义模式调用 源码
Copier après la connexion
.

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 # n'a pas de méthode 'printOutputVal'

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 !

Apprenez Nodejs avec moi --- module Node.js

var counter  = 0;     
exports.printNextCount = function (){    
    counter += 2;
    console.log(counter);
}
var isEq = (exports === module.exports);
console.log(isEq);
2_modules_diff_exports.js 文件源码
Copier après la connexion

Créez un nouveau fichier 2_modules_diff_exports_load.js et appelez-le

Apprenez Nodejs avec moi --- module Node.js

var Counter = require('./2_modules_diff_exports');
Counter.printNextCount();
Copier après la connexion

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);
Copier après la connexion
//修改后的2_modules_diff_exports_load.js文件源码如下
var Counter = require('./2_modules_diff_exports');
var counterObj = new Counter();
counterObj.printNextCount();
Copier après la connexion

Apprenez Nodejs avec moi --- module Node.js

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 ?

Apprenez Nodejs avec moi --- module Node.js

Résultat de l'appel

Apprenez Nodejs avec moi --- module Node.js

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îne

module.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 !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal