image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Carlos Santos
Carlos Santos05/05/2023 19:50
Compartilhe

Introdução ao Angular

  • #Angular

Visão Geral

O Angular é um framework de desenvolvimento web criado pela equipe do Google em 2010. A primeira versão do Angular, também conhecida como AngularJS, foi lançada em 2012. Desde então, o Angular passou por várias atualizações até a versão estável atual, que é a 15.

Falemos, primeiro, sobre NodeJS e NPM

O que são e para que servem…

O NodeJS é uma plataforma para desenvolvimento de aplicações em JavaScript do lado do servidor. Ele foi criado em 2009 por Ryan Dahl e é baseado no interpretador JavaScript V8 do Google Chrome. O NodeJS permite que os desenvolvedores escrevam código JavaScript do lado do servidor, o que significa que eles podem usar a mesma linguagem em ambos os lados da aplicação. Além disso, ele oferece recursos avançados, como entrada/saída não bloqueante e escalabilidade horizontal, que o tornam uma escolha popular para o desenvolvimento de aplicações em tempo real e de alta performance.

O NPM (Node Package Manager) é um gerenciador de pacotes para o NodeJS. Ele permite que os desenvolvedores instalem e gerenciem pacotes de código JavaScript facilmente. Os pacotes podem ser instalados a partir do registro público do NPM ou de repositórios privados. O NPM também permite que os desenvolvedores publiquem seus próprios pacotes e os compartilhem com outros desenvolvedores. Com sua vasta biblioteca de pacotes, o NPM é uma ferramenta fundamental para o desenvolvimento de aplicações em JavaScript, independentemente do servidor ou front-end.

A importância do NodeJS para projetos Angular

O Angular é um framework de desenvolvimento web que é construído em cima do TypeScript, uma linguagem de programação que é o SuperSet do JavaScript. O TypeScript adiciona recursos como tipagem estática e suporte a classes e interfaces, o que torna o desenvolvimento em larga escala mais fácil e mais seguro. No entanto, os navegadores não entendem o TypeScript, então ele precisa ser “transpilado” em JavaScript para que o código possa ser executado no navegador. É aqui que entra o NodeJS.

O NodeJS é usado para compilar o TypeScript em JavaScript, que é então executado no navegador. Isso significa que o NodeJS é uma parte crucial do processo de desenvolvimento do Angular. Sem o NodeJS, seria muito mais difícil compilar e executar o código Angular, tornando o desenvolvimento mais lento e menos eficiente.

Além disso, o NPM é usado para gerenciar as dependências do projeto, incluindo o próprio Angular e os pacotes de terceiros que são usados na aplicação. O NPM torna fácil instalar e atualizar as dependências do projeto, garantindo que a aplicação esteja sempre usando as versões mais recentes dos pacotes.

Em resumo, o NodeJS e o NPM são ferramentas essenciais para o desenvolvimento de aplicações Angular. O NodeJS é usado para compilar o TypeScript em JavaScript, que é então executado no navegador, e o NPM é usado para gerenciar as dependências do projeto. Sem o NodeJS e o NPM, o desenvolvimento em Angular seria muito mais difícil e menos eficiente.

Cronologia do Angular

Nomenclatura

Originalmente, a reescrita do AngularJS foi chamado de "Angular 2" pela equipe, mas isto levou à confusão entre os desenvolvedores. Para esclarecer, a equipe anunciou que termos separados devem ser usados para cada Framework, com "AngularJS", referindo-se a 1.X versões e "Angular" sem o "JS", referindo-se às versões à partir da 2 até a última.[2]

A versão 2.0

O Angular 2.0 foi anunciado no ng-Europe conference 22-23 de setembro de 2014.[3] As mudanças drásticas na versão 2.0 criou uma considerável controvérsia entre os desenvolvedores.[4] Em 30 de abril de 2015, os desenvolvedores Angular anunciaram que o Angular 2 foi transformado de Alfa a Developer Preview.[5] O Angular 2 mudou-se para o Beta em dezembro de 2015,[6] e a primeira versão foi publicada em Maio de 2016.[7] A versão final foi lançada em 14 de setembro de 2016.

Versão 4.0

Em 13 de dezembro de 2016 Angular 4 foi anunciado, ignorando o 3 para evitar uma confusão devido ao desalinhamento da versão do pacote do roteador que já foi distribuído como v3.3.0.[8] A versão final foi lançada em 23 de Março de 2017.[9] O Angular 4 é compatível com o Angular 2.[10]

O Angular versão 4.3 é uma versão menor, o que significa que ele contém alterações que não são de última hora e que é uma atualização pequena para 4.x.x.

Recursos na versão 4.3

  • Introdução de HttpClient, uma biblioteca menor, mais poderosa, e mais fácil de usar, para fazer Solicitações HTTP.
  • Novo roteador ciclo de vida de eventos para Guardas e Resoluções. Quatro novos eventos: GuardsCheckStartGuardsCheckEndResolveStartResolveEnd juntam-se ao conjunto existente de ciclo de vida, tais como a NavigationStart.
  • Condicionalmente desativa animações.

Versão 5.0

Angular 5 foi lançado em 1 de novembro de 2017.[11] Os principais aprimoramentos Angular 5 incluem suporte para web apps progressivos, uma compilação otimizadora e melhorias relacionadas ao Material Design.[12]

Versão 6.0

O lançamento da sexta versão do Angular ocorreu no dia quatro de Maio de 2018. Esta versão teve um foco menor na base do framework, e maior na cadeia de ferramentas e em como tornar mais fácil e rápida a migração com Angular nas atualizações futuras, como os comandos da CLI (Interface de Linha de Comando): ng update, ng add, Angular Elements, Componentes Angular Material + CDK, Componentes Iniciais Angular Material, CLI Workspaces, Suporte a biblioteca, Provedores de Árvore Shakable, Melhoramentos no desempenho de animações, e atualização do RxJS para a versão 6.

Versão 7.0

A sétima versão do Angular foi lançada no dia dezoito de Outubro de 2018. Atualizações relacionadas ao desempenho de aplicativos, Angular Material & CDK, Rolagem Virtual, Melhor acessibilidade do elemento de formulário select (também conhecido por combobox ou dropdownlist), agora suporta Content Projection usando o padrão web para elementos personalizados, e atualizações de dependência em relação ao Typescript 3.1, RxJS 6.3, Node 10 (ainda suportando Node 8).

Versão 7.1

O lançamento do Angular 7[13] ocorreu em novembro de 2018 e está disponível para download no github.com[14]

Versão 8.0

O lançamento da mais nova versão do Angular ocorreu em maio de 2019 e conta com algumas melhorias no funcionamento dos formulários reativos, melhoria na sintaxe para declaração de rotas lazy-loading e a esperada disponibilização do compilador Ivy, que nesta versão ainda está em preview e precisa ser habilitado, mas não é recomendado que se utilize em produção*.*

Versão 9.0

O Angular 9 foi lançado em 6 de fevereiro de 2020. A versão 9 move todos os aplicativos para usar o compilador Angular Ivy por padrão. O Angular foi atualizado para funcionar com TypeScript 3.6 e 3.7. Além de centenas de correções de bugs, o compilador e o tempo de execução Ivy oferecem inúmeras vantagens[15]:

  • Tamanhos de pacote menores
  • Teste mais rápido
  • Melhor depuração
  • Melhor classe CSS e vinculação de estilo
  • Verificação de tipo aprimorada
  • Erros de compilação aprimorados
  • Tempos de compilação aprimorados, habilitando AOT por padrão
  • Melhor Internacionalização

Versão 10

O Angular 10 foi lançado em 24 de junho de 2020.[16]:

  • Novo seletor de intervalo de datas (biblioteca de IU de materiais)
  • Avisos sobre importações CommonJS
  • Configurações opcionais mais estritas
  • Mantendo-se atualizado com o ecossistema
  • Nova configuração de navegador padrão
  • Depreciações e Remoções

Versão 11

O Angular 11 foi lançado em 11 de novembro de 2020.[17]:

Versão 12

O Angular 12 foi lançado em 12 de maio de 2021.[18]:

Versão 13

O Angular 13 foi lançado em 03 de novembro de 2021:

Versão 14

O Angular 14 foi lançado em 02 de junho de 2022

Versão 15

O Angular 15 foi lançado em 16 de novembro de 2022

Em junho de 2023 deverá ser lançada a versão Release do Angular 16.

Sistema de Versionamento

O Angular utiliza o sistema de versionamento semântico, onde o número de versão é dividido em três partes: major, minor e patch. A cada atualização, o número da versão é incrementado de acordo com as seguintes regras:

  • Major: quando há mudanças incompatíveis com versões anteriores;
  • Minor: quando são adicionadas novas funcionalidades de forma compatível com as versões anteriores;
  • Patch: quando são corrigidos problemas de forma compatível com as versões anteriores.

Criador da versão 1.x

A primeira versão do Angular (AngularJS) foi criada por Misko Hevery, um engenheiro de software do Google. Misko Hevery é um desenvolvedor experiente, conhecido por suas contribuições para o desenvolvimento de testes unitários automatizados e por suas palestras sobre programação.

Diferenças básicas entre as versões 1.x e 2.x

O Angular 2 é uma reescrita completa do AngularJS. Algumas das principais diferenças entre as versões 1.x e 2.x incluem:

  • AngularJS utiliza o padrão MVC (Model-View-Controller), enquanto o Angular 2 utiliza o padrão MVVM (Model-View-ViewModel);
  • AngularJS utiliza JavaScript, enquanto o Angular 2 utiliza TypeScript;
  • AngularJS utiliza o Two-Way Data Binding, enquanto o Angular 2 utiliza o One-Way Data Binding.

Antes de nos aprofundarmos no Angular, vamos falar sobre EcmaScript e TypeScript.

  • EcmaScript
  • EcmaScript é uma especificação de linguagem de script que define as regras e funcionalidades para implementações de JavaScript em navegadores e outras plataformas. O EcmaScript 5 e 6 são duas versões dessa especificação, que introduzem novas funcionalidades à linguagem JavaScript.
  • O EcmaScript 5 foi lançado em 2009 e introduziu novos recursos, como o uso do método "strict" para evitar erros de sintaxe e a adição de novos métodos para arrays, como o "forEach" e "mapa". Essa versão também trouxe melhorias na manipulação de objetos, como o "Object.create" e o "Object.defineProperty" [2].
  • Já o EcmaScript 6, também conhecido como ES6 ou ECMAScript 2015, foi lançado em 2015 e trouxe grandes mudanças à linguagem JavaScript, como a adição de novas palavras-chave "let" e "const" para declaração de variáveis, o uso de arrow functions, classes e módulos, e outras funcionalidades que tornam o JavaScript mais fácil de ler e escrever [1]. Além disso, a versão ES6 introduziu melhorias na manipulação de strings, arrays e objetos, tornando o JavaScript mais poderoso e versátil [4].
  • Em resumo, o EcmaScript é a especificação de uma linguagem de script que define as funcionalidades e regras para implementações de JavaScript, e as versões 5 e 6 introduzem novos recursos para tornar o JavaScript mais poderoso e fácil de usar.
  • TypeScript:
  • TypeScript é uma linguagem de programação de código aberto mantida pela Microsoft e uma comunidade de desenvolvedores que contribuem para seu desenvolvimento [2]. É um SuperSet sintático estrito de JavaScript, adicionando recursos adicionais à linguagem [4].
  • Entre os recursos adicionados ao JavaScript pelo TypeScript estão a tipagem estática opcional, classes e interfaces. A tipagem estática opcional permite aos desenvolvedores escrever código mais seguro, eliminando erros comuns de digitação e permitindo que o compilador faça a verificação de tipos em tempo de compilação [1]. As classes e interfaces do TypeScript permitem que os desenvolvedores escrevam código mais orientado a objetos e reutilizável, o que pode levar a um código mais modular e escalável.
  • O TypeScript é um SuperSet de JavaScript, o que significa que todo código JavaScript válido também é código TypeScript válido. Além disso, o código-fonte do TypeScript está disponível gratuitamente para qualquer pessoa acessar, visualizar, modificar e distribuir [2]. O TypeScript pode ser transcompilado para JavaScript, o que significa que os desenvolvedores podem escrever código em TypeScript e, em seguida, transcompilá-lo em JavaScript para ser executado em um navegador ou outro ambiente em tempo de execução.
  • Em resumo, o TypeScript é uma linguagem de programação de código aberto mantida pela Microsoft e uma comunidade de desenvolvedores que contribuem para seu desenvolvimento. É um SuperSet sintático estrito de JavaScript que adiciona recursos adicionais à linguagem, como tipagem estática opcional, classes e interfaces. O TypeScript permite que os desenvolvedores escrevam código mais seguro, modular e escalável e pode ser transcompilado em JavaScript para ser executado em um navegador ou outro ambiente em tempo de execução.

