Webpack - Dependencia crítica: la solicitud de una dependencia es una expresión

81

Recibo tres mensajes de advertencia al importar requesten un proyecto de paquete web básico. Un ejemplo mínimo para reproducir el error está disponible en GitHub (ejecutar npm instally npm start).

Critical dependency: the request of a dependency is an expression

¿Cómo puedo deshacerme de esta advertencia?


Más información:

Webpack intenta resolver las requirellamadas de forma estática para hacer un paquete mínimo. Cuando una biblioteca usa variables o expresiones en una llamada require (como require('' + 'nodent')en estas líneas de ajv), Webpack no puede resolverlas estáticamente e importa el paquete completo.

Mi razón fundamental es que esta importación dinámica no es deseable en la producción, y es mejor mantener el código libre de advertencias. Eso significa que quiero cualquier solución que resuelva el problema. P.ej:

  1. Configure manualmente el paquete web para importar las bibliotecas necesarias y evitar que se produzcan las advertencias.
  2. Agregar un hack.jsarchivo a mi proyecto que anula las llamadas requeridas de alguna manera.
  3. Actualizando mis bibliotecas. ajv-5.0.1-beta.3tiene una solución que silencia las advertencias. Sin embargo, si quiero usarlo, tengo que esperar hasta que se libera, y entonces hasta har-validatory requestlanzar actualizaciones posteriores. Si hay una forma de forzar el har-validatoruso de la versión beta de ajv, eso resolvería mi problema.
  4. Otro
Jodiug
fuente
1. github.com/epoberezkin/ajv/issues/117#issuecomment-198328830 2. No creo que funcione 3. Tendrás que esperar un poco.
esp
@esp: ese comentario de github parece ser lo que estoy buscando, pero no silencia las advertencias. Si lo cambio a new webpack.IgnorePlugin(/async/, /ajv/), dos de cada tres advertencias desaparecen, pero webpack Cannot find module "../async". ¿Alguna idea sobre el valor mágico adecuado para que funcione?
Jodiug
El enlace al ejemplo de código de github está roto. Por favor, ponga el código directamente en la pregunta.
CodeChimpy

Respuestas:

25

Resuelto con npm install [email protected] --save

Según los autores de ajv, es probable que el problema se resuelva en la última versión de requestdentro de unas semanas.

Jodiug
fuente
@maembe intente npm remove requestreinstalar, luego package.jsonelimine el ^antes del número de versión. Si abandona el ^, es posible que el paquete se actualice después de que npm updatevuelva a aparecer la advertencia.
Jodiug
No funcionó para mí. Pero la sugerencia de @DhirendraNk en una respuesta diferente a continuación, que es reemplazar el webpack.ContextReplacementPlugin funcionó para mí.
Will el
9

Reemplazar esto

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

con este-

new webpack.ContextReplacementPlugin( /(.+)?angular(\\|\/)core(.+)?/, root('./src'), {} )
DhirendraNk
fuente
7
Esto funciona. Sería bueno tener una explicación más detallada de por qué el cambio de expresión regular soluciona este problema.
atconway
Esto funciona para mí, ha sido molesto ver la advertencia, gracias.
Will el
2
¿Alguien sabe dónde encontrar este código? No puedo encontrar el código para reemplazar.
Prem popatia
2
Esto funciona porque le está diciendo a la System.Importfunción dónde encontrar el código fuente en la node_modulescarpeta. La ruta cambia según la versión angular que esté utilizando. Debería ser manejado mejor por el equipo de Angular, con suerte ya lo ha sido.
Robert Brisita
1

Esta advertencia se puede vincular a las inyecciones de paquetes en (dependencias o devDependencies).

Si el problema aparece de repente, verifique la última modificación en su package.json.

Considere la posibilidad de eliminar package-lock.json si planea reiniciar un archivo npm install.

LYES - CHIOUKH
fuente