J'ai trouvé que l'utilisation de AngularFireAuthModule
from '@angular/fire/auth';
provoque une fuite de mémoire qui bloque le navigateur après 20 heures.
Version:
J'utilise la dernière version mise à jour aujourd'hui en utilisant ncu -u pour tous les packages.
Feu angulaire: "@angular/fire": "^5.2.3",
Version Firebase: "firebase": "^7.5.0"
,
Comment reproduire:
J'ai fait un code reproductible minimum sur l' éditeur StackBliztz
Voici le lien pour tester directement le bug StackBlizt test
Symptôme:
Vous pouvez vous vérifier que le code ne fait rien. Il imprime juste bonjour le monde. Cependant, la mémoire JavaScript utilisée par l'application angulaire augmente de 11 kb / s (Chrome Task Manager CRTL + ESC). Après 10 heures en laissant le navigateur ouvert, la mémoire utilisée atteint environ 800 Mo (l'empreinte mémoire est d'environ deux fois 1,6 Go !)
Par conséquent, le navigateur manque de mémoire et l'onglet Chrome se bloque.
Après une enquête plus approfondie en utilisant le profilage de la mémoire de chrome sous l'onglet performances, j'ai clairement remarqué que le nombre d'auditeurs augmente de 2 chaque seconde et donc le tas JS augmente en conséquence.
Code qui provoque la fuite de mémoire:
J'ai trouvé que l'utilisation du AngularFireAuthModule
module provoque la fuite de mémoire, qu'il soit injecté dans un component
constructeur ou dans un service
.
import { Component } from '@angular/core';
import {AngularFireAuth} from '@angular/fire/auth';
import {AngularFirestore} from '@angular/fire/firestore';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'memoryleak';
constructor(public auth: AngularFireAuth){
}
}
Question :
Cela pourrait être un bogue dans l'implémentation de FirebaseAuth et j'ouvre déjà un problème Github, mais je cherche une solution de contournement pour ce problème. Je cherche désespérément une solution. Cela ne me dérange pas même si les sessions entre les onglets ne sont pas synchronisées. Je n'ai pas besoin de cette fonctionnalité. J'ai lu quelque part
si vous n'avez pas besoin de cette fonctionnalité, les efforts de modularisation de Firebase V6 vous permettront de passer à localStorage qui a des événements de stockage pour détecter les changements de tableaux croisés, et vous donnera peut-être la possibilité de définir votre propre interface de stockage.
Si c'est la seule solution, comment l'implémenter?
J'ai juste besoin d'une solution qui arrête cette augmentation inutile de l'auditeur car elle ralentit l'ordinateur et plante mon application. Mon application doit fonctionner pendant plus de 20 heures, elle est donc désormais inutilisable en raison de ce problème. Je cherche désespérément une solution.