302 votes

l'équivalent node.js de python if __name__ == '__main__'

Je voudrais vérifier si mon module est inclus ou exécuté directement. Comment puis-je faire cela dans node.js ?

2 votes

isMain c

1 votes

La seule référence significative que je peux trouver est dans un Gist de CJ Silveiro décrivant la proposition/vision de NPM pour les modules ESM dans Node. Je n'ai pas été en mesure de trouver quelque chose d'officiel de la part de Node.js eux-mêmes. Tout lien serait apprécié

407voto

Stephen Emslie Points 2548

Les docs décrire une autre façon de procéder qui pourrait être la méthode préférée :

Lorsqu'un fichier est exécuté directement depuis Node, require.main est défini comme son module.

Pour en tirer parti, vérifiez si ce module est le module principal et, si c'est le cas, appelez votre code principal :

function myMain() {
    // main code
}

if (require.main === module) {
    myMain();
}

EDIT : Si vous utilisez ce code dans un navigateur, vous obtiendrez une "Reference error" car "require" n'est pas défini. Pour éviter cela, utilisez :

if (typeof require !== 'undefined' && require.main === module) {
    myMain();
}

17 votes

Vous devez toujours vérifier que require.main === module indépendamment de de votre nom de fonction. Pour être clair, le code ci-dessus doit être modifié comme suit : var fnName = function(){ // code } if (require.main === module) { fnName(); }

0 votes

Je l'entourerais de try...catch pour la compatibilité avec les navigateurs.

4 votes

@OhadCohen "try...catch" pourrait aussi attraper de vraies erreurs. Je pense qu'il est préférable de simplement vérifier si typeof require != 'undefined'.

65voto

nornagon Points 4744
if (!module.parent) {
  // this is the main module
} else {
  // we were require()d from somewhere else
}

EDIT : Si vous utilisez ce code dans un navigateur, vous obtiendrez une "erreur de référence" car "module" n'est pas défini. Pour éviter cela, utilisez :

if (typeof module !== 'undefined' && !module.parent) {
  // this is the main module
} else {
  // we were require()d from somewhere else or from a browser
}

0 votes

Est-ce que cela est documenté quelque part ?

11 votes

Non, mais c'est utilisé dans l'un des cas suivants. Les tests de node.js

1 votes

Pour moi, cette solution est plus claire que la réponse acceptée et présente l'avantage de ne pas nécessiter le "nom" du module.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X