158 votes

Webpack - Dépendance critique : la demande d'une dépendance est une expression

Je reçois trois messages d'avertissement lors de l'importation request dans un projet barebone webpack. Un exemple minimal pour reproduire le bug est disponible sur GitHub (courir npm install y npm start ).

Critical dependency: the request of a dependency is an expression

Comment puis-je me débarrasser de cet avertissement ?


Plus d'informations :

Webpack essaie de résoudre require de façon statique pour créer un ensemble minimal. Lorsqu'une bibliothèque utilise des variables ou des expressions dans un appel require (tel que require('' + 'nodent') sur ces lignes de ajv ), Webpack ne peut pas les résoudre de manière statique et importe le paquet entier.

Mon raisonnement est que cette importation dynamique n'est pas souhaitable en production, et qu'il est préférable de garder le code sans avertissement. Cela signifie que je veux toute solution qui résout le problème. Par exemple :

  1. Configurez manuellement webpack pour importer les bibliothèques requises et empêcher les avertissements de se produire.
  2. Ajout d'un hack.js à mon projet qui remplace les appels require d'une certaine manière.
  3. Mise à jour de mes bibliothèques. ajv-5.0.1-beta.3 a un correctif qui fait taire les avertissements. Cependant, si je veux l'utiliser, je dois attendre qu'il soit publié, et ensuite jusqu'à ce qu'il ne soit plus disponible. har-validator y request publier des mises à jour ultérieures. S'il y a un moyen de forcer har-validator pour utiliser la version bêta de ajv cela résoudrait mon problème.
  4. Autre

0 votes

1. github.com/epoberezkin/ajv/issues/117#issuecomment-198328830 2. Je ne pense pas que ça va marcher 3. Vous devrez attendre un peu.

1 votes

@esp : ce commentaire github semble être ce que je cherche, mais il ne fait pas taire les avertissements. Si je le change en new webpack.IgnorePlugin(/async/, /ajv/) deux avertissements sur trois ont disparu mais webpack Cannot find module "../async" . Une idée de la valeur magique appropriée pour que cela fonctionne ?

1 votes

Le lien vers l'exemple de code github est cassé. Veuillez insérer le code directement dans la question.

32voto

Jodiug Points 50

Résolu avec npm install request@2.79.0 --save

Selon les auteurs de ajv Le problème sera vraisemblablement résolu dans la dernière version de l'interface utilisateur. request dans quelques semaines.

0 votes

@maembe essaie npm remove request et réinstaller, puis dans package.json retirer le ^ avant le numéro de version. Si vous laissez le ^ le paquet peut être mis à jour après une npm update et l'avertissement réapparaît.

0 votes

Ça n'a pas marché pour moi. Mais la suggestion de @DhirendraNk dans une réponse différente ci-dessous, qui est de remplacer le webpack.ContextReplacementPlugin a fonctionné pour moi.

10voto

DhirendraNk Points 61

Remplacez ceci

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

avec cette

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

16 votes

Cela fonctionne. Il serait intéressant d'avoir une explication plus approfondie sur la raison pour laquelle la modification de l'expression régulière résout ce problème.

0 votes

Cela fonctionne pour moi, c'était ennuyeux de voir l'avertissement, merci.

4 votes

Quelqu'un sait-il où trouver ce code ? Je ne parviens pas à trouver le code à remplacer.

6voto

Lyes CHIOUKH Points 2305

Cet avertissement peut être lié aux injections de paquets dans (dependancies ou devDependencies).

Si le problème apparaît soudainement, vérifiez la dernière modification dans votre package.json.

Envisagez de supprimer package-lock.json si vous prévoyez de relancer un projet de npm install .

1voto

danday74 Points 15895

J'ai eu ce problème dans Angular lorsque j'ai importé EventEmitter de 'protractor' par accident. Je reproche à mon IDE de l'avoir suggéré !

Il doit être importé du noyau :

import { EventEmitter } from '@angular/core';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X