Webpack - Kritische Abhängigkeit: Die Anforderung einer Abhängigkeit ist ein Ausdruck


81

Beim Importieren requestin ein Barebone-Webpack-Projekt werden drei Warnmeldungen angezeigt. Ein minimales Beispiel zur Reproduktion des Fehlers ist auf GitHub (run npm installand npm start) verfügbar .

Critical dependency: the request of a dependency is an expression

Wie kann ich diese Warnung loswerden?


Mehr Informationen:

Webpack versucht, requireAnrufe statisch aufzulösen , um ein minimales Bundle zu erstellen . Wenn eine Bibliothek Variablen oder Ausdrücke in einem erforderlichen Aufruf verwendet (z. B. require('' + 'nodent')in diesen Zeilen von ajv), kann Webpack diese nicht statisch auflösen und importiert das gesamte Paket.

Mein Grundgedanke ist, dass dieser dynamische Import in der Produktion nicht wünschenswert ist und Code am besten warnungsfrei gehalten wird. Das heißt, ich möchte eine Lösung, die das Problem löst. Z.B:

  1. Konfigurieren Sie das Webpack manuell, um die erforderlichen Bibliotheken zu importieren und das Auftreten von Warnungen zu verhindern.
  2. Hinzufügen einer hack.jsDatei zu meinem Projekt, die die erforderlichen Aufrufe auf irgendeine Weise überschreibt.
  3. Aktualisieren meiner Bibliotheken. ajv-5.0.1-beta.3hat einen Fix, der die Warnungen zum Schweigen bringt. Allerdings, wenn ich es verwenden möchte, muss ich warten , bis es freigegeben wird, und dann bis har-validatorund requestnachfolgende Aktualisierungen veröffentlichen. Wenn es eine Möglichkeit gibt, har-validatordie Verwendung der Beta-Version von zu erzwingen ajv, würde dies mein Problem lösen.
  4. Andere

1. github.com/epoberezkin/ajv/issues/117#issuecomment-198328830 2. Ich glaube nicht, dass es funktionieren wird 3. Sie müssen ein bisschen warten.
besonders am

@esp: Dieser Github-Kommentar scheint das zu sein, wonach ich suche, aber er bringt die Warnungen nicht zum Schweigen. Wenn ich es ändere, new webpack.IgnorePlugin(/async/, /ajv/)sind zwei von drei Warnungen weg, aber das Webpack Cannot find module "../async". Irgendeine Idee über den richtigen magischen Wert, damit es funktioniert?
Jodiug

Die Verknüpfung zum Github-Codebeispiel ist unterbrochen. Bitte setzen Sie Code direkt in die Frage.
CodeChimpy

Antworten:


25

Gelöst mit npm install request@2.79.0 --save

Laut den Autoren von ajvwird das Problem wahrscheinlich in der neuesten Version von requestin einigen Wochen behoben sein.


@maembe versuchen npm remove requestund neu installieren, dann package.jsonentfernen Sie die ^vor der Versionsnummer. Wenn Sie das verlassen ^, wird das Paket möglicherweise nach einem aktualisiert npm updateund die Warnung wird erneut angezeigt .
Jodiug

Hat bei mir nicht funktioniert. Aber der Vorschlag von @DhirendraNk in einer anderen Antwort unten, das Webpack zu ersetzen. ContextReplacementPlugin hat für mich funktioniert.
Will

9

Ersetzen Sie dies

new webpack.ContextReplacementPlugin(
        /angular(\\|\/)core(\\|\/)@angular/,
        helpers.root('./src'), // location of your src
        {} // a map of your routes
    ),

mit diesem-

new webpack.ContextReplacementPlugin( /(.+)?angular(\\|\/)core(.+)?/, root('./src'), {} )

7
Das funktioniert. Es wäre schön, eine ausführlichere Erklärung zu erhalten, warum die Änderung des regulären Ausdrucks dieses Problem behebt.
Atconway

Das funktioniert bei mir, es war nervig, die Warnung zu sehen, danke.
Will

2
Weiß jemand, wo man diesen Code findet? Ich kann den zu ersetzenden Code nicht finden.
Prem Popatia

2
Dies funktioniert, weil Sie der System.ImportFunktion mitteilen , wo sich der Quellcode im node_modulesOrdner befindet. Der Pfad ändert sich abhängig von der von Ihnen verwendeten Angular-Version. Es sollte vom Angular-Team besser gehandhabt werden, hoffentlich schon.
Robert Brisita

1

Diese Warnung kann mit Paketinjektionen in verknüpft werden (Abhängigkeiten oder devDependencies).

Wenn das Problem plötzlich auftritt, überprüfen Sie die letzte Änderung in Ihrer package.json.

Ziehen Sie in Betracht, package-lock.json zu entfernen, wenn Sie einen Neustart planen npm install.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.