Features básicas do Angular

Algumas das features mais básicas do Angular incluem:

  • Diretivas: permitem adicionar comportamentos a elementos HTML;
  • Componentes: são a base da estrutura de um aplicativo Angular;
  • Serviços: são usados para compartilhar dados ou lógica entre componentes;
  • Injeção de dependência: é um padrão de design que permite injetar dependências em um objeto;
  • Observables: permitem manipular fluxos de dados assíncronos.

O Angular é um framework poderoso e versátil, com uma grande comunidade de desenvolvedores ativos e recursos disponíveis para ajudar no aprendizado e desenvolvimento de aplicativos web.

Diretivas

As diretivas são uma das principais características do Angular. Elas permitem adicionar comportamentos a elementos HTML, transformando-os em componentes dinâmicos. Existem dois tipos de diretivas: as diretivas estruturais e as diretivas de atributo.

As diretivas estruturais são responsáveis por modificar a estrutura do DOM, adicionando ou removendo elementos HTML. Um exemplo de diretiva estrutural é a *ngFor, que permite iterar sobre uma lista de itens e exibi-los no HTML.

As diretivas de atributo, por sua vez, são responsáveis por modificar o comportamento dos elementos HTML, adicionando novos comportamentos ou modificando comportamentos existentes. Um exemplo de diretiva de atributo é a ngClass, que permite adicionar ou remover classes CSS de um elemento, dependendo de uma condição.

Componentes

Os componentes são a base da estrutura de um aplicativo Angular. Eles encapsulam a lógica de negócios e a apresentação em um único elemento, tornando-os reutilizáveis e fáceis de manter. Cada componente é composto por três elementos: um template HTML, uma classe TypeScript e um arquivo de estilo CSS.

Serviços

Os serviços são usados para compartilhar dados ou lógica entre componentes. Eles permitem criar uma única instância de um objeto e compartilhá-lo entre vários componentes. Um exemplo de serviço é um serviço de autenticação, que é responsável por autenticar o usuário em um aplicativo.

Injeção de Dependência

A injeção de dependência é um padrão de design que permite injetar dependências em um objeto, em vez de criá-las diretamente dentro do objeto. Isso torna o código mais flexível e fácil de testar. O Angular utiliza a injeção de dependência para fornecer serviços para os componentes.

Observables

Os Observables permitem manipular fluxos de dados assíncronos. Eles são muito úteis para trabalhar com eventos, como a resposta de uma API, ou para trabalhar com dados que podem mudar com o tempo, como os dados de um formulário. Os Observables são usados em conjunto com a API RxJS, que é uma biblioteca de programação reativa.

Resumindo a seção

O Angular é um framework poderoso e versátil, com uma grande comunidade de desenvolvedores ativos e recursos disponíveis para ajudar no aprendizado e desenvolvimento de aplicativos web. Ele é uma excelente opção para desenvolvedores que desejam criar aplicativos escaláveis e fáceis de manter. Com as diretivas, componentes, serviços, injeção de dependência e observables, o Angular oferece uma grande flexibilidade para construir aplicativos web de alta qualidade.

Diretivas comuns do Angular

ngIf

A diretiva *ngIf é usada para exibir ou ocultar elementos HTML com base em uma condição. Ela é usada com a sintaxe de template de atributo, como no exemplo abaixo:

<div *ngIf="showElement">
Esse elemento só é exibido se a variável showElement for verdadeira.
</div>

ngFor

A diretiva *ngFor é usada para iterar sobre uma lista de itens e exibi-los no HTML. Ela é usada com a sintaxe de template de atributo, como no exemplo abaixo:

<ul>
<li *ngFor="let item of items">{{ item }}</li>
</ul>

ngClass

A diretiva ngClass é usada para adicionar ou remover classes CSS de um elemento, dependendo de uma condição. Ela é usada com a sintaxe de template de atributo, como no exemplo abaixo:

<div [ngClass]="{ 'highlighted': isHighlighted }">
Esse elemento é destacado se a variável isHighlighted for verdadeira.
</div>

ngStyle

A diretiva ngStyle é usada para adicionar estilos CSS a um elemento, dependendo de uma condição. Ela é usada com a sintaxe de template de atributo, como no exemplo abaixo:

<div [ngStyle]="{ 'color': textColor, 'background-color': bgColor }">
Esse elemento tem a cor do texto e a cor de fundo definidas pelas variáveis textColor e bgColor.
</div>

Com essas diretivas básicas, é possível criar templates dinâmicos e poderosos no Angular.

Pipes

Os pipes são uma das características mais úteis e poderosas do Angular. Eles permitem transformar e exibir dados de forma fácil e flexível. Existem vários pipes embutidos no Angular, incluindo:

  • DatePipe: usado para formatar datas;
  • UpperCasePipe: usado para transformar o texto em letras maiúsculas;
  • LowerCasePipe: usado para transformar o texto em letras minúsculas;
  • CurrencyPipe: usado para formatar valores monetários;
  • DecimalPipe: usado para formatar valores numéricos.

Existem também pipes personalizados que podem ser criados para atender às necessidades específicas do aplicativo.

Os pipes são usados com a sintaxe de barra vertical (|) e podem ser encadeados para criar transformações mais complexas. Por exemplo:

<p>{{ data | date | uppercase }}</p>

Nesse exemplo, o valor da variável data é primeiro formatado como uma data e, em seguida, transformado em letras maiúsculas.

Com os pipes, é fácil criar templates dinâmicos e personalizados no Angular.

Exemplos de uso dos pipes

DatePipe

O DatePipe é usado para formatar datas em um formato legível para humanos. Ele pode ser usado da seguinte forma:

<p>A data atual é {{ currentDate | date }}</p>

O resultado será algo como:

A data atual é Jun 22, 2021

UpperCasePipe

O UpperCasePipe é usado para converter o texto para letras maiúsculas. Ele pode ser usado da seguinte forma:

<p>O texto em maiúsculas é {{ text | uppercase }}</p>

O resultado será algo como:

O texto em maiúsculas é EXEMPLO DE TEXTO

LowerCasePipe

O LowerCasePipe é usado para converter o texto para letras minúsculas. Ele pode ser usado da seguinte forma:

<p>O texto em minúsculas é {{ text | lowercase }}</p>

O resultado será algo como:

O texto em minúsculas é exemplo de texto

CurrencyPipe

O CurrencyPipe é usado para formatar valores monetários no formato da moeda local. Ele pode ser usado da seguinte forma:

<p>O valor é {{ value | currency }}</p>

O resultado será algo como:

O valor é R$1.234,56

DecimalPipe

O DecimalPipe é usado para formatar valores numéricos com um determinado número de casas decimais. Ele pode ser usado da seguinte forma:

<p>O valor é {{ value | number:'1.2-2' }}</p>

O resultado será algo como:

O valor é 1.23

Com esses exemplos, você pode ver a versatilidade dos pipes e como eles podem ajudar a formatar dados de forma fácil e flexível no Angular.

JSON Pipe

O JsonPipe é usado para exibir objetos JavaScript em formato JSON. Ele pode ser usado da seguinte forma:

<pre>{{ objeto | json }}</pre>

O resultado será algo como:

{
"nome": "João",
"idade": 30,
"email": "joao@example.com"
}

O JsonPipe é muito útil para depurar e testar aplicativos Angular que trabalham com APIs que retornam JSON.

Com o JsonPipe, é fácil exibir objetos JavaScript complexos em formato JSON no Angular.

Antes de começarmos com os módulos, vamos dar uma olhada no AngularCLI.

Angular CLI

O Angular CLI (Command Lime Interface) é uma ferramenta de linha de comando que ajuda a criar, gerenciar e testar aplicativos Angular. Ele automatiza muitas tarefas comuns de desenvolvimento, como a criação de componentes, serviços, diretivas e módulos. Com o Angular CLI, é possível criar rapidamente um novo projeto Angular e começar a desenvolver imediatamente.

Instalação

Para instalar o Angular CLI, é necessário ter o Node.js instalado em seu computador. Depois de instalar o Node.js, abra o terminal e execute o seguinte comando:

npm install -g @angular/cli

Isso instalará o Angular CLI globalmente em seu computador e permitirá que você crie e gerencie projetos Angular.

Criação de um novo projeto

Para criar um novo projeto Angular, basta executar o seguinte comando no terminal:

ng new nome-do-projeto

Isso criará um novo projeto Angular com o nome especificado e configurará automaticamente as dependências e arquivos necessários.

Geração de componentes, serviços, diretivas e módulos

O Angular CLI permite gerar rapidamente componentes, serviços, diretivas e módulos com o seguinte comando:

ng generate <type> <name>

O <type> pode ser um dos seguintes:

  • component: gera um novo componente.
  • service: gera um novo serviço.
  • directive: gera uma nova diretiva.
  • module: gera um novo módulo.

O <name> é o nome do componente, serviço, diretiva ou módulo que será gerado.

Por exemplo, para gerar um novo componente chamado meu-componente, execute o seguinte comando:

ng generate component meu-componente

Isso criará um novo componente chamado meu-componente com os arquivos necessários e adicionará automaticamente a importação no módulo principal de seu projeto.

Execução do servidor de desenvolvimento

Para executar o servidor de desenvolvimento do Angular, basta executar o seguinte comando no terminal:

ng serve

Isso executará o servidor de desenvolvimento e permitirá que você visualize o aplicativo em seu navegador em http://localhost:4200. O servidor de desenvolvimento também detecta automaticamente as alterações em seu código e atualiza o navegador automaticamente.

Compilação do aplicativo

Para compilar um aplicativo Angular para produção, basta executar o seguinte comando no terminal:

ng build --prod

Isso compilará o aplicativo para produção e criará os arquivos necessários na pasta dist. Esses arquivos podem ser implantados em um servidor da Web para serem executados.

Testes unitários e de integração

O Angular CLI também fornece suporte para testes unitários e de integração com o seguinte comando:

ng test

Isso executará os testes definidos em seu projeto e fornecerá informações sobre a cobertura de testes.

Resumindo a seção

O Angular CLI é uma ferramenta poderosa e versátil que ajuda a simplificar o desenvolvimento de aplicativos Angular. Com sua ajuda, é fácil criar, gerenciar e testar aplicativos Angular, economizando tempo e esforço no processo.

Module: Indispensável em Projetos Angular

Visão geral sobre Modules

