Prepare-se: Angular 8 está próximo

O autor do material, cuja tradução estamos publicando, sugere falar sobre o Angular 8. Aqui discutiremos alguns tópicos particularmente interessantes levantados nos eventos NgConf e Google I / O 2019. Portanto, se você está interessado em Angular, mas por algum motivo não viu relatórios de desses eventos, acreditamos que você ficará curioso para saber o que pode esperar do Angular 8.



Pontos-chave


Tenho certeza de que agora você está ansioso pelo lançamento do Angular 8, está experimentando os mesmos sentimentos que senti após o NgConf 2019. O relatório de Igor Minar tocou em muitas inovações esperadas - de ferramentas a tecnologias como carregamento diferencial e muitas outras coisas maravilhosas.

Vamos discutir como tudo isso pode afetar seus projetos. Nomeadamente, consideraremos novas oportunidades e discutiremos se sua aparência levará ao reconhecimento de mecanismos existentes obsoletos ou ao fato de que o novo será incompatível com o antigo.

Novos recursos


Loading Carga diferencial


Ao aplicar a tecnologia de carregamento diferencial, a Angular, durante o processo de montagem do projeto, pode criar um pacote separado para polyfills. Depende do arquivo da lista do browserlist . Aqui está como será em termos gerais.


Acima está uma nova maneira de compactar projetos ( fonte )

O uso desse recurso reduzirá o tamanho dos pacotes configuráveis.


Economia com carga diferencial ( fonte )

Como isso funciona?

O Angular coletará arquivos de polyfill adicionais e eles serão incorporados ao código usando os atributos do nomodule :

 <body> <pp-root></pp-root> <script type="text/javascript" src="runtime.js"></script> <script type="text/javascript" src="es2015-polyfills.js" nomodule></script> <script type="text/javascript" src="polyfills.js"></script> <script type="text/javascript" src="styles.js"></script> <script type="text/javascript" src="vendor.js"></script> <script type="text/javascript" src="main.js"></script> </body> 

O atributo nomodule , booleano, impede que o script seja carregado e executado em navegadores que suportam módulos ES6. Esses navegadores ignoram esses scripts. Navegadores mais antigos fazem o download e os executam.

▍SVG Templates


Agora, os arquivos SVG podem ser usados ​​como modelos. Até agora, HTML incorporado ou externo poderia ser usado como modelos.

 @Component({ selector: "app-icon", templateUrl: "./icon.component.svg", styleUrls: ["./icon.component.css"] }) export class AppComponent {...} 

I Ivy mecanismo de renderização experimental


O mecanismo Ivy ainda está em fase experimental. Após o lançamento do Angular 8, você pode testá-lo usando o sinalizador --enable-ivy ao criar um novo aplicativo. O código correspondente é mostrado abaixo. Lembre-se de que o Ivy ainda não está pronto (ainda está no status de "pré-visualização") e, como Igor Minar disse no NgConf 2019, ainda é recomendável usar o View Engine ao criar novos aplicativos.

Para habilitar o uso do Ivy em um projeto existente, é necessário definir o parâmetro da enableIvy option angularCompilerOptions em angularCompilerOptions como true no angularCompilerOptions :

 "angularCompilerOptions": {"enableIvy": true} 

Você pode criar um novo aplicativo no qual o Ivy será usado:

 $ ng new my-app --enable-ivy 

Ivy oferece os seguintes recursos úteis, os três primeiros esperados no Angular 9:

  1. Compilação mais rápida.
  2. Verificação de tipo aprimorada para modelos.
  3. Reduzindo o tamanho dos pacotes. Agora , se você ainda não o viu, uma demonstração de um aplicativo de 4,3 Kb com o Google I / O 19.
  4. Compatibilidade com versões anteriores.
  5. E meu recurso favorito é a depuração de modelos. Estou certo de que, como eu, muitos desenvolvedores precisam disso.

▍Suporte Bazel


Bazel é outra ferramenta que o Google mudou para o mercado de código aberto. Igor Minar diz que o Bazel é usado há muito tempo para as necessidades internas da empresa e agora está disponível para todos. Para saber mais sobre esse construtor de projetos, consulte a documentação e leia como usar o Bazel com Angular .

Talvez você esteja se perguntando se o Bazel está pronto para uso prático. Responda brevemente a essa pergunta - ainda não está pronta. Agora ele está no status de "pré-visualização prévia". Deixe-me citar Alex Eagle, que lidera a equipe de desenvolvimento de ferramentas Angular no Google: “Se você já entrou nas águas de Bazel antes, não poderia deixar de notar que havia muitos tubarões ... Agora já gerenciamos os tubarões, mas a água ainda pode ser frio. "

Bazel ainda está sendo trabalhado, espera-se que seja incluído no @angular/cli na versão 9.

Aqui estão alguns recursos úteis que o Bazel pode nos fornecer:

  1. Acelerando o tempo de construção do projeto. A primeira compilação leva algum tempo, mas as compilações paralelas são muito mais rápidas. O Angular já usa o Bazel e agora as rotinas de IC são concluídas em 7,5 minutos, não em uma hora, como era antes do Bazel.
  2. Montagem de projeto incremental. Será possível coletar e implantar não o aplicativo inteiro, mas apenas o que mudou nele.
  3. Capacidade de trabalhar com arquivos Bazel, que, por padrão, estão ocultos.

