Como desabilitar o cache no Angular
Tags: angular, typescript, tutorial
Published: 2021-10-09 19:01:12

Um dos grandes problemas que enfrentei ao atualizar o frontend de aplicações angular foi o cache. 

Praticamente todos os navegadores mantêm um cache da aplicação no computador do cliente para conseguir carregar a aplicação de forma mais rápida e com menor consumo de dados e isso é excelente. Entretanto, um efeito colateral é que as atualizações podem demorar para serem entregues para o cliente. Como consequência, o cliente pode ficar horas ou dias com uma versão com um bug que já foi corrigido.

Em sistemas internos de empresas, isso pode resultar em ligações ou tickets constantes para a equipe de suporte técnico, causando uma sobrecarga na equipe. Quando estamos falando de aplicações fornecidas para clientes externos à empresa, pode ser um ponto de frustração e insatisfação com o produto.

Nesse contexto, pode ser interessante desabilitar o cache das aplicações Angular. Veremos a seguir como fazer isso.

## Index.html

A primeira opção para evitar o cache dos navegadores é simplesmente indicar ao navegador como ele deve se comportar. Para fazer isso devemos incluir 3 tags `meta` no arquivo index.html do projeto.

``` html
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0">
<meta http-equiv="expires" content="0">
<meta http-equiv="pragma" content="no-cache">
```

Com isso, estamos dizendo ao navegador como ele deve tratar o cache, basicamente, dizemos para ele não fazer cache.

## Angular Interceptor

Uma segunda opção é incluir no cabeçalho das requisições http a instrução para o navegador não fazer cache.

Se você não sabe como criar um interceptor no angular, veja o artigo a seguir:

{% medium https://medium.com/matheus-bizutti/introdu%C3%A7%C3%A3o-ao-angular-httpinterceptor-1b06a95a0089 %}

Agora que você já sabe como criar o interceptor, vamos incluir nosso código no interceptor.

``` ts
import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class NoCache.InterceptorInterceptor implements HttpInterceptor {

  constructor() {}

  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    // inclua o código da linha abaixo logo no início do método intercept
    request = request.clone({
      setHeaders: {
        "Cache-Control": "no-cache",
        Pragma: "no-cache",
      },
    });

    return next.handle(request);
  }
}
```

## --output-hashing=all

Uma outra forma de forçar a remoção do cache é compilar a aplicação usando o parâmetro `--output-hashing=all`. Assim ao fazer o build com esse parâmetro os arquivos que foram alterados receberão nomes diferentes, quebrando de forma proposital o mecanismo de cache dos navegadores.

`ng build --output-hashing=all` ou `npm run ng build --output-hashing=all`

## Conclusão

Como podemos ver, as três opções são simples de implementar. Quando estamos falando de aplicações empresariais para uso interno, dentro da rede da empresa, não vejo motivos para não usar esse recurso, entretanto, se sua aplicação é utilizada por clientes que a consomem pela internet, use esse recurso com sabedoria, lembre-se que seu cliente pode estar acessando seu produto pelo smartphone com um plano limitado de dados e isso também pode ser um ponto de insatisfação em relação ao seu produto.