O Angular é um framework poderoso e versátil, com uma grande comunidade de desenvolvedores ativos e recursos disponíveis para ajudar no aprendizado e desenvolvimento de aplicativos web. Com os modules, é possível organizar e modularizar o código, tornando-o mais fácil de manter e testar.

Além disso, o Angular oferece recursos avançados, como o Lazy Load e as rotas personalizadas, que

possibilitam o carregamento tardio de módulos e componentes, tornando o aplicativo mais rápido e eficiente.

Benefícios dos Modules

  • Organização do código: Os modules permitem agrupar o código relacionado em um único local, tornando-o mais fácil de encontrar e manter. Isso também ajuda a evitar conflitos de nomes e a garantir a modularidade do aplicativo.
  • Reutilização de código: Os modules podem ser compartilhados entre diferentes partes do aplicativo, tornando-o mais fácil de escalar e reutilizar. Isso também ajuda a evitar a duplicação de código e a manter o aplicativo consistente em toda a sua extensão.
  • Carregamento tardio: O Angular oferece suporte ao carregamento tardio de módulos e componentes, o que significa que o aplicativo só carrega o código necessário quando é necessário. Isso ajuda a tornar o aplicativo mais rápido e eficiente, especialmente em conexões de internet mais lentas.
  • Encapsulamento: Os modules permitem encapsular o código e os recursos relacionados em um único local, tornando-o mais fácil de proteger e isolar do restante do aplicativo. Isso também ajuda a garantir a consistência e a confiabilidade do aplicativo.
  • Testabilidade: Os modules tornam o código mais fácil de testar, pois permitem isolar e testar os diferentes módulos e componentes do aplicativo separadamente. Isso ajuda a garantir a qualidade do código e a reduzir os erros e falhas no aplicativo.

Com esses benefícios, é fácil ver por que os modules são uma parte essencial do desenvolvimento de aplicativos Angular. E com recursos avançados, como o Lazy Load e as rotas personalizadas, o Angular oferece uma plataforma poderosa e flexível para criar aplicativos web de alta qualidade e escaláveis.

Exemplo de código para criação de Modules com Angular CLI

Para criar um novo module com o Angular CLI, basta executar o comando ng generate module seguido do nome do módulo. Por exemplo, para criar um módulo chamado MeuModulo, basta executar o seguinte comando:

ng generate module MeuModulo

Isso criará uma nova pasta chamada meu-modulo no diretório do projeto, com os seguintes arquivos:

  • meu-modulo.module.ts: o arquivo do módulo em si, que define as dependências e as declarações do módulo;
  • meu-modulo-routing.module.ts: o arquivo de roteamento do módulo, que define as rotas específicas do módulo;
  • Caso você esqueça de criar um arquivo de rotas quando estiver criando um novo módulo com o Angular CLI, é possível criá-lo posteriormente utilizando o seguinte comando:
ng generate module MeuModulo --routing

  • Isso criará o arquivo meu-modulo-routing.module.ts, que pode ser editado para definir as rotas específicas do módulo.
  • meu-modulo.component.ts: um exemplo de componente do módulo;
  • meu-modulo.component.html: o template HTML do componente;
  • meu-modulo.component.css: o arquivo de estilo CSS do componente.

Com esses arquivos, é possível começar a construir o módulo e adicionar os componentes, serviços e outros recursos necessários. Depois de criar o módulo, ele pode ser importado em outros módulos do aplicativo, permitindo a reutilização de código e a modularização do aplicativo.

O Angular CLI é uma ferramenta poderosa e versátil para o desenvolvimento de aplicativos Angular. Com ele, é possível criar novos módulos, componentes, serviços e outros recursos com facilidade, economizando tempo e esforço no desenvolvimento do aplicativo.

Criando um novo Módulo chamado ArticleModule

Para criar um novo módulo no Angular, é preciso utilizar o AngularCLI, que é uma ferramenta de linha de comando que facilita a criação de novos projetos, componentes, serviços e módulos.

Para criar o Módulo ArticleModule, é necessário executar o comando ng generate module article no terminal, dentro do diretório do projeto. Isso criará uma nova pasta chamada article no diretório do projeto, com os seguintes arquivos:

  • article.module.ts: o arquivo do módulo em si, que define as dependências e as declarações do módulo;
  • article-routing.module.ts: o arquivo de roteamento do módulo, que define as rotas específicas do módulo;
  • article.component.ts: um exemplo de componente do módulo;
  • article.component.html: o template HTML do componente;
  • article.component.css: o arquivo de estilo CSS do componente.

Após a criação do módulo, é possível começar a construir os componentes, serviços e outros recursos necessários para a aplicação. O Módulo ArticleModule pode ser importado em outros módulos do aplicativo, permitindo a reutilização de código e a modularização do aplicativo.

Os módulos são uma parte essencial do desenvolvimento de aplicativos Angular, permitindo a organização e modularização do código, tornando-o mais fácil de manter e testar. Com o AngularCLI, a criação de novos módulos é rápida e fácil, permitindo que os desenvolvedores se concentrem na construção de funcionalidades para a aplicação.

Resumindo a seção

Neste tutorial, você aprendeu como criar um novo módulo no Angular, utilizando o AngularCLI. O Módulo ArticleModule é apenas um exemplo, mas você pode criar quantos módulos forem necessários para a sua aplicação, com os componentes, serviços e recursos que precisar. A modularização do código é uma prática importante para a construção de aplicativos escaláveis e fáceis de manter, e os módulos são uma das ferramentas mais importantes para alcançar esse objetivo.

Exemplo de Módulo e Arquivo de Rotas para Componente de Artigo

Módulo

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ArticleComponent } from './article.component';

@NgModule({
declarations: [
  ArticleComponent
],
imports: [
  CommonModule
],
exports: [
  ArticleComponent
]
})
export class ArticleModule { }

Neste exemplo, estamos importando o NgModule e o CommonModule. Em seguida, estamos declarando o ArticleComponent no array de declarações do módulo.

O CommonModule é um módulo do Angular que fornece diretivas comuns, como ngIf e ngFor. Ele também exporta diretivas comuns, como CommonModule e FormsModule.

Por fim, estamos exportando o ArticleComponent, para que ele possa ser usado em outros módulos do aplicativo.

Arquivo de Rotas

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ArticleComponent } from './article.component';

const routes: Routes = [
{ path: 'article', component: ArticleComponent }
];

@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ArticleRoutingModule { }

Neste exemplo, estamos importando o Routes e o RouterModule do @angular/router. Em seguida, estamos importando o nosso ArticleComponent.

Depois, estamos definindo uma constante routes que contém as rotas para o nosso componente. Estamos definindo uma rota para o caminho /article que usa o ArticleComponent.

Por fim, estamos exportando o RouterModule com as rotas definidas e importando-o no nosso ArticleModule.

Com esses exemplos, você pode começar a construir seu próprio aplicativo Angular com módulos e rotas personalizadas.

Trabalhando com formulários no Angular

Os formulários são uma parte essencial de qualquer aplicativo web e, no Angular, eles são fáceis de criar e gerenciar. O Angular oferece várias maneiras de criar e trabalhar com formulários, desde formulários simples a formulários complexos com validação de entrada e envio de dados.

Formulários Template-Driven

O método mais simples de trabalhar com formulários no Angular é o método Template-Driven. Ele usa diretivas do Angular para capturar e validar os dados de entrada do usuário. Aqui está um exemplo de um formulário Template-Driven simples:

<form #myForm="ngForm">
<input type="text" name="name" ngModel required>
<input type="email" name="email" ngModel required email>
<button type="submit" [disabled]="!myForm.valid">Enviar</button>
</form>

Neste exemplo, estamos usando a diretiva ngForm para capturar o formulário e a diretiva ngModel para capturar os valores de entrada do usuário. Também estamos usando as diretivas required e email para validar os campos e o operador disabled para desativar o botão de envio até que o formulário seja válido.

Formulários Reactive

O método Reactive é uma abordagem mais avançada para trabalhar com formulários no Angular. Ele usa o modelo ReactiveForms do Angular para criar e gerenciar formulários. Aqui está um exemplo de um formulário Reactive simples:

import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';

@Component({
selector: 'my-form',
template: `
  <form [formGroup]="myForm" (ngSubmit)="onSubmit()">
    <input type="text" formControlName="name">
    <input type="email" formControlName="email">
    <button type="submit" [disabled]="!myForm.valid">Enviar</button>
  </form>
`
})
export class MyFormComponent {
myForm = new FormGroup({
  name: new FormControl('', Validators.required),
  email: new FormControl('', [Validators.required, Validators.email])
});

onSubmit() {
  console.log(this.myForm.value);
}
}

Neste exemplo, estamos usando o modelo ReactiveForms do Angular para criar o formulário. Estamos definindo um FormGroup com dois FormControl para capturar os valores de entrada do usuário. Também estamos usando o operador disabled para desativar o botão de envio até que o formulário seja válido.

Com o ReactiveForms, é possível criar formulários mais complexos e personalizados, com validação de entrada e personalização de comportamento.

Vamos criar um exemplo completo de um componente de formulário para gerenciar artigos. Para começar, vamos criar o componente "artigo", a model / interface, o arquivo HTML e o módulo "Artigos".

Artigo.ts:

export interface Artigo {
id: number;
titulo: string;
conteudo: string;
}

2. Criando o componente "artigo.component.ts"

artigo.component.ts:

import { Component } from '@angular/core';
import { Artigo } from './Artigo';

@Component({
selector: 'app-artigo',
templateUrl: './artigo.component.html',
styleUrls: ['./artigo.component.css']
})
export class ArtigoComponent {
artigo: Artigo = {
  id: null,
  titulo: '',
  conteudo: ''
};

onSubmit() {
  console.log(this.artigo);
}
}

3. Criando o arquivo "artigo.component.html"

artigo.component.html:

<form (ngSubmit)="onSubmit()">
<div>
  <label for="id">ID:</label>
  <input [(ngModel)]="artigo.id" name="id" required>
</div>
<div>
  <label for="titulo">Título:</label>
  <input [(ngModel)]="artigo.titulo" name="titulo" required>
</div>
<div>
  <label for="conteudo">Conteúdo:</label>
  <textarea [(ngModel)]="artigo.conteudo" name="conteudo" required></textarea>
</div>
<button type="submit">Salvar</button>
</form>

4. Criando o módulo "Artigos"

artigos.module.ts:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { ArtigoComponent } from './artigo.component';

@NgModule({
declarations: [ArtigoComponent],
imports: [CommonModule, FormsModule],
exports: [ArtigoComponent]
})
export class ArtigosModule { }

5. Criando o arquivo de rota

artigos-routing.module.ts:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ArtigoComponent } from './artigo.component';

const routes: Routes = [
{ path: 'artigos', component: ArtigoComponent }
];

@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ArtigosRoutingModule { }

6. Registre o módulo "Artigos" no "app.module.ts"

app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { ArtigosModule } from './artigos/artigos.module';
import { AppRoutingModule } from './app-routing.module';

