M@XCode

Personal blog dedicated to computer science

Pourquoi et comment créer des modules sur NodeJs

Qu’est ce qu’un module ?

Un module est une partie d’un programme informatique développé par le programmeur afin d’effectuer une série de tâches précises. Chaque module contient en général plusieurs fonctionnalités. On croise aussi l’appellation package qui recouvre exactement la même notion : une brique de fonctionnalité que l’on peut utiliser et réutiliser dans n’importe quel projet.

La notion de développement par module (ou modulaire) est née dans les années 1960 lors de l’émergence du paradigme de la programmation orientée objet et la création de langages plus structurés qui pouvait en faire l’usage.

On pourrait imaginer par exemple un module dont le but serait d’envoyer un email de bienvenue à nos nouveaux inscrits. Ce dernier pourrait être utilisé à nouveau dans tous les programmes suivants que nous allons créer qui nécessiteront un email de bienvenue.

Vous ne saisissez peut-être pas immédiatement l’intérêt de créer des modules sur nodejs, car lorsqu’on débute il est plus facile d’écrire directement le bout de code qui permet l’envoi de l’email de bienvenue directement après l’enregistrement du visiteur. Mais au rythme des développements on se fait souvent la réflexion que l’on a au final déjà écrit ce bout de code plusieurs fois… D’où l’intérêt de modulariser son développement.

Pourquoi écrire des modules

Le développement modulaire permet de diviser un projet extrêmement complexe en micros brique fonctionnelles très simples rendant le travail du développeur moins titanesque et plus facilement quantifiable.

Prenons un exemple : bâtir un site e-Commerce. Il s’agit d’un projet d’envergure mais au final le site e-Commerce n’est que l’addition de fonctionnalités simples : sauvegarde et mise à jour des produits dans une base de données, gestion de la connexion des utilisateurs, envoie des emails de confirmations… En pensant le projet de façon modulaire on peut aussi se servir dans l’incroyable bibliothèque open source disponible. En particulier sur Nodejs où les modules sont nombreux et tous regroupés au sein de npm. (https://www.npmjs.com/)

Le développement par module permet aussi une meilleure couverture du code via des tests unitaires. Ce n’est probablement pas le focus de nombre de développeurs lors de l’initialisation d’un projet, mais plus le nombre de contributeurs augmentent et plus la base de code augmente plus chaque mise en production sans suite de tests unitaires assurera des sueurs froides à l’équipe.

Le développement modulaire permet aussi de casser la fameuse loi de Brooks, qui assure qu’ajouter des développeurs à un projet subissant du retard ne fait qu’aggraver ce dernier. Mais pourquoi ça ? En raison du fait qu’un code modulaire est plus compréhensible et donc que les nouveaux arrivants sur le projet n’ont pas autant besoin de formations de leurs pairs pour être opérationnels.

Créer son propre module en Nodejs

  1. Dans le dossier de votre programme créez un dossier que vous nommerez de la même manière que votre module.

Concernant le nommage une règle est de mise : il est conseiller d’être le plus explicite possible et d’appeler son module suivant sa tâche principal. Nous allons ici écrire un module qui permettant de vérifier qu’une chaine de caractère est bien un email au bon format. Nous pouvons donc appeler notre module email_checker par exemple.

  1. Dans ce dossier vous allez créer un fichier nommé index.js qui va contenir le code de notre module.

  2. Dans ce fichier index.js, localisé dans /mon_projet/email_checker/index.js nous allons définir une fonctionnalité (ce sera donc une fonction) permettant d’effectuer notre tâche : vérifier si une chaine de caractère est bien un email.

1
2
3
4
5
6
7
8
9
10
11
//  fichier : index.js

var check_that_email= function(email_to_check){

// définition d'une expression régulière matchant les emails
var regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

// on retourne le test de notre chaine de caractère (email_to_check)
return regex.test(email_to_check);

}

Notez ici la construction étrage de notre module. Nous avons en fait défnit une variable nommée check_that_email qui contient une fonction.

Cette syntaxe est très courante et il vaut mieux vous y faire, mais elle est troublantes je vous l’accorde. Reste qu’on peut bien mettre une fonction dans une variable !

  1. Il suffit maintenant d’exposer cette fonction afin de pouvoir l’utiliser dans notre programme. Pour cela nous allons utiliser la syntaxe d’exportation propre à nodejs.
1
2
3
4
5
6
7
//  fichier : index.js
//
//....
//
module.exports = {
check_that_email: check_that_email
}

Dans ce morceau de code nous exportons notre fonction check_that_email sous le nom externe check_that_email afin de pouvoir nous en servir par ailleurs.
On aurait pu l’appeler autrement :

1
2
3
4
5
6
7
//  fichier : index.js
//
//....
//
module.exports = {
can_you_check_that_email_please: check_that_email
}

Le nom public de cette fonction (ou méthode) sera maintenant can_you_check_that_email_please !

Votre module est fini ! Bravo. Utilisons le maintenant.

Utilisation de notre module

Dans n’importe quel script de notre application nous pouvons appeler notre module ainsi :

1
var email_checker = require("chemin/vers/le/dossier/email_checker");

Et nous pouvons appeler une méthode ainsi

1
var result_of_email_checking = email_checker.check_that_email("john.doe@gmail.com");

Easy !