Você pode adicionar suporte ao Bazel em um projeto existente da seguinte maneira:

 ng add @angular/bazel 

Você pode criar um novo aplicativo usando o Bazel:

 $ npm install -g @angular/bazel $ ng new my-app --collection=@angular/bazel 

▍API Builders


A nova versão do Angular permite usar os API Builders, também conhecidos como Architect. Angular usa construtores para executar operações básicas: serve , build , test , lint e e2e . Aqui está um exemplo usando assemblers do arquivo angular.json :

 ... "projects": { "app-name": {   ...   "architect": {     "build": {       "builder": "@angular-devkit/build-angular:browser",       ...     },     "serve": {       "builder": "@angular-devkit/build-angular:dev-server",       ...     },     "test": {       "builder": "@angular-devkit/build-angular:karma",       ...     },     "lint": {       "builder": "@angular-devkit/build-angular:tslint",       ...     },     "e2e": {       "builder": "@angular-devkit/build-angular:protractor",       ...     }   } } } 

Agora você pode criar seus próprios colecionadores. Eu os vejo como semelhantes aos comandos gulp / grunt usados ​​nos velhos tempos.

Em geral, o coletor é apenas uma função com um conjunto de comandos que são passados ​​para o método createBuilder() do pacote @angular-devkit/architect :

 import { createBuilder } from '@angular-devkit/architect'; function customBuild(options, context) { return new Promise((resolve, reject) => {   //   }) } createBuilder(customBuild); 

Você pode dar uma olhada nos construtores Angular internos aqui . Aqui estão ótimas coisas sobre eles no blog Angular.

HanAlterações no carregamento lento


A nova versão do Angular também terá uma nova versão do sistema de carregamento do módulo lento, cuja aparência leva ao fato de que a sintaxe existente loadChildren:string será descontinuada.

Anteriormente, era assim:

 loadChildren: './lazy/lazy.module#LazyModule'; 

Com o lançamento do Angular 8 - assim:

 loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) 

Se você possui muitos módulos ao trabalhar com os quais o mecanismo de carregamento lento é usado e deseja automatizar sua tradução para um novo modo de operação, dê uma olhada neste material.

▍Support API $ location AngularJS


A equipe de desenvolvimento da Angular está comprometida em apoiar aqueles que usam o AngularJS e ajudá-los a mudar para o Angular. Como resultado, o suporte ao serviço $location foi adicionado ao sistema, no pacote angular/common/upgrade . Estamos falando dos seguintes recursos:

  1. Obtendo status do serviço $location .
  2. Rastreando alterações de endereço.
  3. Obtendo as mesmas informações sobre os componentes do endereço que podem ser obtidos no AngularJS ( hostname , protocol , port , search ).
  4. Testando o serviço usando a API MockPlatformLocation.

▍ Trabalhadores da Web


O Angular 8 adiciona suporte para trabalhadores da Web. Com a ajuda deles, você pode organizar a execução em segundo plano do código que consome muitos recursos. Para criar um novo trabalhador da Web, você pode usar o seguinte comando da interface de linha de comando Angular:

 ng g webWorker <name> 

▍ Trabalhadores de serviço


Desde recentemente, houve um aumento sério na popularidade de aplicativos da web progressivos, muitas melhorias nos trabalhadores de serviços foram feitas. Em particular, uma dessas melhorias foi a adição do parâmetro SwRegistrationOptions . Outra melhoria foi o suporte de vários aplicativos no mesmo domínio.

Leia mais sobre profissionais de serviço nesta seção da documentação Angular.

▍ Melhorias de formulário


O método markAllAsTouched foi markAllAsTouched , o que permite marcar todos os elementos dentro de um FormGroup como touched . Isso é muito útil nos casos em que você precisa executar a validação de todos os controles em um FormGroup . Antes disso, a mesma coisa era feita assim:

 validateFormAndDisplayErrors(form: FormGroup) { Object.keys(form.controls).map((controlName) => {   form.get(controlName).markAsTouched({onlySelf: true}); }); } 

No novo Angular, você pode usar o método clear para clear FormArray , que remove todos os elementos dele. Anteriormente, era necessário usar a seguinte construção, removendo o primeiro elemento em cada iteração do loop:

 while (formArray.length) { formArray.removeAt(0); } 

Você não precisa mais fazer isso. Agora basta chamar um único método:

 formArray.clear() 

▍Configurando o momento de receber uma resposta ao usar as diretivas ViewChild e ContentChild


Esse novo recurso implica o uso do sinalizador static , que permite especificar quando a solicitação é resolvida, definida pela ViewChild ou ContentChild .

Você pode ter encontrado os seguintes exemplos de comportamento inconsistente do sistema. Às vezes, os resultados da pesquisa estão disponíveis no método de ciclo de vida ngOnInit e, às vezes, não existem antes de chamar ngAfterContentInit ou ngAfterViewInit . Veja como usar o sinalizador static :

 //          @ContentChild('foo', { static: false }) foo!: ElementRef; //          ngOnInit @ViewChild(TemplateRef, { static: true }) foo!: TemplateRef; 

Observe que esses recursos não estão disponíveis para as ViewChildren e ContentChildren . As consultas de pesquisa de itens correspondentes são executadas após a detecção de alterações.

Ao usar static: true deve ter cuidado, pois o uso desse sinalizador não permitirá obter resultados de modelos dinâmicos (por exemplo, * ngIf). Uma regra de esquema foi adicionada ao sistema, permitindo a conversão de código existente para usar a nova sintaxe. Essa sintaxe será usada com o Ivy.

→ Detalhes sobre esse recurso podem ser encontrados aqui .

TypesScripts de suporte 3.4.x


O Angular agora usa o TypeScript 3.4 (a sétima versão do Angular usa o TypeScript 3.2.x). Não há muitas mudanças importantes na nova versão do TS. Provavelmente não levarão a consequências desagradáveis.

→ Detalhes sobre as inovações do TS 3.4 podem ser encontrados aqui .

▍ Melhoria de desempenho


Sob as condições atuais, ServerRendererFactory2 cria uma nova instância de DomElementSchemaRegistry para cada solicitação, o que é bastante caro em termos de recursos. Agora, o compartilhamento da instância global do DomElementSchemaRegistry será organizado.

▍ Implantando aplicativos Angular na hospedagem Firebase


Se você usa a hospedagem Firebase para implantar aplicativos Angular, definitivamente gostará dessa inovação. O ponto é que agora na CLI Angular há um comando especial para executar esta operação:

 ng run [PROJECT_NAME]:deploy 

Aqui você pode descobrir mais sobre esse recurso.

APIs desatualizadas


▍Use qualquer tipo ao trabalhar com TesBed.get


O método TesBed.get tinha duas assinaturas. Um é digitado, o segundo é o tipo de recebimento e retorno any . Agora a assinatura do método, que fornece o uso do tipo any , está obsoleta. Você pode usar esse método apenas com uma indicação de um tipo específico. Isso, por exemplo, afetará os casos de trabalho com tokens de string (que não são suportados) e com alguns outros tokens.

Projetos anteriormente usados:

 TestBed.configureTestingModule({ providers: [{ provide: "stringToken", useValue: new Service() }], }); let service = TestBed.get("stringToken"); //  any 

Agora, a seguinte abordagem é aplicada:

 const SERVICE_TOKEN = new InjectionToken<Service>("SERVICE_TOKEN"); TestBed.configureTestingModule({ providers: [{provide: SERVICE_TOKEN, useValue: new Service()}], }); let service = TestBed.get(SERVICE_TOKEN); //  Service 

▍Como remover DOCUMENT do navegador angular / de plataforma


DOCUMENT removido do pacote @angular/platform-browser . Se você usar DOCUMENT deste pacote, comece a importá-lo do @angular/common .

Install Desinstalar pacote angular / http


O pacote @angular/http foi descontinuado no Angular 5, mas ainda estava disponível, já que o @angular/platform-server dependia dele. Agora este pacote é removido da lista de pacotes.

Mudanças críticas


Correção automática de código


Poucos sabem que o Angular corrigia erros automaticamente ao usar os elementos HTML tr e col .

No caso de tr correções foram feitas se o elemento correspondente não estivesse dentro da tfoot tbody , tfoot ou thead . As correções consistiam no posicionamento automático de um elemento no tbody .

No caso de col foram feitas correções no código em que esse elemento não está dentro da tag colgroup .

A Angular agora deixa a correção desses erros a critério dos desenvolvedores. Isso é feito para evitar conflitos e erros. Como resultado, aqueles que estão acostumados a esse recurso precisarão cuidar da correção do código eles mesmos.

→ Detalhes sobre isso podem ser encontrados aqui .

▍ Renomear material angular


O projeto de material angular foi renomeado para componentes angulares. Os nomes dos pacotes não foram alterados.

Sumário


O Angular 8 será lançado muito em breve. A equipe de desenvolvimento Angular está fazendo um ótimo trabalho. Os resultados de seus esforços facilitam o trabalho e a vida de quem usa o Angular. Em particular, por exemplo, a cada nova versão da estrutura, fica cada vez mais fácil mudar para a versão anterior. Aqui está, por exemplo, a aparência da Air France.


Tempo necessário para atualizar para novas versões do Angular ( origem )

Como resultado, podemos esperar que a transição do Angular 7 para o Angular 8 não demore muito e não exija esforços sérios.

Aqui você encontra tutoriais passo a passo sobre como atualizar para novas versões do Angular.

Cerca de um mês atrás, Igor Minar disse que tudo indica que o Angular 8.0.0 pode muito bem sair no final de maio. Angular 8.0.0-rc.5 foi lançado em 24 de maio.

O futuro do Angular parece bastante otimista. Tudo o resto depende de nós.

Caros leitores! O que você espera do Angular 8?

Source: https://habr.com/ru/post/pt453584/


All Articles