@NgModule({
declarations: [AppComponent],
imports: [
  BrowserModule,
  AppRoutingModule,
  ArtigosModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

Agora temos um exemplo completo de componente de formulário para gerenciar artigos, com sua model / interface, arquivo HTML, módulo "Artigos" e arquivo de rota. Isso deve proporcionar uma base sólida para começar a trabalhar com formulários no Angular e entender como a modularização e a organização dos componentes funcionam. Além disso, também é importante lembrar que, ao usar a abordagem de módulos e rotas por módulos, você pode aproveitar o Lazy Loading no Angular. O Lazy Loading permite que os módulos e componentes sejam carregados somente quando necessário, otimizando o tempo de carregamento da aplicação e melhorando a experiência do usuário.

Com este exemplo ilustramos o conceito de componentização e modularização no Angular, assim como a importância de trabalhar com módulos e rotas por módulos. Isso deve proporcionar uma base sólida para o desenvolvimento de aplicações Angular escaláveis e de fácil manutenção.

Resumindo a seção

Os formulários são uma parte essencial de qualquer aplicativo web e o Angular oferece várias maneiras de criar e gerenciar formulários, desde formulários simples a formulários complexos com validação de entrada e envio de dados. Com as diretivas do Angular e o modelo ReactiveForms, é fácil criar formulários poderosos e personalizados no Angular.

Arquivos comuns aos projetos Angular

O primeiro arquivo que vamos analisar é o index.html

<!DOCTYPE html>
<html lang="pt-br">
<head>
  <meta charset="utf-8" />
  <title>C# Corner Author Post Analytics | .Net 7 & Angular 15</title>
  <base href="/" />

  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <link rel="icon" type="image/x-icon" href="favicon.ico" />
</head>
<body>

  <svg xmlns="<http://www.w3.org/2000/svg>" style="display: none;">
    <symbol id="bootstrap" viewBox="0 0 118 94">
      <title>Bootstrap</title>


     <!-- aqui eu havia posto umas imagens em svg, mas não vem ao caso -->

      
    </symbol>
  </svg>    

  <app-root>Application loading...</app-root>

</body>
</html>

O arquivo index.html é o arquivo principal de uma aplicação web Angular. Ele é o ponto de partida para a renderização da interface do usuário, e contém a estrutura básica da página, como o doctype, a tag html, head e body.

Na seção head, são definidas informações importantes sobre a página, como o título, a codificação de caracteres, o viewport e os arquivos de estilo e scripts que devem ser importados. No caso desse arquivo em particular, vemos que ele importa um arquivo de favicon e duas imagens em formato SVG.

Na seção body, é definido o conteúdo que será exibido na página, como os elementos HTML, componentes Angular e scripts. Nesse arquivo, vemos que ele contém um componente Angular com a tag <app-root>, que exibe a mensagem "Application loading..." enquanto a aplicação é carregada.

Em resumo, o arquivo index.html é o ponto de entrada para uma aplicação Angular, e contém a estrutura básica da página, bem como as informações necessárias para sua renderização e funcionamento.

Agora vamos ver o arquivo: main.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';

platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));

O arquivo main.ts é responsável por inicializar e executar o módulo principal da aplicação Angular. Ele importa o módulo principal AppModule e usa a função

platformBrowserDynamic().bootstrapModule() para inicializá-lo e executá-lo no navegador.

Essa função é responsável por compilar os componentes Angular, criar um injetor de dependência e iniciar a aplicação. Se ocorrer algum erro durante o processo de inicialização, a função catch() será chamada para exibir o erro no console do navegador.

Em resumo, o arquivo main.ts é responsável por inicializar e executar o módulo principal da aplicação Angular, e é uma parte crucial para o funcionamento da aplicação.

Este é o nosso styles.css

/* You can add global styles to this file, and also import other style files */
/* @import "~bootstrap/dist/css/bootstrap.css";
@import "~font-awesome/css/font-awesome.css"; */

.cas-min-lenght-content{
min-height: 350px;
}

O arquivo styles.css contém a definição de estilos globais que podem ser aplicados a toda a aplicação Angular. Ele também permite a importação de outros arquivos de estilos, como os arquivos CSS do Bootstrap e do Font Awesome.

No entanto, no arquivo em questão, essas importações estão comentadas, o que significa que esses arquivos não serão utilizados.

Além disso, o arquivo define uma classe chamada .cas-min-lenght-content, que define uma altura mínima de 350 pixels para o conteúdo. Essa classe pode ser utilizada para garantir que o conteúdo de determinado componente tenha sempre uma altura mínima, mesmo que o conteúdo seja pequeno.

Em resumo, o arquivo styles.css contém estilos globais que podem ser aplicados a toda a aplicação Angular, e define uma classe que garante uma altura mínima para o conteúdo de determinado componente.

Nosso arquivo: .angulardoc.json

{
"repoId": "3466f569-72b9-47a0-886d-fb6028ba3e67",
"lastSync": 0
}

O arquivo .angulardoc.json é um arquivo de configuração utilizado pelo Angular para realizar o processo de build da aplicação. Ele contém informações sobre as dependências, os arquivos de entrada e saída, as configurações de compilação, entre outras coisas.

No código JSON fornecido, vemos que o arquivo contém dois campos: repoId e lastSync.

O campo repoId é um identificador único para o repositório no qual a aplicação está sendo desenvolvida. Esse identificador pode ser usado para rastrear a versão da aplicação e suas alterações ao longo do tempo.

O campo lastSync indica a última vez que a aplicação foi sincronizada com o repositório. Esse valor é definido em milissegundos desde a época Unix (1 de janeiro de 1970) e é usado para verificar se a aplicação precisa ser atualizada ou não.

Em resumo, o arquivo .angulardoc.json é um arquivo de configuração usado pelo Angular para realizar o processo de build da aplicação, e contém informações sobre as dependências, arquivos e configurações de compilação. O código JSON fornecido contém informações sobre o identificador do repositório e a última vez que a aplicação foi sincronizada com o repositório.

Vamos dar uma olhada em nosso arquivo: .editorconfig

# Editor configuration, see <https://editorconfig.org>
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false

O arquivo .editorconfig é um arquivo de configuração que define as configurações de formatação de código para diferentes editores de texto e ambientes de desenvolvimento. Ele é usado para garantir que o código seja formatado de maneira consistente em toda a equipe de desenvolvimento, independentemente do editor de texto utilizado.

O arquivo começa com a linha root = true, que indica que o arquivo .editorconfig é o arquivo de configuração raiz e deve ser aplicado a todo o projeto.

Em seguida, temos uma seção [*], que define as configurações de formatação padrão para todos os arquivos, independentemente da extensão do arquivo. Nessa seção, temos as seguintes configurações:

  • charset = utf-8: define a codificação de caracteres para UTF-8.
  • indent_style = space: define que o recuo deve ser feito com espaços.
  • indent_size = 2: define o tamanho do recuo como 2 espaços.
  • insert_final_newline = true: define que uma nova linha deve ser adicionada ao final do arquivo.
  • trim_trailing_whitespace = true: define que espaços em branco no final de uma linha devem ser removidos.

Depois disso, temos uma seção [*.ts], que define as configurações de formatação específicas para arquivos com a extensão .ts. Nessa seção, temos a seguinte configuração:

  • quote_type = single: define que aspas simples devem ser usadas para delimitar strings.

Por fim, temos uma seção [*.md], que define as configurações de formatação específicas para arquivos com a extensão .md (Markdown). Nessa seção, temos as seguintes configurações:

  • max_line_length = off: desativa a verificação de comprimento máximo de linha.
  • trim_trailing_whitespace = false: define que espaços em branco no final de uma linha não devem ser removidos.

Em resumo, o arquivo .editorconfig é um arquivo de configuração usado para definir as configurações de formatação de código para diferentes editores de texto e ambientes de desenvolvimento, e o conteúdo do arquivo define as configurações padrão para todos os arquivos, bem como configurações específicas para arquivos com as extensões .ts e .md.

Vamos analisar, agora o arquivo: .gitignore

# See <http://help.github.com/ignore-files/> for more about ignoring files.

# Compiled output
/dist
/tmp
/out-tsc
/bazel-out

# Node
/node_modules
npm-debug.log
yarn-error.log

# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings

# System files
.DS_Store
Thumbs.db

O arquivo .gitignore é usado para especificar arquivos e pastas que o Git deve ignorar ao rastrear alterações em um repositório Git. Isso é útil para evitar que arquivos desnecessários ou confidenciais sejam incluídos no repositório, o que pode aumentar o tamanho do repositório e comprometer a segurança dos dados.

Abaixo, vamos analisar cada bloco e linha do arquivo:

  • # Compiled output: Comentário que indica que os arquivos gerados pelo processo de compilação devem ser ignorados.
  • /dist: Ignora a pasta dist.
  • /tmp: Ignora a pasta tmp.
  • /out-tsc: Ignora a pasta out-tsc.
  • /bazel-out: Ignora a pasta bazel-out.
  • # Node: Comentário que indica que arquivos relacionados ao Node.js devem ser ignorados.
  • /node_modules: Ignora a pasta node_modules.
  • npm-debug.log: Ignora o arquivo npm-debug.log.
  • yarn-error.log: Ignora o arquivo yarn-error.log.
  • # IDEs and editors: Comentário que indica que arquivos relacionados a IDEs e editores devem ser ignorados.
  • .idea/: Ignora a pasta .idea.
  • .project: Ignora o arquivo .project.
  • .classpath: Ignora o arquivo .classpath.
  • .c9/: Ignora a pasta .c9.
  • .launch: Ignora arquivos com a extensão .launch.
  • .settings/: Ignora a pasta .settings.
  • .sublime-workspace: Ignora arquivos com a extensão .sublime-workspace.
  • # Visual Studio Code: Comentário que indica que arquivos relacionados ao Visual Studio Code devem ser ignorados.
  • .vscode/*: Ignora todos os arquivos na pasta .vscode.
  • !.vscode/settings.json: Não ignora o arquivo settings.json na pasta .vscode.
  • !.vscode/tasks.json: Não ignora o arquivo tasks.json na pasta .vscode.
  • !.vscode/launch.json: Não ignora o arquivo launch.json na pasta .vscode.
  • !.vscode/extensions.json: Não ignora o arquivo extensions.json na pasta .vscode.
  • .history/*: Ignora todos os arquivos na pasta .history.
  • # Miscellaneous: Comentário que indica que outros arquivos devem ser ignorados.
  • /.angular/cache: Ignora a pasta .angular/cache.
  • .sass-cache/: Ignora a pasta .sass-cache.
  • /connect.lock: Ignora o arquivo connect.lock.
  • /coverage: Ignora a pasta coverage.
  • /libpeerconnection.log: Ignora o arquivo libpeerconnection.log.
  • testem.log: Ignora o arquivo testem.log.
  • /typings: Ignora a pasta typings.
  • # System files: Comentário que indica que arquivos do sistema devem ser ignorados.
  • .DS_Store: Ignora o arquivo .DS_Store.
  • Thumbs.db: Ignora o arquivo Thumbs.db.

Um dos arquivos chaves de uma aplicação Angular: “angular.json”:

  • O nosso arquivo angular.json deve se parecer muito com esse, pois este foi gerado no código base do nosso Use Case.
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
  "ClientNg15": {
    "projectType": "application",
    "schematics": {
      "@schematics/angular:component": {
        "skipTests": true
      },
      "@schematics/angular:service": {
        "skipTests": true
      }
    },
    "root": "",
    "sourceRoot": "src",
    "prefix": "app",
    "architect": {
      "build": {
        "builder": "@angular-devkit/build-angular:browser",
        "options": {
          "outputPath": "dist/client-ng15",
          "index": "src/index.html",
          "main": "src/main.ts",
          "polyfills": [
            "zone.js"
          ],
          "tsConfig": "tsconfig.app.json",
          "assets": [
            "src/favicon.ico",
            "src/assets"
          ],
          "styles": [
            "node_modules/bootstrap/dist/css/bootstrap.min.css",
            "node_modules/font-awesome/css/font-awesome.min.css",
            "src/styles.css"
          ],
          "scripts": [
            "node_modules/bootstrap/dist/js/bootstrap.bundle.js"
          ]
        },
        "configurations": {
          "production": {
            "budgets": [
              {
                "type": "initial",
                "maximumWarning": "500kb",
                "maximumError": "1mb"
              },
              {
                "type": "anyComponentStyle",
                "maximumWarning": "2kb",
                "maximumError": "4kb"
              }
            ],
            "fileReplacements": [
              {
                "replace": "src/environments/environment.ts",
                "with": "src/environments/environment.prod.ts"
              }
            ],              
            "outputHashing": "all"
          },
          "development": {
            "buildOptimizer": false,
            "optimization": false,
            "vendorChunk": true,
            "extractLicenses": false,
            "sourceMap": true,
            "namedChunks": true
          }
        },
        "defaultConfiguration": "production"
      },
      "serve": {
        "builder": "@angular-devkit/build-angular:dev-server",
        "configurations": {
          "production": {
            "browserTarget": "ClientNg15:build:production"
          },
          "development": {
            "browserTarget": "ClientNg15:build:development"
          }
        },
        "defaultConfiguration": "development"
      },
      "extract-i18n": {
        "builder": "@angular-devkit/build-angular:extract-i18n",
        "options": {
          "browserTarget": "ClientNg15:build"
        }
      },
      "test": {
        "builder": "@angular-devkit/build-angular:karma",
        "options": {
          "polyfills": [
            "zone.js",
            "zone.js/testing"
          ],
          "tsConfig": "tsconfig.spec.json",
          "assets": [
            "src/favicon.ico",
            "src/assets"
          ],
          "styles": [
            "src/styles.css"
          ],
          "scripts": []
        }
      }
    }
  }
},
"cli": {
  "analytics": "3bf28343-fc2e-49a4-8834-4a543eb8a0df"
}
}

O arquivo angular.json é um arquivo de configuração fundamental para o processo de build de uma aplicação Angular. Ele define informações sobre os projetos, as configurações de compilação, as dependências, entre outras coisas. Abaixo, vamos analisar cada bloco e linha do arquivo.

  • "$schema": "./node_modules/@angular/cli/lib/config/schema.json": Especifica o caminho para o arquivo de schema usado para validar o arquivo angular.json.
  • "version": 1: Especifica a versão do arquivo de configuração.
  • "newProjectRoot": "projects": Especifica o nome da pasta raiz para novos projetos.
  • "projects": {}: Define uma lista de projetos. Nesse caso, há apenas um projeto, chamado ClientNg15.
  • "ClientNg15": {}: Configurações específicas para o projeto ClientNg15.
  • "projectType": "application": Especifica que o projeto é uma aplicação.
  • "schematics": {}: Define as configurações de esquemas para o projeto. Nesse caso, há configurações específicas para os esquemas @schematics/angular:component e @schematics/angular:service.
  • "root": "": Especifica o diretório raiz do projeto.
  • "sourceRoot": "src": Especifica o diretório raiz dos arquivos de origem.
  • "prefix": "app": Especifica o prefixo dos componentes gerados automaticamente.
  • "architect": {}: Define as configurações de compilação e outras tarefas para o projeto.
  • "build": {}: Define as configurações de compilação para o projeto.
  • "builder": "@angular-devkit/build-angular:browser": Especifica o nome do construtor usado para a compilação da aplicação.
  • "options": {}: Define as opções para o construtor de compilação.
  • "outputPath": "dist/client-ng15": Especifica o diretório de saída para a compilação.
  • "index": "src/index.html": Especifica o caminho para o arquivo HTML de entrada.
  • "main": "src/main.ts": Especifica o caminho para o arquivo TypeScript principal.
  • "polyfills": ["zone.js"]: Especifica os arquivos de polifills a serem incluídos.
  • (!) Os polyfills são pedaços de código que preenchem a lacuna entre as funcionalidades disponíveis em diferentes navegadores e as funcionalidades que seu código precisa. Eles permitem que seu código funcione em todos os navegadores, independentemente de quais recursos estão disponíveis. Por exemplo, o arquivo zone.js é um polifill para o recurso de zona de eventos do JavaScript, que não está disponível em todos os navegadores.
  • "tsConfig": "tsconfig.app.json": Especifica o caminho para o arquivo de configuração do TypeScript.
  • "assets": ["src/favicon.ico", "src/assets"]: Especifica os arquivos estáticos a serem incluídos na compilação.
  • "styles": ["node_modules/bootstrap/dist/css/bootstrap.min.css", "node_modules/font-awesome/css/font-awesome.min.css", "src/styles.css"]: Especifica os arquivos CSS a serem incluídos na compilação.
  • "scripts": ["node_modules/bootstrap/dist/js/bootstrap.bundle.js"]: Especifica os arquivos JavaScript a serem incluídos na compilação.
  • "configurations": {}: Define configurações específicas para diferentes ambientes.
  • "production": {}: Configurações específicas para o ambiente de produção.
  • "budgets": [{}]: Define as restrições de tamanho para a compilação.
  • "fileReplacements": [{}]: Define os arquivos a serem substituídos para a compilação.
  • "outputHashing": "all": Especifica a estratégia de hashing para os arquivos de saída.
  • "development": {}: Configurações específicas para o ambiente de desenvolvimento.
  • "buildOptimizer": false: Especifica se o otimizador de build deve ser usado ou não.
  • "optimization": false: Especifica se a otimização de build deve ser usada ou não. No ambiente de desenvolvimento, essa opção é desativada.
  • "vendorChunk": true: Especifica se um chunk separado deve ser criado para o código de terceiros.
  • "extractLicenses": false: Especifica se as informações de licença devem ser extraídas para um arquivo separado.
  • "sourceMap": true: Especifica se os source maps devem ser gerados ou não.
  • "namedChunks": true: Especifica se os chunks devem ter nomes legíveis ou não.
  • (!) Configurações de compilação e outras tarefas para o projeto:
  • "defaultConfiguration": "production": Especifica a configuração padrão para a compilação. Nesse caso, é a configuração de produção.
  • "serve": {}: Define as configurações para a tarefa de execução local do projeto.
  • "builder": "@angular-devkit/build-angular:dev-server": Especifica o construtor usado para a tarefa de execução local.
  • "configurations": {}: Define configurações específicas para diferentes ambientes.
  • "production": {}: Configurações específicas para o ambiente de produção.
  • "browserTarget": "ClientNg15:build:production": Especifica o alvo da compilação de produção.
  • "development": {}: Configurações específicas para o ambiente de desenvolvimento.
  • "browserTarget": "ClientNg15:build:development": Especifica o alvo da compilação de desenvolvimento.
  • "defaultConfiguration": "development": Especifica a configuração padrão para a execução local. Nesse caso, é a configuração de desenvolvimento.
  • "extract-i18n": {}: Define as configurações para a tarefa de extração de recursos de internacionalização.
  • "builder": "@angular-devkit/build-angular:extract-i18n": Especifica o construtor usado para a tarefa de extração de recursos de internacionalização.
  • "options": {}: Define as opções para o construtor de extração de recursos de internacionalização.
  • "browserTarget": "ClientNg15:build": Especifica o alvo da compilação para a extração de recursos de internacionalização.
  • "test": {}: Define as configurações para a tarefa de teste.
  • "builder": "@angular-devkit/build-angular:karma": Especifica o construtor usado para a tarefa de teste.
  • "options": {}: Define as opções para o construtor de teste.
  • "polyfills": ["zone.js", "zone.js/testing"]: Especifica os arquivos de polifills a serem incluídos.
  • (!) Os polyfills são pedaços de código que preenchem a lacuna entre as funcionalidades disponíveis em diferentes navegadores e as funcionalidades que seu código precisa. Eles permitem que seu código funcione em todos os navegadores, independentemente de quais recursos estão disponíveis. Por exemplo, o arquivo zone.js é um polifill para o recurso de zona de eventos do JavaScript, que não está disponível em todos os navegadores.
  • "tsConfig": "tsconfig.spec.json": Especifica o caminho para o arquivo de configuração do TypeScript.
  • "assets": ["src/favicon.ico", "src/assets"]: Especifica os arquivos estáticos a serem incluídos no teste.
  • "styles": ["src/styles.css"]: Especifica os arquivos CSS a serem incluídos no teste.
  • "scripts": []: Especifica os arquivos JavaScript a serem incluídos no teste.

O arquivo angular.json é um arquivo de configuração muito importante para o desenvolvimento de aplicações Angular, pois ele define muitas das opções de compilação e build que são necessárias para a geração do código final. É importante que os desenvolvedores tenham conhecimento sobre o seu conteúdo para que possam ajustar as opções de acordo com as necessidades de suas aplicações.

Arquivo: “package-lock.json”:

  • Bom, este arquivo é gigantesco e vamos apenas fazer um resumo de suas atribuições e o porque dele existir. Seguem uma parte inicial do arquivo gerado em nosso Use Case e, depois, apenas a parte final, pois é autoexplicativo, ok?
{
"name": "client-ng15",
"version": "1.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
  "": {
    "name": "client-ng15",
    "version": "1.1.0",
    "dependencies": {
      "@angular/animations": "^15.0.0",
      "@angular/common": "^15.0.0",
      "@angular/compiler": "^15.0.0",
      "@angular/core": "^15.0.0",
      "@angular/forms": "^15.0.0",
      "@angular/platform-browser": "^15.0.0",
      "@angular/platform-browser-dynamic": "^15.0.0",
      "@angular/router": "^15.0.0",
      "bootstrap": "^5.1.3",
      "chart.js": "^3.7.1",
      "font-awesome": "^4.7.0",
      "ng2-charts": "^3.0.8",
      "rxjs": "~7.5.0",
      "tslib": "^2.3.0",
      "zone.js": "~0.12.0"
    },
    "devDependencies": {
      "@angular-devkit/build-angular": "^15.0.4",
      "@angular/cli": "~15.0.4",
      "@angular/compiler-cli": "^15.0.0",
      "@types/jasmine": "~4.3.0",
      "jasmine-core": "~4.5.0",
      "karma": "~6.4.0",
      "karma-chrome-launcher": "~3.1.0",
      "karma-coverage": "~2.2.0",
      "karma-jasmine": "~5.1.0",
      "karma-jasmine-html-reporter": "~2.0.0",
      "typescript": "~4.8.2"
    }
  },
  "node_modules/@ampproject/remapping": {
    "version": "2.2.0",
    "resolved": "<https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz>",
    "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
    "dev": true,
    "dependencies": {
      "@jridgewell/gen-mapping": "^0.1.0",
      "@jridgewell/trace-mapping": "^0.3.9"
    },
    "engines": {
      "node": ">=6.0.0"
    }
  },

      /* apenas para encurtar. É importante frisar que nem todos os 
           interpletadores reconhecem comentários em arquivos JSON. */

      "yargs": {
    "version": "17.6.2",
    "resolved": "<https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz>",
    "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
    "dev": true,
    "requires": {
      "cliui": "^8.0.1",
      "escalade": "^3.1.1",
      "get-caller-file": "^2.0.5",
      "require-directory": "^2.1.1",
      "string-width": "^4.2.3",
      "y18n": "^5.0.5",
      "yargs-parser": "^21.1.1"
    }
  },
  "yargs-parser": {
    "version": "21.1.1",
    "resolved": "<https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz>",
    "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
    "dev": true
  },
  "zone.js": {
    "version": "0.12.0",
    "resolved": "<https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz>",
    "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==",
    "requires": {
      "tslib": "^2.3.0"
    }
  }
}
}

