Descubrí que el uso de AngularFireAuthModule
from '@angular/fire/auth';
causa una pérdida de memoria que bloquea el navegador después de 20 horas.
Versión:
Utilizo la última versión actualizada hoy usando ncu -u para todos los paquetes.
Fuego angular: "@angular/fire": "^5.2.3",
Versión base de fuego: "firebase": "^7.5.0"
,
Cómo reproducir:
Hice un código mínimo reproducible en el editor StackBliztz
Aquí está el enlace para probar el error directamente Prueba StackBlizt
Síntoma:
Puede comprobar usted mismo que el código no hace nada. Simplemente imprime hola mundo. Sin embargo, la memoria de JavaScript utilizada por la aplicación Angular aumenta en 11 kb / s (Chrome Task Manager CRTL + ESC). Después de 10 horas dejando el navegador abierto, la memoria utilizada alcanza aproximadamente 800 mb (¡la huella de la memoria es aproximadamente el doble de 1,6 Gb !)
Como resultado, el navegador se queda sin memoria y la pestaña de Chrome se bloquea.
Después de una mayor investigación utilizando el perfil de memoria de Chrome en la pestaña de rendimiento, noté claramente que el número de oyentes aumenta en 2 por segundo y, por lo tanto, el montón JS aumenta en consecuencia.
Código que causa la pérdida de memoria:
Descubrí que el uso del AngularFireAuthModule
módulo causa la pérdida de memoria si se inyecta en un component
constructor o en 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){
}
}
Pregunta :
Podría ser un error en la implementación de FirebaseAuth y ya abro un problema de Github, pero estoy buscando una solución para este problema. Estoy desesperado por una solución. No me importa incluso si las sesiones en las pestañas no están sincronizadas. No necesito esa característica. Leí en alguna parte que
Si no necesita esta funcionalidad, los esfuerzos de modularización de Firebase V6 le permitirán cambiar a localStorage, que tiene eventos de almacenamiento para detectar cambios en las pestañas, y posiblemente le brinde la capacidad de definir su propia interfaz de almacenamiento.
Si esa es la única solución, ¿cómo implementar eso?
Solo necesito cualquier solución que detenga este aumento innecesario de oyentes porque ralentiza la computadora y bloquea mi aplicación. Mi aplicación debe funcionar durante más de 20 horas, por lo que ahora no se puede usar debido a este problema. Estoy desesperado por una solución.