suchen

Heim  >  Fragen und Antworten  >  Hauptteil

import - Was bewirkt das erforderliche NPM-Installationsmodul in node.js?

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
世界只因有你世界只因有你2703 Tage vor1107

Antworte allen(1)Ich werde antworten

  • 某草草

    某草草2017-06-29 10:11:33

    1. 为什麽require('moment-timezone')之后,即使我没有npm install moment我还是可以require('moment')而不会报错呢?

    查看moment-timezone依赖

    $> npm info moment-timezone dependencies 
    { moment: '>= 2.9.0' }

    可以看出moment-timezone是依赖了moment的,这表示在安装moment-timezone时会自动安装moment,所以不需要再单独安装也可以使用。

    2. 为什么require('moment-timezone')会影响后续var moment = require('moment')中`moment`的赋值

    查看moment-timezone源码

      1 //! moment-timezone.js
      2 //! version : 0.5.13
      3 //! Copyright (c) JS Foundation and other contributors
      4 //! license : MIT          
      5 //! github.com/moment/moment-timezone
      6 
      7 (function (root, factory) {
      8   "use strict";            
      9 
     10   /*global define*/        
     11   if (typeof define === 'function' && define.amd) {
     12     define(['moment'], factory);                 // AMD
     13   } else if (typeof module === 'object' && module.exports) {
     14     module.exports = factory(require('moment')); // Node
     15   } else {
     16     factory(root.moment);                        // Browser                  
     17   }
     18 }(this, function (moment) {
     19   "use strict";

    第14行可以看到moment-timezone修改了require('moment'),众所周知npm模块是会缓存的,所以后续var moment = require('moment')被影响

    顺便提一句,直接修改模块就和修改全局变量一样,并不是很好的实践。此处moment-timezone模块基本上算是`moment`模块的补丁,是一个特例.

    Antwort
    0
  • StornierenAntwort