O arquivo package-lock.json é gerado automaticamente pelo NPM (Node Package Manager) para guardar informações detalhadas sobre as dependências de um projeto. Ele garante que outras pessoas que baixarem essas dependências terão exatamente as mesmas versões que foram usadas no projeto original, evitando problemas de compatibilidade entre diferentes versões de pacotes. Esse arquivo deve ser compartilhado junto com o projeto para que outras pessoas possam reproduzir o ambiente de desenvolvimento com as mesmas dependências. No arquivo, cada pacote tem seu próprio bloco com informações sobre nome, versão, dependências, etc. O trecho de código apresentado no seu pedido contém informações sobre algumas das dependências do projeto.

Nosso arquivo: “package.json”:

{
"name": "client-ng15",
"version": "1.1.0",
"scripts": {
  "ng": "ng",
  "start": "ng serve --watch --port=4111",
  "build": "ng build",
  "watch": "ng build --watch --configuration development",
  "test": "ng test"
},
"private": true,
"dependencies": {
  "@angular/animations": "^15.0.0",
  "@angular/common": "^15.0.0",
  "@angular/compiler": "^15.0.0",
  "@angular/core": "^15.0.0",
  "@angular/forms": "^15.0.0",
  "@angular/platform-browser": "^15.0.0",
  "@angular/platform-browser-dynamic": "^15.0.0",
  "@angular/router": "^15.0.0",
  "bootstrap": "^5.1.3",
  "chart.js": "^3.7.1",
  "font-awesome": "^4.7.0",
  "ng2-charts": "^3.0.8",
  "rxjs": "~7.5.0",
  "tslib": "^2.3.0",
  "zone.js": "~0.12.0"
},
"devDependencies": {
  "@angular-devkit/build-angular": "^15.0.4",
  "@angular/cli": "~15.0.4",
  "@angular/compiler-cli": "^15.0.0",
  "@types/jasmine": "~4.3.0",
  "jasmine-core": "~4.5.0",
  "karma": "~6.4.0",
  "karma-chrome-launcher": "~3.1.0",
  "karma-coverage": "~2.2.0",
  "karma-jasmine": "~5.1.0",
  "karma-jasmine-html-reporter": "~2.0.0",
  "typescript": "~4.8.2"
}
}

