¿Por qué Angular 9 tiene que precompilar el código?

8

Acabo de actualizar mi proyecto a Angular 9 y lo primero que noté es que el tiempo de compilación aumentó significativamente en mi IC (de 2 minutos a 4 minutos).

Al analizar los registros, cada vez que se realizan las pruebas o la compilación, la CLI realiza una compilación previa. Esto se debe a la nueva arquitectura Ivy , pero, según tengo entendido, esta compilación solo debería suceder con el código que no es compatible con Ivy.

Entonces, ¿por qué veo muchos Compiling @angular/common : es2015 as esm2015(principalmente de paquetes @angulares) en mi compilación? ¿No debería ser el código angular en sí mismo compatible con Ivy?

Nota: Esto también sucede con un proyecto nuevo (solo con pocas bibliotecas).

Actualización Esto sucede con todos los comandos que requieren una compilación. Ex:

  • ng test --code-coverage=true --watch=false --browsers=ChromeHeadle
  • ng b -c=staging --aot

Actualización 2

Estoy agregando mis compilaciones para la comparación: pre angular 9 y después de la migración angular 9 (la compilación sigue fallando, pero podemos usar la prueba unitaria como referencia, de ~ 2 minutos a ~ 4 minutos de ejecución total)

André Roggeri Campos
fuente
¿Qué comando / argumentos estás usando para ejecutar / construir tu proyecto?
Kyler Johnson
@ KylerJohnson Actualicé mi pregunta
André Roggeri Campos
Angular se compila como es2015. Como su compilación usa esm2015, tiene que volver a compilar.
Roddy de los guisantes congelados
1
@RoddyoftheFrozenPeas, pero incluso un proyecto nuevo inicializado con la CLI tendrá este comportamiento. ¿Es posible cambiar el objetivo de compilación para evitar esta recopilación?
André Roggeri Campos
Quiero decir, supuse que estaba usando esm2015 por una razón, pero si cambia a usar es2015 en su proyecto, debería usar los binarios precompilados.
Roddy de los guisantes congelados

Respuestas:

7

Este artículo explica útilmente por qué Angular 9 compila dependencias con ngcc y el mapa de ruta de compilación de Ivy.

En resumen, dado que el conjunto de instrucciones de Ivy se estabilizará solo en Angular 10, el equipo de Angular recomienda no publicar aún los paquetes compilados en Angular 9 Ivy. Después de Angular 10, se alentará a los mantenedores de paquetes a publicar paquetes Ivy; Los paquetes de View Engine seguirán siendo compatibles, pero no se recomiendan.

A partir de esto, concluyo algún tiempo después del lanzamiento de Angular 10, veremos una compilación significativamente menor de ngcc, en algunos casos ninguno, dependiendo de los paquetes utilizados por un proyecto en particular. En Angular 9, el paso de compilación de ngcc es un compromiso necesario del que será difícil deshacerse.

En cuanto a la velocidad de CI, los documentos oficiales sugieren que ngcc se puede ejecutar explícitamente. Creo que es posible almacenar en caché este paso en CI, pero al no conocer su configuración particular, no puedo sugerir nada más allá de la dirección de investigación.

Actualización: Angular 9.1 promete mejoras en la velocidad de construcción de ngcc.

Klaster_1
fuente
1
Ya veo, entonces Angular solo está siguiendo la recomendación de no proporcionar paquetes compilados de Ivy, ¿verdad?
André Roggeri Campos
@ AndréRoggeriCampos, eso es lo que creo que hace, en base a los recursos que mencioné.
Klaster_1