Ich habe diesen Artikel geschrieben, um das Missverständnis über Speicherlecks in React aufzuklären. Es gibt viele Artikel darüber, wie man Speicherlecks in React vermeidet, aber viele von ihnen verwenden ein Beispiel, das keine Speicherlecks verursacht.
Schauen wir uns das oft verwendete Beispiel an:
import { useState, useEffect } from "react";
export const UserList = () => {
const [users, setUsers] = useState(null);
useEffect(() => {
const getUsers = async () => {
const usersResponse = await fetch("https://dummy-api.com/api/v1/users");
setUsers(await usersResponse.json());
};
getUsers();
}, []);
return (
<>
...my-jsx...
</>
);
};
Stimmt es, dass dieser Fall Speicherlecks verursacht, wie uns die Nachricht sagt? Um es zu verstehen, benötigen wir ein grundlegendes Verständnis der Speicherverwaltung.
Jede Programmiersprache muss mit Speicher umgehen können. Bei Low-Level-Sprachen muss der Programmierer den Speicher manuell verwalten. In Hochsprachen wie JavaScript wird dies automatisch gehandhabt.
Das Konzept der Speicherverwaltung besteht aus drei Lebenszyklen, die unabhängig von der Sprache nahezu gleich sind.
Die Freigabe des allokierten Speichers bedeutet das Entfernen von Daten innerhalb des Speichers, die nicht mehr benötigt werden. Die Freigabe des zugewiesenen Speichers in JavaScript wird durch einen Garbage Collector (GC) erreicht, und daher müssen Entwickler die Freigabe des Speichers nicht manuell handhaben.
Das Freigeben von zugewiesenem Speicher durch Referenz ist das Hauptkonzept von Garbage Collectors. Beim Referenzkonzept geht es darum, ob ein Objekt von anderen Objekten referenziert wird oder nicht. Wenn das Objekt keine anderen Objekte hat, die darauf verweisen/zeigen, ist es für den GC sammelbar, den zugewiesenen Speicher freizugeben.
Jetzt wissen wir mehr über die Speicherverwaltung und können besser verstehen, warum es in dem Codebeispiel, das wir oben im Artikel gesehen haben, kein echtes Speicherleck gibt.
Was passiert also, wenn setState für eine nicht gemountete Komponente aufgerufen wird? Da der API-Aufruf ein Versprechen ist, das einmal aufgelöst wird, gibt es keine fortlaufenden Verweise mehr auf das Zustandsobjekt, nachdem es gesetzt wurde.
Wir haben gelernt, dass Objekte, auf die keine anderen Objekte verweisen, für die GC gesammelt werden können. Da der Zustand unseres Benutzers kein anderes Objekt hat, das darauf verweist, wird er gesammelt und aus dem zugewiesenen Speicher freigegeben. Daher ist die Nachricht, die wir über Speicherlecks gesehen haben, in diesem speziellen Szenario nicht wahr.
Wenn unsere Komponente eine WebSocket-Verbindung anstelle einer Promise-HTTP-Anforderung abonniert, würde es zu einem Speicherleck kommen. Es würde ein Speicherleck entstehen, da die abonnierte WebSocket-Verbindung weiterhin auf Ereignisse lauscht. Daher würde es ein anderes Objekt geben, das auf den Zustand verweist. Wie wir erfahren haben, können Objekte, die von einem anderen Objekt referenziert werden, nicht vom GC erfasst werden.
Die Nachricht von React war ein Fehlalarm und hat Entwickler verwirrt, weil sie glaubten, sie hätten Speicherlecks bekommen, indem sie regelmäßige HTTP-Anfragen an das Backend stellten, wenn die Komponente ausgehängt wurde, bevor die HTTP-Anfrage geantwortet hatte.
React hat einen Pull Request gemergt, um die Fehlermeldung über Speicherlecks zu entfernen. Bitte schauen Sie sich den Pull-Request auf Github an,https://github.com/facebook/react/pull/22114für mehr Details.
Danke fürs Lesen!
(Warnung – das ist Satire, die fröhlich subversiv sein soll – definitiv nichts für Kinder) Sie haben gesehen, wie Ihre Eltern sich in der Küche versteckten und diese stinkenden Zigaretten rauchten. Sie sagen es dir.
Hallo, Cyber-Enthusiasten! Willkommen zurück bei der OSINT-Serie zur Bedrohungsjagd. Im ersten Artikel habe ich Ihnen einen Überblick über OSINT und seine Bedeutung bei der Bedrohungsjagd gegeben.
Es fällt uns oft schwer, das umzusetzen, von dem wir wissen, dass es gut für uns ist. Von der Aussage, dass wir einen Lebensgefährten lieben, bis hin zur Erinnerung daran, wie ein Pirat zu reden – es wird immer diejenigen geben, die behaupten, dass ein Tag, eine Woche oder ein Monat voller Ereignisse nicht nötig sei, weil sie diese Dinge bereits tun.
„Er wird mich beschützen, wenn ich in Gefahr bin. Er wird mich in seinem Zelt verstecken.
Von Alyson Lee, geschäftsführende Beraterin für Regierungsangelegenheiten Der jährliche Bewilligungsprozess der Bundesregierung ist von zentraler Bedeutung für unsere Bemühungen zur Finanzierung der Kohlendioxidentfernung (CDR). Jedes Jahr reicht Carbon180 Anfragen an verschiedene Kongressbüros ein, um zu bestimmen, wohin die Dollars im nächsten Jahr fließen werden.
Letzte Woche fiel mir eine Pressemitteilung auf, die über PressGazette (eine britische Nachrichten-Website für Medien) verschickt wurde. In dem Artikel wurde angekündigt, dass Acast, das skandinavische Podcast-Hosting- und Werbeunternehmen, ein Konsortium der „wahrscheinlich einflussreichsten“ Verlage im Podcasting leiten werde.