Il existe plusieurs façons d'aborder cela, chacune avec ses avantages et ses inconvénients:
require.main.filename
Depuis http://nodejs.org/api/modules.html :
Lorsqu'un fichier est exécuté directement à partir de Node, require.mainest défini sur son module. Cela signifie que vous pouvez déterminer si un fichier a été exécuté directement en testantrequire.main === module
Parce qu'il modulefournit une filenamepropriété (normalement équivalente à __filename), le point d'entrée de l'application en cours peut être obtenu en vérifiant require.main.filename.
Donc, si vous voulez le répertoire de base de votre application, vous pouvez faire:
var path = require('path');
var appDir = path.dirname(require.main.filename);
Avantages et inconvénients
Cela fonctionne beaucoup la plupart du temps, mais si vous utilisez votre application avec un lanceur comme PM2 ou en cours d' exécution mocha des tests, cette méthode échouera.
global.X
Le nœud a un objet d'espace de noms global appelé global- tout ce que vous attachez à cet objet sera disponible partout dans votre application. Ainsi, dans votre index.js(ou app.jsquel que soit le nom de votre fichier d'application principal), vous pouvez simplement définir une variable globale:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
Avantages et inconvénients
Fonctionne de manière cohérente mais vous devez vous fier à une variable globale, ce qui signifie que vous ne pouvez pas facilement réutiliser des composants / etc.
process.cwd ()
Cela renvoie le répertoire de travail actuel. Pas fiable du tout, car il est entièrement dépendant de ce répertoire a été lancé le processus de :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
chemin-racine-app
Pour résoudre ce problème, j'ai créé un module de nœud appelé app-root-path . L'utilisation est simple:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
Le module app-root-path utilise plusieurs techniques différentes pour déterminer le chemin racine de l'application, en tenant compte des modules installés globalement (par exemple, si votre application s'exécute /var/www/mais que le module est installé dans ~/.nvm/v0.x.x/lib/node/). Cela ne fonctionnera pas à 100% du temps, mais cela fonctionnera dans la plupart des scénarios courants.
Avantages et inconvénients
Fonctionne sans configuration dans la plupart des circonstances. Fournit également de belles méthodes de confort supplémentaires (voir la page du projet). Le plus gros inconvénient est que cela ne fonctionnera pas si:
- Vous utilisez un lanceur, comme pm2
- ET , le module n'est pas installé dans le
node_modulesrépertoire de votre application (par exemple, si vous l'avez installé globalement)
Vous pouvez contourner cela en définissant une APP_ROOT_PATHvariable d'environnement ou en appelant .setPath()le module, mais dans ce cas, vous feriez probablement mieux d'utiliser la globalméthode.
Variable d'environnement NODE_PATH
Si vous cherchez un moyen de déterminer le chemin racine de l'application actuelle, l'une des solutions ci-dessus est susceptible de fonctionner le mieux pour vous. Si, d'un autre côté, vous essayez de résoudre le problème du chargement fiable des modules d'application, je vous recommande fortement d'examiner la NODE_PATHvariable d'environnement.
Le système de modules de Node recherche des modules dans divers emplacements. L'un de ces emplacements est partout où il process.env.NODE_PATHpointe . Si vous définissez cette variable d'environnement, vous pouvez alors requireutiliser des modules avec le chargeur de module standard sans aucune autre modification.
Par exemple, si vous définissez NODE_PATHsur /var/www/lib, ce qui suit fonctionnerait très bien:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
Une excellente façon de procéder consiste à utiliser npm:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
Vous pouvez maintenant démarrer votre application avec npm startet vous êtes en or. Je combine cela avec mon module enforce-node-path , ce qui empêche de charger accidentellement l'application sans NODE_PATHdéfinir. Pour encore plus de contrôle sur l'application des variables d'environnement, voir checkenv .
One gotcha: NODE_PATH doit être défini en dehors de l'application de nœud. Vous ne pouvez pas faire quelque chose comme process.env.NODE_PATH = path.resolve(__dirname)parce que le chargeur de module met en cache la liste des répertoires qu'il recherchera avant l'exécution de votre application.
[ajouté le 4/6/16] Un autre module vraiment prometteur qui tente de résoudre ce problème est ondulé .