Explicando passo a passo nosso arquivo package.json:

O arquivo package.json é um arquivo de configuração fundamental para o desenvolvimento de aplicações Angular, pois ele define as dependências e scripts necessários para a execução do projeto. Ele também armazena informações sobre o nome, versão e descrição do projeto, bem como outras informações úteis para a construção do projeto.

Segue o conteúdo do arquivo package.json, linha a linha:

  • "name": "client-ng15": Especifica o nome do projeto.
  • "version": "1.1.0": Especifica a versão atual do projeto.
  • "scripts": {}: Especifica os comandos disponíveis para o projeto.
  • "ng": "ng": Especifica o comando principal do Angular CLI.
  • "start": "ng serve --watch --port=4111": • Especifica o comando para iniciar o servidor de desenvolvimento, em modo de observação e altera a porta padrão para a 4111.
  • "build": "ng build": Especifica o comando para compilar o projeto.
  • "watch": "ng build --watch --configuration development": Especifica o comando para compilar o projeto em modo de observação.
  • "test": "ng test": Especifica o comando para executar os testes do projeto.
  • "private": true: Especifica se o projeto é privado ou não.
  • "dependencies": {}: Especifica as dependências necessárias para executar o projeto em produção.
  • "@angular/animations": "^15.0.0": Especifica a versão necessária da biblioteca de animações do Angular.
  • "@angular/common": "^15.0.0": Especifica a versão necessária da biblioteca comum do Angular.
  • "@angular/compiler": "^15.0.0": Especifica a versão necessária do compilador do Angular.
  • "@angular/core": "^15.0.0": Especifica a versão necessária do núcleo do Angular.
  • "@angular/forms": "^15.0.0": Especifica a versão necessária da biblioteca de formulários do Angular.
  • "@angular/platform-browser": "^15.0.0": Especifica a versão necessária da biblioteca de navegador do Angular.
  • "@angular/platform-browser-dynamic": "^15.0.0": Especifica a versão necessária da biblioteca de dinâmica do navegador do Angular.
  • "@angular/router": "^15.0.0": Especifica a versão necessária da biblioteca de roteamento do Angular.
  • "bootstrap": "^5.1.3": Especifica a versão necessária do framework Bootstrap.
  • "chart.js": "^3.7.1": Especifica a versão necessária da biblioteca de gráficos Chart.js.
  • "font-awesome": "^4.7.0": Especifica a versão necessária da biblioteca de ícones Font Awesome.
  • "ng2-charts": "^3.0.8": Especifica a versão necessária da biblioteca de gráficos NG2-Charts.
  • "rxjs": "~7.5.0": Especifica a versão necessária da biblioteca RxJS.
  • "tslib": "^2.3.0": Especifica a versão necessária da biblioteca tslib.
  • "zone.js": "~0.12.0": Especifica a versão necessária da biblioteca Zone.js.
  • Na seção "devDependencies": {} especifica as dependências necessárias para o desenvolvimento do projeto. Essas dependências incluem ferramentas para compilar, testar e depurar o código, bem como outras bibliotecas e ferramentas úteis para o desenvolvimento.

Segue abaixo a descrição de cada dependência listada na seção "devDependencies": {}:

  • "@angular-devkit/build-angular": "^15.0.4": Especifica a versão necessária do Angular CLI para compilar o projeto.
  • "@angular/cli": "~15.0.4": Especifica a versão necessária do Angular CLI.
  • "@angular/compiler-cli": "^15.0.0": Especifica a versão necessária do compilador do Angular para compilar o projeto.
  • "@types/jasmine": "~4.3.0": Especifica a versão necessária das definições de tipos do Jasmine para suporte a testes.
  • "jasmine-core": "~4.5.0": Especifica a versão necessária do framework Jasmine para testes.
  • "karma": "~6.4.0": Especifica a versão necessária do Karma, um test runner para JavaScript.
  • "karma-chrome-launcher": "~3.1.0": Especifica a versão necessária do Chrome Launcher para o Karma.
  • "karma-coverage": "~2.2.0": Especifica a versão necessária do plugin de cobertura de código para o Karma.
  • "karma-jasmine": "~5.1.0": Especifica a versão necessária do plugin Jasmine para o Karma.
  • "karma-jasmine-html-reporter": "~2.0.0": Especifica a versão necessária do plugin de relatório HTML para o Karma.
  • "typescript": "~4.8.2": Especifica a versão necessária do TypeScript, uma linguagem de programação que compila em JavaScript.

Essas dependências são importantes para o desenvolvimento do projeto, pois fornecem as ferramentas necessárias para compilar e testar o código, garantindo que ele seja executado corretamente.

Arquivo: README.md

# ClientNg15

This project was generated with [Angular CLI](<https://github.com/angular/angular-cli>) version 15.0.4.

## Development server

Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.

## Code scaffolding

Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.

## Build

Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.

## Running unit tests

Run `ng test` to execute the unit tests via [Karma](<https://karma-runner.github.io>).

## Running end-to-end tests

Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.

## Further help

To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](<https://angular.io/cli>) page.

O arquivo README.md é um arquivo de documentação importante para o projeto, geralmente usado para fornecer informações sobre o projeto, como descrição, instruções de uso, licença, entre outras informações relevantes. Ele é exibido na página principal do repositório no GitHub e pode ser acessado por qualquer pessoa que esteja interessada no projeto.

No caso específico deste projeto Angular, o arquivo README.md contém informações detalhadas sobre o funcionamento do projeto, desde a descrição até as instruções de uso, passando pelas dependências necessárias, scripts e comandos disponíveis para a execução do projeto.

O conteúdo do arquivo README.md apresentado no seu pedido inclui informações sobre como executar o servidor de desenvolvimento, como gerar componentes, como compilar o projeto e como executar testes unitários e de ponta a ponta. Além disso, o arquivo fornece informações sobre como obter mais ajuda usando o Angular CLI.

A seção "Development server" fornece informações sobre como executar o servidor de desenvolvimento, que é uma ferramenta importante para testar o projeto em tempo real. A seção "Code scaffolding" descreve como gerar componentes e outras estruturas de código usando o Angular CLI.

A seção "Build" descreve como compilar o projeto em um pacote pronto para implantação em produção. A seção "Running unit tests" descreve como executar testes unitários, que são testes que verificam se cada unidade de código funciona corretamente. A seção "Running end-to-end tests" descreve como executar testes de ponta a ponta, que são testes que verificam se todo o sistema funciona corretamente.

Por fim, a seção "Further help" fornece informações sobre como obter mais ajuda com o Angular CLI, incluindo como obter ajuda online e como usar a documentação oficial do Angular.

Em resumo, o arquivo README.md é uma parte importante da documentação do projeto Angular, fornecendo informações essenciais para o desenvolvimento, teste e implantação do projeto. Ele deve ser mantido atualizado com as informações mais recentes sobre o projeto e deve ser escrito de forma clara e concisa para que outros usuários possam entender facilmente o funcionamento do projeto e como usá-lo.

Arquivo: tsconfig.app.json

/* To learn more about this file see: <https://angular.io/config/tsconfig>. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
  "outDir": "./out-tsc/app",
  "types": []
},
"files": [
  "src/main.ts"
],
"include": [
  "src/**/*.d.ts"
]
}

O arquivo é o tsconfig.app.json. Ele é usado pelo compilador TypeScript para configurar a compilação do aplicativo Angular. Ele é uma extensão do arquivo tsconfig.json e define as opções de compilação específicas para o aplicativo, como o diretório de saída e as configurações de tipo. O arquivo também especifica quais arquivos devem ser incluídos na compilação, como os arquivos de definição de tipo.

Arquivo: tsconfig.json

/* To learn more about this file see: <https://angular.io/config/tsconfig>. */
{
"compileOnSave": false,
"compilerOptions": {
  "baseUrl": "./",
  "outDir": "./dist/out-tsc",
  "forceConsistentCasingInFileNames": true,
  "strict": true,
  "noImplicitOverride": true,
  "noPropertyAccessFromIndexSignature": true,
  "noImplicitReturns": true,
  "noFallthroughCasesInSwitch": true,
  "sourceMap": true,
  "declaration": false,
  "downlevelIteration": true,
  "experimentalDecorators": true,
  "moduleResolution": "node",
  "importHelpers": true,
  "target": "ES2022",
  "module": "ES2022",
  "useDefineForClassFields": false,
  "lib": [
    "ES2022",
    "dom"
  ]
},
"angularCompilerOptions": {
  "enableI18nLegacyMessageIdFormat": false,
  "strictInjectionParameters": true,
  "strictInputAccessModifiers": true,
  "strictTemplates": true
}
}

O arquivo tsconfig.json é um arquivo de configuração do TypeScript para um projeto Angular. Ele define as opções de compilação e as configurações do compilador TypeScript para o projeto. O arquivo é usado pelo compilador TypeScript para gerar o JavaScript que será executado no navegador.

O arquivo tsconfig.json define várias opções de compilação, como o diretório de saída, as definições de tipo e as opções de compilação específicas do Angular. O arquivo também define as configurações do compilador TypeScript, como as opções de strict mode, as opções de módulo e as opções de linguagem. Essas opções ajudam a garantir que o código seja executado corretamente e que os erros sejam detectados durante a compilação.

