Ich habe gerade herausgefunden, dass sich das Anforderungsmodul auch auf nachfolgende Anforderungen auswirkt, wobei ich Moment und Moment-Zeitzone als Beispiele nehme, das heißt:
/app.js
var moment = require('moment');
console.log(moment.tz());
// 这样会报错,因为moment.tz()是moment-timezone这个module才有的function
/*
TypeError: moment.tz is not a function
*/
Aber wenn ich zuerst Moment-Zeitzone benötige und dann Moment, NPM-Installationsmoment benötige, kann ich trotzdem require('moment') und dieser Moment kann die Funktion von Moment-Zeitzone wie folgt verwenden
/app.js
require('moment-timezone')
var moment = require('moment');
console.log(moment.tz()); //moment.utc("2017-06-27T06:59:14.475+00:00")
Was ich nicht verstehe, ist, warum ich nach require('moment-timezone'), auch wenn ich npm install moment nicht habe, trotzdem require('moment'); kann, ohne einen Fehler zu melden?
Wie sind solche Knotenmodule aufgebaut oder gibt es einen speziellen Begriff, der ein solches Verhalten verursachen kann?
Übrigens, wenn die obige Moment-Zeitzone so gestaltet werden kann, nehmen wir an, dass ich heute ein Modul namens noname für die Verwendung auf npm veröffentlicht habe, solange require('noname'); zuerst im Programm ausgeführt wird es geändert werden? Der Rückgabeinhalt des nachfolgenden require('express')-Moduls hat einen ähnlichen Effekt wie der Folgende:
require('noname');
var express = require('express');
express.thisIsMyExpress();//这是被我换过的express module
1. 为什麽
require('moment-timezone')
之后,即使我没有npm install moment
我还是可以require('moment')
而不会报错呢?查看
moment-timezone
依赖可以看出
moment-timezone
是依赖了moment
的,这表示在安装moment-timezone
时会自动安装moment
,所以不需要再单独安装也可以使用。2. 为什么
require('moment-timezone')
会影响后续var moment = require('moment')
中`moment`的赋值查看
moment-timezone
源码第14行可以看到
moment-timezone
修改了require('moment')
,众所周知npm
模块是会缓存的,所以后续var moment = require('moment')
被影响顺便提一句,直接修改模块就和修改全局变量一样,并不是很好的实践。此处
moment-timezone
模块基本上算是`moment`模块的补丁,是一个特例.