Por que o Angular 9 precisa pré-compilar seu próprio código?

8

Acabei de atualizar meu projeto para o Angular 9 e a primeira coisa que notei é que o tempo de compilação aumentou significativamente no meu IC (de 2 minutos para 4 minutos).

Analisando os logs, toda vez que os testes ou a compilação são executados, a CLI realiza uma pré-compilação. Isso se deve à nova arquitetura Ivy , mas pelo meu entendimento, essa compilação deve acontecer apenas com códigos que não são compatíveis com Ivy.

Então, por que estou vendo muitos Compiling @angular/common : es2015 as esm2015(principalmente dos pacotes @angular) na minha compilação? O próprio código Angular não deve ser compatível com Ivy?

Nota: Isso também acontece com um projeto novo (apenas com poucas bibliotecas).

Atualização Isso acontece com todos os comandos que requerem uma compilação. Ex:

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

Atualização 2

Estou adicionando minhas compilações para comparação: migração pré-angular 9 e após angular 9 (a compilação ainda está falhando, mas podemos usar o teste de unidade como referência, de ~ 2 minutos a ~ 4 minutos de execução total)

André Roggeri Campos
fonte
Que comando / args você está usando para executar / criar seu projeto?
Kyler Johnson
@KylerJohnson Atualizei minha pergunta
André Roggeri Campos
Angular é compilado como es2015. Como sua construção está usando o esm2015, ela deve ser recompilada.
Roddy das ervilhas congeladas
1
@RoddyoftheFrozenPeas, mas mesmo um novo projeto inicializado com a CLI terá esse comportamento. É possível alterar o destino da compilação para evitar essa recompilação?
André Roggeri Campos
Quero dizer, presumi que você estivesse usando o esm2015 por um motivo, mas se você mudar para o es2015 em seu projeto, ele deverá usar os binários pré-compilados.
Roddy das ervilhas congeladas

Respostas:

7

Este artigo explica por que o Angular 9 compila dependências com o ngcc e o roteiro de compilação do Ivy.

Em resumo, como o conjunto de instruções do Ivy será estabilizado apenas no Angular 10, a equipe do Angular recomenda ainda não publicar pacotes compilados no Angular 9 Ivy. Após o Angular 10, os mantenedores de pacotes serão incentivados a publicar pacotes Ivy; Os pacotes do View Engine ainda serão suportados, mas não incentivados.

A partir disso, concluo algum tempo após o lançamento do Angular 10, veremos significativamente menos compilação ngcc acontecendo, em alguns casos nenhuma, dependendo dos pacotes usados ​​por um projeto em particular. No Angular 9, a etapa de compilação ngcc é um compromisso necessário do qual você terá dificuldade em se livrar.

Quanto à velocidade do IC, os documentos oficiais sugerem que o ngcc pode ser executado explicitamente. Acho que pode ser possível armazenar em cache esta etapa no IC, mas, por não estar ciente de sua configuração específica, não posso sugerir nada além da direção da pesquisa.

Atualização: O Angular 9.1 promete melhorias na velocidade de construção do ngcc.

Klaster_1
fonte
1
Entendo, então o Angular está apenas seguindo a recomendação de não fornecer pacotes compilados Ivy, certo?
André Roggeri Campos 04/03
@ AndréRoggeriCampos é o que acredito que faz, com base nos recursos que referenciei.
Klaster_1 7/03