Je sais que les variables globales sont mauvaises.
Mais si j'utilise le module de nœud "util" dans 40 fichiers dans mon framework, n'est-il pas préférable de simplement le déclarer comme une variable globale comme:
util = require('util');
dans le fichier index.js au lieu d'écrire cette ligne dans 40 fichiers?
Parce que j'utilise souvent les mêmes 5 à 10 modules dans chaque fichier, ce qui économiserait beaucoup de temps au lieu de copier-coller tout le temps.
N'est-ce pas DRY bon dans ce cas?
Chaque module est censé être indépendant. Le besoin ne coûte rien de toute façon après le premier pour chaque module.
Et si vous vouliez tester un module seul? Vous auriez beaucoup de problèmes car il ne reconnaîtrait pas certaines exigences "globales" que vous avez dans votre application.
Oui, les globaux sont mauvais, même dans ce cas. Les globaux se ruinent presque toujours: testabilité, encapsulation et facilité d'entretien.
Réponse mise à jour janvier 2012
L'objet global
est maintenant un global à l'intérieur de chaque module. Ainsi, chaque fois que vous attribuez à une variable globale (pas de portée) à l'intérieur d'un module, cela fait partie de l'objet global
de ce module.
L'objet global
n'est donc toujours pas global , et ne peut pas être utilisé comme tel.
Mis à jour en décembre 2012
L'objet global
a désormais une portée globale dans l'application et peut être utilisé pour stocker toutes les données/fonctions qui doivent être accessibles à partir de tous les modules.
Vous pourriez simplement avoir un module commun.
common.js:
Common = {
util: require('util'),
fs: require('fs'),
path: require('path')
};
module.exports = Common;
app.js:
var Common = require('./common.js');
console.log(Common.util.inspect(Common));
global.util = require('util');
Il y a une section sur les objets globaux dans la documentation du nœud .
Cependant, les globaux doivent être utilisés avec précaution. En ajoutant des modules à l'espace global, vous réduisez la testabilité et l'encapsulation. Mais il y a des cas où l'utilisation de cette méthode est acceptable. Par exemple, j'ajoute des fonctions et des objets à l'espace de noms global à utiliser dans mes scripts de test unitaire.
Je suis confus par les réponses dans ce fil.
Je suis capable de faire ça ...
Fichier: test.js
global.mytest = {
x: 3,
y: function() { console.log('Works.'); }
};
Fichier: test2.js
console.log('Does this work?');
mytest.y();
Fichier: server.js
require('test.js');
require('test2.js');
Et cela semble fonctionner comme la question était nécessaire. Le premier require place l'objet mytest dans la portée globale, puis le second require peut accéder à cet objet sans aucun autre qualificatif.
J'essayais de comprendre cela (ce qui m'a amené à ce fil à partir d'une recherche Google) et je voulais publier ce qui semble fonctionner pour moi maintenant. Peut-être que les choses ont changé depuis les réponses originales.
J'ai utilisé avec succès l'objet process
pour faire circuler mon objet de configuration. Bien qu'en théorie, il souffre exactement des mêmes problèmes que ceux mentionnés ci-dessus (encapsulation, testabilité, etc.), il fonctionne bien lorsque vous utilisez uniquement des propriétés de modification non étatiques (une table de hachage avec des primitives, essentiellement).