No caso específico do arquivo tsconfig.json fornecido no seu pedido, ele define as seguintes opções:

  • "compileOnSave": false: Especifica se o projeto deve ser compilado automaticamente ao salvar.
  • "compilerOptions": {}: Especifica as opções de compilação para o projeto.
  • "baseUrl": "./": Especifica a raiz do projeto para a resolução de módulos.
  • "outDir": "./dist/out-tsc": Especifica o diretório de saída para os arquivos compilados.
  • "forceConsistentCasingInFileNames": true: Especifica se o compilador deve garantir que os nomes de arquivos e tipos sejam consistentes.
  • "strict": true: Ativa o strict mode, que impõe regras rígidas para o código TypeScript.
  • "noImplicitOverride": true: Ativa a detecção de sobrescrita implícita de métodos.
  • "noPropertyAccessFromIndexSignature": true: Ativa a detecção de acesso a propriedades em índices de assinaturas.
  • "noImplicitReturns": true: Ativa a detecção de retorno implícito de funções.
  • "noFallthroughCasesInSwitch": true: Ativa a detecção de casos de switch sem break.
  • "sourceMap": true: Especifica se os arquivos de mapa de origem devem ser gerados.
  • "declaration": false: Especifica se os arquivos de definição de tipo devem ser gerados.
  • "downlevelIteration": true: Especifica se a iteração deve ser convertida em loops while.
  • "experimentalDecorators": true: Ativa os decoradores experimentais do TypeScript.
  • "moduleResolution": "node": Especifica o método de resolução de módulo.
  • "importHelpers": true: Especifica se os helpers devem ser importados em vez de inlined.
  • "target": "ES2022": Especifica a versão do ECMAScript que o código deve ser compilado.
  • "module": "ES2022": Especifica o formato de módulo que o código deve ser compilado.
  • "useDefineForClassFields": false: Especifica se o uso do define para campos de classe é permitido.
  • "lib": []: Especifica as bibliotecas TypeScript disponíveis para o projeto.
  • "angularCompilerOptions": {}: Especifica as opções de compilação específicas do Angular.
  • "enableI18nLegacyMessageIdFormat": false: Especifica se as mensagens i18n devem ser geradas no formato legado.
  • "strictInjectionParameters": true: Ativa a verificação de parâmetros de injeção de dependência.
  • "strictInputAccessModifiers": true: Ativa a verificação das propriedades de entrada em componentes.
  • Arquivo: tsconfig.spec.json
/* To learn more about this file see: <https://angular.io/config/tsconfig>. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
  "outDir": "./out-tsc/spec",
  "types": [
    "jasmine"
  ]
},
"include": [
  "src/**/*.spec.ts",
  "src/**/*.d.ts"
]
}
  • O arquivo tsconfig.spec.json é um arquivo de configuração do TypeScript para testes de unidade em um projeto Angular. Ele é uma extensão do arquivo tsconfig.json e define as opções de compilação específicas para a execução de testes, incluindo o diretório de saída e as definições de tipo necessárias para suporte a testes com o framework Jasmine.
  • No arquivo tsconfig.spec.json são definidas as seguintes opções:
  • "extends": "./tsconfig.json": Especifica que o arquivo tsconfig.spec.json é uma extensão do arquivo tsconfig.json.
  • "compilerOptions": {}: Especifica as opções de compilação para o projeto de testes.
  • "outDir": "./out-tsc/spec": Especifica o diretório de saída para os arquivos compilados de teste.
  • "types": [ "jasmine" ]: Especifica as definições de tipo necessárias para o suporte ao framework de testes Jasmine.
  • "include": []: Especifica os arquivos que devem ser incluídos na compilação. Neste caso, são incluídos os arquivos de teste e as definições de tipo necessárias para suporte a testes com o framework Jasmine.
  • Com essas opções de configuração, o arquivo tsconfig.spec.json define as opções necessárias para compilar e executar testes de unidade em um projeto Angular. Ele é importante para garantir que os testes sejam executados corretamente e que o código seja devidamente testado para detectar erros e bugs.

Arquivos: “environment.prod.ts” e “environment.ts

export const environment = {
production: true
};
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.

export const environment = {
production: false,
 baseUrl: '<https://localhost:44355/>'
};

/*
 * For easier debugging in development mode, you can import the following file
 * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
 *
 * This import should be commented out in production mode because it will have a negative impact
 * on performance if an error is thrown.
 */
// import 'zone.js/plugins/zone-error';  // Included with Angular CLI.

Os arquivos environment.prod.ts e environment.ts são arquivos que definem as configurações de ambiente para um projeto Angular.

O arquivo environment.prod.ts é usado para definir as configurações de ambiente para o ambiente de produção, enquanto o arquivo environment.ts é usado para definir as configurações de ambiente para o ambiente de desenvolvimento.

Ambos os arquivos exportam um objeto que contém uma propriedade production, que é definida como true no arquivo environment.prod.ts e false no arquivo environment.ts. Esta propriedade é usada para determinar se o projeto está sendo executado no ambiente de produção ou no ambiente de desenvolvimento.

Além disso, o arquivo environment.ts contém outras configurações de ambiente, como a URL base para a API do backend, que é diferente para cada ambiente. O comentário no arquivo explica que, durante a compilação, o arquivo environment.ts é substituído pelo arquivo environment.prod.ts, que contém as configurações de ambiente para o ambiente de produção.

Em resumo, os arquivos environment.prod.ts e environment.ts são usados para definir as configurações de ambiente para um projeto Angular, incluindo informações sobre se o projeto está sendo executado no ambiente de produção ou no ambiente de desenvolvimento, bem como outras configurações específicas do ambiente.

Arquivo: app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

import { HomeComponent } from './home/home.component';
import { NavMenuComponent } from './nav-menu/nav-menu.component';
import { FooterComponent } from './footer/footer.component';

import { HttpClientModule } from '@angular/common/http';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { NgChartsModule } from 'ng2-charts';
import { NotFoundComponent } from './pages/not-found/not-found.component';

@NgModule({
declarations: [
  AppComponent,
  HomeComponent,
  NavMenuComponent,
  FooterComponent,
  NotFoundComponent
],
imports: [
  BrowserModule,
  AppRoutingModule,
  ReactiveFormsModule,
  HttpClientModule,
  FormsModule,
  NgChartsModule
 
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

O arquivo app.module.ts é um dos arquivos mais importantes em um projeto Angular. Ele é usado para definir e configurar o módulo raiz do aplicativo Angular, que é o ponto de entrada para o aplicativo e contém todos os componentes, módulos e serviços que fazem parte do aplicativo.

O arquivo começa importando as dependências necessárias para definir o módulo raiz do aplicativo. Um exemplo disso é a importação do NgModule e BrowserModule. O NgModule é uma diretiva do Angular que define um módulo, enquanto o BrowserModule fornece recursos do navegador para o aplicativo.

Em seguida, o arquivo importa outros módulos e componentes do aplicativo, como o AppRoutingModule, AppComponent, HomeComponent, NavMenuComponent, FooterComponent e NotFoundComponent. Isso permite que o módulo raiz do aplicativo reconheça e use esses componentes e módulos em toda a aplicação.

Depois, o arquivo define o módulo raiz do aplicativo, que é uma classe decorada com o @NgModule. A classe AppModule exporta o componente raiz do aplicativo, AppComponent, e declara todos os outros componentes importados anteriormente. A declaração dos componentes no módulo é importante para que o Angular possa criar as instâncias desses componentes quando necessário.

O arquivo também importa e configura vários módulos adicionais, como FormsModule, ReactiveFormsModule, HttpClientModule e NgChartsModule, que fornecem recursos adicionais para o aplicativo, como formulários e gráficos. Esses módulos são importantes para a funcionalidade do aplicativo e geralmente são adicionados como dependências de outros módulos e componentes.

Por fim, o arquivo define o provedor raiz do aplicativo e o componente raiz do aplicativo, que é carregado quando o aplicativo é iniciado. O provedor raiz do aplicativo é responsável por fornecer serviços para toda a aplicação. O componente raiz do aplicativo é o primeiro componente que é carregado quando o aplicativo é iniciado e é responsável por renderizar o conteúdo principal do aplicativo.

Em resumo, o arquivo app.module.ts é um arquivo de configuração do módulo raiz do aplicativo Angular e define os componentes, módulos e serviços necessários para o aplicativo. Ele é usado pelo Angular para inicializar o aplicativo e carregar os componentes necessários. É importante entender a estrutura e a função desse arquivo para desenvolver aplicativos Angular eficazes e escaláveis.

Além disso, existem algumas boas práticas a serem seguidas ao trabalhar com o arquivo app.module.ts. Uma delas é manter o arquivo organizado e limpo, dividindo as importações em seções lógicas e comentando o código quando necessário. Outra prática recomendada é evitar importações desnecessárias e manter o tamanho do arquivo sob controle, dividindo o código em módulos menores quando necessário.

Em geral, o arquivo app.module.ts é um componente crítico de um projeto Angular e deve ser tratado com cuidado e atenção aos detalhes. Com uma compreensão sólida desse arquivo, os desenvolvedores podem criar aplicativos Angular escaláveis e fáceis de manter.

Nosso arquivo: app-routing.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { NotFoundComponent } from './pages/not-found/not-found.component';

const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'home', redirectTo: '/', pathMatch: 'full' },
{ 
  path: 'analytics', 
    loadChildren: ()=> 
      import('./modules/dashboard/dashboard.module')
        .then(m=>m.DashboardModule)
},
{ path: '', loadChildren: ()=> import('./modules/artigos/artigos.module').then(m=>m.ArtigosModule)},
{ path: 'tablinks', loadChildren: ()=> import('./modules/tablinks/tablinks.module').then(m=>m.TablinksModule)},
{ path: '**', component: NotFoundComponent }
];

@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }

O arquivo app-routing.module.ts é um dos arquivos mais importantes em um projeto Angular. Ele é usado para definir as rotas do aplicativo, ou seja, as URLs que os usuários podem acessar para visualizar diferentes páginas e componentes do aplicativo.

O arquivo começa importando as dependências necessárias para definir as rotas do aplicativo. Um exemplo disso é a importação do NgModule e RouterModule. O NgModule é uma diretiva do Angular que define um módulo, enquanto o RouterModule fornece recursos de roteamento para o aplicativo.

Em seguida, o arquivo define as rotas do aplicativo usando a constante routes que é um array de objetos que mapeiam as URLs para os componentes correspondentes. Por exemplo, a rota { path: '', component: HomeComponent } mapeia a URL raiz do aplicativo para o componente HomeComponent.

Além disso, o arquivo define rotas adicionais para outros componentes e módulos, como o DashboardModule, ArtigosModule e TablinksModule. Essas rotas são importantes para a funcionalidade do aplicativo e geralmente são adicionadas como dependências de outros módulos e componentes.

Outra importante configuração do arquivo é a rota padrão para quando uma URL não corresponde a nenhuma rota definida. Isso é feito usando a rota { path: '**', component: NotFoundComponent }, que mapeia todas as outras URLs para o componente NotFoundComponent.

Por fim, o arquivo define o módulo de roteamento do aplicativo, que é uma classe decorada com o @NgModule. A classe AppRoutingModule importa o RouterModule, define as rotas do aplicativo e exporta o módulo de roteamento para ser usado no módulo raiz do aplicativo.

Em resumo, o arquivo app-routing.module.ts é um arquivo de configuração de rotas do aplicativo Angular e define as rotas para os componentes e módulos necessários para o aplicativo. Ele é usado pelo Angular para navegar entre as diferentes páginas e componentes do aplicativo. É importante entender a estrutura e a função desse arquivo para desenvolver aplicativos Angular eficazes e escaláveis.

Além disso, existem algumas boas práticas a serem seguidas ao trabalhar com o arquivo app-routing.module.ts. Uma delas é manter o arquivo organizado e limpo, dividindo as rotas em seções lógicas e comentando o código quando necessário. Outra prática recomendada é evitar rotas desnecessárias e manter o tamanho do arquivo sob controle, dividindo as rotas em módulos menores quando necessário.

