cli angular typescript webpack angular-cli

cli - Angular 6/7 "el resultado de una dependencia es una expresión"



webpack 3 angular 2 (4)

El principal problema no es por qué está recibiendo esas advertencias. La forma en que está accediendo a la biblioteca no es una forma ideal. Veamos un enfoque un poco mejor [Uso de Angular 7] con sus propios pasos de muestra, que no causarán ese problema en primer lugar.

Paso 1: [Igual que el tuyo]

ng new workspace # accept the defaults ng new product # accept the defaults cd workspace ng generate library widgets ng build --prod widgets # leave out "--prod" for Angular 7 cd ../product ng build

Paso 2: Crea el archivo de biblioteca .tgz

cd ../workspace/dist/widgets/ npm pack cp widgets-0.0.1.tgz ../../../product/

Paso 3: Agrega la biblioteca de "widgets" en package.json

Abra el archivo package.json del proyecto de product y, bajo devDependencies agregue la siguiente línea:

"widgets": "file:./widgets-0.0.1.tgz",

Los pasos 2 y 3 son necesarios si tiene la biblioteca localmente. De lo contrario, si su biblioteca está empaquetada y se publica en el repositorio npm, entonces no necesita file: keyword. Solo puedes mencionar la versión como otras dependencias.

Paso 4: Instalar la biblioteca recién agregada

Ejecute npm install en el proyecto de producto.

Paso 5: Usa la biblioteca

Modificar el archivo app.module.ts :

import { BrowserModule } from ''@angular/platform-browser''; import { NgModule } from ''@angular/core''; import { AppComponent } from ''./app.component''; import { WidgetsModule } from ''widgets''; // new line @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, WidgetsModule // new line ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }

Paso 6: Construir proyecto de producto

Ahora, ejecute ng build en proyecto de producto. Se ejecutará con éxito.

Estoy intentando crear una biblioteca de Angular 6 y utilizarla en una aplicación de Angular 6. Lo he reducido a un caso de prueba mínimo. (Actualización: dado que Angular 7 está fuera, también lo he intentado).

ng new workspace # accept the defaults ng new product # accept the defaults cd workspace ng generate library widgets ng build --prod widgets # leave out "--prod" for Angular 7 cd ../product ng build

Una aplicación llamada "área de trabajo" aloja una biblioteca llamada "widgets". Otra aplicación llamada "producto" está solo. Todo a este punto está bien.

Ahora intentemos usar la biblioteca de "widgets" en la aplicación "producto". Abra el archivo product/src/app/app.module.ts que fue generado por el CLI. Agrega dos líneas como se muestra a continuación.

import { BrowserModule } from ''@angular/platform-browser''; import { NgModule } from ''@angular/core''; import { AppComponent } from ''./app.component''; import { WidgetsModule } from ''../../../workspace/dist/widgets''; // added @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, WidgetsModule // added ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }

Después de ese cambio, cuando ejecuto ng build desde el directorio del producto, recibo advertencias de Webpack.

Date: 2018-07-31T13:13:08.001Z Hash: 8a6f58d2ae959edb3cc8 Time: 8879ms chunk {main} main.js, main.js.map (main) 15.9 kB [initial] [rendered] chunk {polyfills} polyfills.js, polyfills.js.map (polyfills) 227 kB [initial] [rendered] chunk {runtime} runtime.js, runtime.js.map (runtime) 5.22 kB [entry] [rendered] chunk {styles} styles.js, styles.js.map (styles) 15.6 kB [initial] [rendered] chunk {vendor} vendor.js, vendor.js.map (vendor) 4.59 MB [initial] [rendered] WARNING in ../workspace/node_modules/@angular/core/fesm5/core.js 4997:15-36 Critical dependency: the request of a dependency is an expression WARNING in ../workspace/node_modules/@angular/core/fesm5/core.js 5009:15-102 Critical dependency: the request of a dependency is an expression

¿Qué significa "el resultado de una dependencia es una expresión"? ¿Qué estoy haciendo mal?


Encontré la misma advertencia sobre "el resultado de una dependencia es una expresión" que hace referencia a fesm5.js en un nuevo proyecto generado por Angular 7 cli.

Este proyecto en particular tiene una referencia a un paquete npm local con una ruta relativa que comienza con el file://../ que parece causar la advertencia.

Después de algunas investigaciones, encontré este problema de Github que explica cómo podemos solucionarlo en las aplicaciones generadas por Angular 6+ cli.

Lo que me funcionó fue abrir el archivo angular.json en la carpeta raíz del proyecto del cliente (no en la biblioteca compartida) y encontrar esta ruta:

projects > (your project name) > architect > build > options

y añadir la clave:

"preserveSymlinks": true

Con todo el resto del archivo omitido aquí están las partes relevantes:

{ "projects": { "MyAwesomeProject": { "architect": { "build": { "options": { "preserveSymlinks": true } } } } } }

Después de agregar esto obtengo una ng build normal sin advertencias. ¡Espero que ayude!


Es el BrowserModule que está causando dicha advertencia. No sé la razón, pero parece que es la fuente de la advertencia.


Este error aparece cuando se expresa una dependencia JS utilizando una expresión en lugar de una cadena fija, por ejemplo, require(''horse'' + variable) o require(function() { return ''horse''+variable }) . Es probable que algo que esté siendo importado por su WidgetsModule sea importar una biblioteca que está haciendo esa forma de un requerimiento.

Webpack se queja de esto porque significa que tiene que incluir todos los archivos en una carpeta, en lugar de poder analizar de forma estática qué archivos incluir. Seguirá funcionando, pero de acuerdo con la discusión sobre este tema del paquete web , no se debe ignorar y la dependencia en cuestión se debe rediseñar.

Encontré este error cuando estaba en el proceso de actualizar Angular de v5 a v6 en un proyecto recientemente, y si recuerdo bien, desapareció una vez que actualicé todas las otras dependencias también a sus últimas versiones. No puedo decir cuál. Sin embargo, la dependencia estaba causando el problema, y ​​desafortunadamente no cometí entre ver el error y arreglarlo, así que no puedo analizar qué cambio exacto solucionó el error.

Sin embargo, parece que muchas personas tienen problemas similares; consulte, por ejemplo, https://github.com/angular/angular/issues/20357

Para borrar la advertencia (sin solucionar el problema subyacente), debe seguir este proceso y agregar:

plugins: [ // Workaround for Critical dependency // The request of a dependency is an expression in ./node_modules/@angular/core/fesm5/core.js new webpack.ContextReplacementPlugin( //@angular(//|//)core(//|//)fesm5/, helpers.root(''./src''), {} ) ]

... a la configuración del webpack. Sin embargo, en la CLI angular más reciente, no puede editar manualmente la configuración del paquete web (el antiguo comando ng eject eject que solía permitir esto se ha eliminado), por lo que no creo que pueda corregir la advertencia en este momento.

Todo lo cual concluye que necesitaría que los autores de la CLI angular para enmascarar este error a través de la configuración de paquete web generado que usa internamente, o los autores de Angular para cambiar la forma en que core.js realiza sus importaciones.