Node.js - 5.15 Créer un module utilitaire pour le dossier racine

Construire à chaque fois un chemin vers le dossier racine répète du code et devient fragile. Cette leçon regroupe ce calcul dans un petit module utilitaire. On l'importe ensuite dans les fichiers qui en ont besoin.

Repérer le fichier principal

La variable globale process contient une propriété mainModule. Elle désigne le module principal, c'est-à-dire le fichier qui a démarré l'application. Sa propriété filename donne le chemin complet de ce fichier.

Créer le module utilitaire

Créez un dossier util, avec un fichier path.js. Ce fichier importe le module path et exporte le nom du dossier du fichier principal grâce à path.dirname(). L'export est donc directement le chemin du dossier racine.

// util/path.js
const path = require('path');

module.exports = path.dirname(process.mainModule.filename);

Importer le dossier racine

Dans un autre fichier, on importe ce module avec require, en remontant d'un niveau avec '..'. Le nom de la variable est libre, par exemple rootDir. Il suffit ensuite de l'utiliser avec path.join(), le module path étant déjà importé dans ce fichier.

const rootDir = require('../util/path');

res.sendFile(path.join(rootDir, 'views', 'shop.html'));

En résumé

Un module utilitaire calcule une seule fois le dossier racine du projet. Les autres fichiers l'importent avec require. Les chemins construits avec path.join() fonctionnent ainsi sur tous les systèmes d'exploitation.

Points clés

  • La propriété process.mainModule.filename désigne le fichier qui a démarré l'application.
  • path.dirname() renvoie le dossier d'un chemin de fichier.
  • Le module utilitaire exporte directement le chemin du dossier racine.
  • Un autre fichier importe ce chemin avec require et remonte avec '..' si besoin.
  • Le calcul est écrit une seule fois, au lieu d'être répété dans chaque fichier.

Questions fréquentes

Pourquoi créer un fichier utilitaire plutôt que copier le calcul ?

Le calcul n'est écrit qu'une fois. Si le chemin doit changer, une seule modification suffit.

Ce code fonctionne-t-il sous Windows ?

Oui. path.dirname() et path.join() gèrent les séparateurs de chaque système d'exploitation.

process.mainModule est-il encore recommandé ?

Dans les versions récentes de Node.js, process.mainModule est déprécié. require.main est l'équivalent recommandé pour retrouver le fichier principal.