Em geral, o arquivo app-routing.module.ts é um componente crítico de um projeto Angular e deve ser tratado com cuidado e atenção aos detalhes. Com uma compreensão sólida desse arquivo, os desenvolvedores podem criar aplicativos Angular escaláveis e fáceis de manter.

Por fim, os arquivos ‘.ts’ e ‘.html’ do componente AppComponent:

import { Component } from '@angular/core';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
}
<app-nav-menu></app-nav-menu>

<div class="container">
<div class="content">
  <div class="row">
    <div class="cas-min-lenght-content">
      <router-outlet></router-outlet>
    </div>
  </div>
  <app-footer></app-footer>
</div>
</div>

O componente AppComponent é um dos componentes mais importantes em um projeto Angular. Ele é o componente raiz do aplicativo e é responsável por renderizar o conteúdo principal do aplicativo.

O arquivo app.component.ts exporta a classe AppComponent, que é decorada com o @Component. A classe AppComponent define o comportamento do componente, incluindo suas propriedades, métodos e eventos. No caso deste componente, ele não possui nenhuma propriedade, método ou evento específico.

No entanto, a decoração do @Component define o seletor do componente, que é usado para identificar o componente no HTML. Neste caso, o seletor é app-root, que é usado no arquivo index.html para iniciar o componente principal da aplicação.

O arquivo app.component.html é o template HTML que define a aparência do componente. Ele contém uma tag <app-nav-menu></app-nav-menu>, que renderiza o componente NavMenuComponent, que é o menu de navegação da aplicação. Além disso, ele contém uma tag <router-outlet></router-outlet>, que é uma diretiva do Angular que é usada para renderizar o conteúdo da página com base na rota atual. Isso significa que o conteúdo renderizado dentro do <router-outlet> pode ser diferente dependendo da rota atual. Por fim, o template também inclui o componente FooterComponent, que é o rodapé da aplicação.

Em resumo, o componente AppComponent é o componente raiz de um projeto Angular e é responsável por renderizar o conteúdo principal do aplicativo. O arquivo app.component.ts define a classe AppComponent e o arquivo app.component.html define o template HTML para o componente. O código desses arquivos é crítico para o funcionamento da aplicação e deve ser tratado com cuidado e atenção aos detalhes.

Property Binding, Event Binding e Two-Way Data Binding

Introdução

O Angular é um framework poderoso que permite criar aplicações web dinâmicas e interativas. Uma das principais características do Angular é a capacidade de vincular dados e eventos entre o componente e o template de forma fácil e eficiente. Existem três tipos de vinculação no Angular: Property Binding, Event Binding e Two-Way Data Binding.

Property Binding

Property Binding é uma forma de vincular propriedades de um componente com os valores do template. Isso permite que os dados fluam do componente para o template. O Property Binding é uma técnica muito útil, pois permite que você atualize dinamicamente o conteúdo do template com base em dados do componente.

Por exemplo, suponha que você tenha uma variável logoUrl no componente que contém a URL do logotipo do seu site. Você pode usar o Property Binding para vincular a propriedade src de uma tag img com a variável logoUrl. Isso significa que sempre que a variável logoUrl for atualizada no componente, a propriedade src da tag img também será atualizada no template.

A sintaxe do Property Binding é bem simples, basta usar colchetes [] para indicar que uma propriedade está sendo vinculada. Por exemplo:

<img [src]="logoUrl">

Event Binding

Event Binding é uma forma de vincular eventos do template com métodos do componente. Isso permite que os eventos fluam do template para o componente. O Event Binding é uma técnica muito útil, pois permite que você responda a eventos do usuário no template e execute ações apropriadas no componente.

Por exemplo, suponha que você tenha um botão no template que permite ao usuário enviar um formulário. Você pode usar o Event Binding para vincular o evento click do botão com um método onSubmit() no componente. Isso significa que sempre que o botão for clicado no template, o método onSubmit() será chamado no componente.

A sintaxe do Event Binding é bem simples, basta usar parênteses () para indicar que um evento está sendo vinculado. Por exemplo:

<button (click)="onSubmit()">Enviar</button>

Two-Way Data Binding

Two-Way Data Binding é uma forma de vincular propriedades do componente com valores do template e vice-versa. Isso permite que os dados fluam em ambas as direções. O Two-Way Data Binding é uma técnica muito útil, pois permite que você atualize dinamicamente o conteúdo do template com base em dados do componente e vice-versa.

Por exemplo, suponha que você tenha um input no template que permite ao usuário digitar seu nome. Você pode usar o Two-Way Data Binding para vincular a propriedade value do input com uma variável name no componente. Isso significa que sempre que o usuário digitar seu nome no input, a variável name do componente será atualizada automaticamente com o valor digitado, e sempre que a variável name for atualizada no componente, o valor do input também será atualizado automaticamente.

A sintaxe do Two-Way Data Binding é um pouco mais complexa, mas ainda assim é fácil de usar. Basta usar a sintaxe [(ngModel)] para indicar que uma propriedade está sendo vinculada bidirecionalmente. Por exemplo:

<input [(ngModel)]="name">

Exemplos de Código

Aqui estão alguns exemplos de código para ajudar você a entender melhor como usar o Property Binding, Event Binding e Two-Way Data Binding no Angular:

Property Binding

<img [src]="logoUrl">

<h1 [innerHTML]="pageTitle"></h1>

Event Binding

<button (click)="onSubmit()">Enviar</button>

<input (input)="onInput($event)">

Two-Way Data Binding

<input [(ngModel)]="name">

<textarea [(ngModel)]="description"></textarea>

Conclusão

O Property Binding, Event Binding e Two-Way Data Binding são recursos poderosos do Angular que permitem que você crie aplicações web dinâmicas e interativas. Com essas técnicas de vinculação de dados e eventos, você pode criar interfaces de usuário ricas e responsivas que respondem rapidamente aos inputs do usuário. Esperamos que esses exemplos de código ajudem você a entender melhor como usar o Property Binding, Event Binding e Two-Way Data Binding no seu próximo projeto Angular.

Serviços e Injeção de Dependência:

Vamos ver um exemplo hipotético:

Em Angular, os serviços são uma ótima maneira de compartilhar dados e funções entre diferentes componentes de uma aplicação. Os serviços são classes que possuem um objetivo específico e fornecem funcionalidades que podem ser reutilizadas em todo o aplicativo. A Injeção de Dependência (Dependency Injection - DI) é um padrão de projeto que o Angular utiliza para fornecer instâncias de serviços aos componentes que os requisitam.

A injeção de dependência permite que você escreva um código mais limpo, modular e testável, pois as dependências de um componente são explicitamente declaradas e gerenciadas pelo framework.

Para criar um serviço no Angular, você pode usar o comando Angular CLI:

ng generate service nome-do-servico

Isso criará um arquivo de serviço (nome-do-servico.service.ts) com uma classe já configurada para ser um serviço Angular.

Vamos supor que você deseja criar um serviço para gerenciar as operações de CRUD em um blog. Primeiro, crie o serviço:

ng generate service post

Isso criará o arquivo post.service.ts. Dentro desse arquivo, você pode criar funções para realizar as operações desejadas:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Post } from './post.model';

@Injectable({
providedIn: 'root'
})
export class PostService {

private apiUrl = '<https://api.example.com/posts>';

constructor(private http: HttpClient) { }

getPosts() {
  return this.http.get<Post[]>(this.apiUrl);
}

createPost(post: Post) {
  return this.http.post<Post>(this.apiUrl, post);
}

// Outras funções de CRUD (atualizar, deletar) podem ser adicionadas aqui
}

Note que o serviço importa e injeta o HttpClient para realizar requisições HTTP. Isso é um exemplo de injeção de dependência.

Para utilizar este serviço em um componente, basta injetá-lo no construtor do componente:

import { Component, OnInit } from '@angular/core';
import { PostService } from './post.service';
import { Post } from './post.model';

@Component({
selector: 'app-post-list',
templateUrl: './post-list.component.html',
styleUrls: ['./post-list.component.css']
})
export class PostListComponent implements OnInit {

posts: Post[];

constructor(private postService: PostService) { }

ngOnInit() {
  this.postService.getPosts().subscribe(data => {
    this.posts = data;
  });
}
}

Agora, o componente PostListComponent tem acesso às funções do serviço PostService através da variável postService.

Resumindo a seção

Esta é uma introdução de features e conceitos básicos de um Projeto Angular.

  • Na próxima seção avançamos um pouco mais… Enquanto isso fiquem com uma dica, que muitos alunos já me pediram 🙂

💡Truques e Dicas:

Para evitar a geração de arquivos de testes em um projeto Angular, você pode fazer isso tanto pela linha de comando (CLI) quanto pela configuração do angular.json.

  1. Usando a CLI:

Ao gerar um componente, serviço ou diretiva, você pode incluir a flag --skip-tests na linha de comando para evitar a criação de arquivos de teste. Aqui estão alguns exemplos:

  • Para gerar um componente sem arquivo de teste:
ng generate component meu-componente - skip-tests
  • Para gerar um serviço sem arquivo de teste:
ng generate service meu-servico --skip-tests
  • Para gerar uma diretiva sem arquivo de teste:
ng generate directive minha-diretiva --skip-tests
Configurando o angular.json:

Para evitar a criação de arquivos de teste ao gerar componentes, serviços ou diretivas globalmente no projeto, você pode alterar as configurações padrão no arquivo angular.json. Para fazer isso, localize a seção “schematics” e adicione ou modifique as opções de componentes, serviços e diretivas para incluir "**skipTests": true**.

Por exemplo:

{
...
"projects": {
  "meu-projeto": {
    ...
    "schematics": {
      "@schematics/angular:component": {
        "skipTests": true
      },
      "@schematics/angular:service": {
        "skipTests": true
      },
      "@schematics/angular:directive": {
        "skipTests": true
      }
    },
    ...
  }
},
...
}

Ao aplicar essas configurações, o Angular CLI não gerará arquivos de teste quando você criar componentes, serviços ou diretivas no projeto.

Lembre-se de que evitar a geração de arquivos de teste pode não ser a melhor prática, especialmente se você deseja garantir a qualidade do código e a confiabilidade do seu projeto. Os testes são uma parte importante do desenvolvimento e ajudam a identificar erros e problemas antes que eles afetem os usuários finais.

📚 Espero que gostem, pois foi feito com amor, para vocês! :) <3

Compartilhe
Comentários (2)
Carlos Santos
Carlos Santos - 08/05/2023 01:48

Olá, Marcos!

Eu, particularmente, acho que atualizações de "Major" deveriam ser anuais. E durante o ano, que fizesses as correções de bugs ou algumas atualizações que fossem relevantes. Essa correria desenfreada por atualizações de versões semestrais me incomoda também.


E estou falando isso menos pelas atualizações, que as demandas às vezes nos pedem, que pela pressão sobre a equipe, que tem de trabalhar em cima de um cronograma de atualizações, na minha visão, insano.


De todo modo, você não precisa atualizar seus projetos a cada atualização que o Google faz. Você pode fazer isso no seu tempo, pois a partir da versão 11 nenhuma atualização radical foi feita. É óbvio que as atualizações de "Major" tendem a causar `Breaking changes`, mas fique tranquilo, pois com o tempo você se acostuma!


PS.: Use o NVM (Node Version Manager) e trabalhe mais tempo com os seus projetos, sem a necessidade extrema de atualizar todo semestre.


Grande abraço,

Carlos A Santos

Marcos Sampaio
Marcos Sampaio - 06/05/2023 12:45

Tenho uma duvida, esse exagero de atualizações não torna dificil o aprendizado de quem está iniciando? estou fazendo o bootcamp e tambem irei fazer o developer e me pergunto em que versão irei aprender e como irei migrar para as novas e diferenciar.