web-dev-qa-db-fra.com

Comment gérer plusieurs fichiers JS côté serveur avec Node.js

Je travaille sur un projet avec Node.js et le code côté serveur devient suffisamment volumineux pour que je souhaite le diviser en plusieurs fichiers. Il semble que cela ait été fait côté client depuis des siècles, le développement se fait en insérant une balise script pour chaque fichier et uniquement pour la distribution est quelque chose comme "Make" utilisé pour tout assembler. Je me rends compte qu'il ne sert à rien de concaténer tout le code côté serveur, donc je ne demande pas comment faire cela. La chose la plus proche que je peux trouver à utiliser est require(), mais elle ne se comporte pas tout à fait comme script dans le navigateur dans la mesure où les fichiers requis ne partagent pas un espace de noms commun.

En regardant certains projets Node.js plus anciens, comme Shooter , il semble que ce n'était pas le cas, ou que je manque quelque chose de vraiment simple dans mon code. Mes fichiers requis ne peuvent pas accéder à l'espace de noms d'appel global au moment de la compilation ni au moment de l'exécution. Existe-t-il un moyen simple de contourner ce problème ou sommes-nous obligés de rendre tous nos fichiers JS requis complètement autonomes par rapport à la portée d'appel?

40
Matt Molnar

Vous ne voulez pas d'un espace de noms commun parce que les globaux sont mauvais. Dans le nœud, nous définissons des modules

// someThings.js

(function() {
    var someThings = ...;

    ...

    module.exports.getSomeThings = function() {
        return someThings();
    }

}());

// main.js

var things = require("someThings");
...
doSomething(things.getSomeThings());

Vous définissez un module, puis exposez une API publique pour votre module en écrivant dans exports.

La meilleure façon de gérer cela est l'injection de dépendances. Votre module expose une fonction init et vous passez un hachage d'objet de dépendances dans votre module.

Si vous insistez vraiment pour accéder à la portée globale, vous pouvez y accéder via global. Chaque fichier peut écrire et lire dans l'objet global. Encore une fois, vous ne voulez pas utiliser de globaux.

59
Raynos

re @ Raynos answer , si le fichier du module est à côté du fichier qui l'inclut, il devrait être

var things = require("./someThings");

Si le module est publié sur, et installé via, npm, ou explicitement placé dans le ./node_modules/ dossier, puis le

var things = require("someThings");

est correct.

34
michielbdejong