Je viens de découvrir que le module require affectera également les require suivants, en prenant comme exemples le moment et le moment-fuseau horaire, c'est-à-dire :
/app.js
var moment = require('moment');
console.log(moment.tz());
// 这样会报错,因为moment.tz()是moment-timezone这个module才有的function
/*
TypeError: moment.tz is not a function
*/
Mais si j'ai d'abord besoin d'un moment-fuseau horaire, puis d'un moment, npm install moment, je peux toujours exiger('moment') et ce moment peut utiliser la fonction moment-fuseau horaire, comme suit
/app.js
require('moment-timezone')
var moment = require('moment');
console.log(moment.tz()); //moment.utc("2017-06-27T06:59:14.475+00:00")
Ce que je ne comprends pas, c'est pourquoi après require('moment-timezone'), même si je n'ai pas npm install moment, je peux toujours require('moment');
Quelle est la conception de ces modules de nœuds ou existe-t-il un terme spécial pouvant provoquer un tel comportement ?
À propos, si le fuseau horaire ci-dessus peut être conçu comme ceci, supposons que j'ai publié un module appelé noname que les gens peuvent utiliser sur npm aujourd'hui, tant que require('noname'); doit-il être modifié ? Le contenu de retour du module require('express') suivant aura un effet similaire à celui-ci :
require('noname');
var express = require('express');
express.thisIsMyExpress();//这是被我换过的express module
1. Pourquoi
require('moment-timezone')
之后,即使我没有npm install moment
我还是可以require('moment')
mais aucune erreur n'est signalée ?Afficher
moment-timezone
DépendancesOn peut voir que
, il peut donc être utilisé sans l'installer séparément.moment-timezone
是依赖了moment
的,这表示在安装moment-timezone
时会自动安装moment
dépend demoment
, ce qui signifie quemoment
sera automatiquement installé lors de l'installation derequire('moment-timezone')
会影响后续var moment = require('moment')
2. Pourquoi l'affectation de `moment` est-elle dansmoment-timezone
Voirmoment-timezone
修改了require('moment')
,众所周知npm
模块是会缓存的,所以后续var moment = require('moment')
Vous pouvez voir à la ligne 14 que modifiedrequire('moment')
Comme nous le savons tous, le modulenpm
sera mis en cache, donc levar suivant. moment = require('moment')
est affectémoment-timezone
D'ailleurs, modifier directement des modules revient à modifier des variables globales, ce qui n'est pas une bonne pratique. Le module