Frage

Wir eine Anwendung in einer eingebetteten Umgebung entwickeln. Es ist eine hohe Computing-Umgebung mit einem kompletten Web-Browser auf einem Busybox Linux-System. Die einzige Ausnahme ist, dass das System nur eine begrenzte Menge an Systemspeicher hat.

Unsere Anwendung ist in JavaScript gebaut und läuft in einem Webkit basierten Web-Browser und besteht aus einer Menge von JavaScript-Module, die in der Reihenfolge geladen werden (was nicht sehr effizient ist).

Einige Module bieten gemeinsame Funktionalität, die von mehreren Modulen verwendet wird. Wir sind dabei, mit requirejs unserem aktuellen Javascript loader umzuwandeln, aber es gibt einen besonderen Bedarf wir zuerst Adresse haben.

Ist es möglich, ein Modul zu entladen, wenn es mit requirejs geladen wurde? Nehmen wir an, wir dynamisch ein Modul lädt mit:

require(["somemodule.js"], function(m) { m.run(); } );

Das funktioniert gut für das Laden und Ausführen ‚Some‘ und die Lösung auch alle Abhängigkeiten für ‚Some‘ und den requirejs Rahmen speichert einen Verweis auf ‚Some‘ für zukünftige Anforderungen.

Wenn wir an einem gewissen Punkt muß zurückzufordern Speicher, beispiel der Lage sein, eine unendliche Anzahl von Modulen zu laden und auszuführen, müssen wir beginnen, einige von ihnen nach einiger Zeit zu entfernen. Ist das möglich mit requirejs, ohne die interne Implementierung zu ändern?

hat mit dieser Art von Problem, bevor jemand behandelt? Die meist einzelne Seite JS apps läuft in einem Web-Browser auf einem Desktop-PC, auf dem die Speichernutzung in der Regel kein großes Problem ist.

War es hilfreich?

Lösung

RequireJS hat keine eingebaute in Entlade-Funktion, aber es könnte vielleicht als zusätzliches Teil hinzugefügt werden Sie in sie bauen könnten. Wenn Sie diese Funktion haben möchten, können Sie es vorschlagen, in der Mailingliste oder als GitHub Ausgabe .

Wenn Sie wollte zu sehen, experimentieren, wenn es Ihre Situation hilft, was Sie tun müssen, ist die folgende:

1) Entfernen Sie die definierten Modul aus dem RequireJS Modul Cache. Wenn Sie die multiversion Unterstützung nicht verwenden, können Sie so etwas wie tun:

var context = require.s.contexts['_'];
delete context.defined[moduleName];
delete context.specified[moduleName];
delete context.loaded[moduleName];

2) Dann können Sie versuchen, den Script-Tag zu entfernen, um zu sehen, ob das hilft:

var scripts = document.getElementsByTagName('script');
for (var i = scripts.length - 1; i >= 0; i--) {
    var script = scripts[i];
    if (script.getAttribute('data-requiremodule') === moduleName) {
        script.parentNode.removeChild(script);
        break;
    }
}

Hinweis, daß das Modul nicht Müll gesammelt werden, wenn ein anderes Modul auf, um es über die Verschlussfunktion hält () {}, die definiert, dass andere Modul. Das andere Modul müßte auch entfernt werden.

Sie können versuchen, die Auswirkungen zu begrenzen, indem nicht als Funktionsargument in dem Modul vorbei, aber nur erfordern die Verwendung ( „Some“) innerhalb der Definition der Funktion, wenn Sie einen Einfluß von abhängigen Module erhalten möchten, und halten nicht an das erfordert Rückgabewert für zu lang.

Auch im obigen Beispiel für Module, die Verwendung require.def selbst zu definieren, es sollte wie folgt aussehen (ohne Js Suffix):

require(["somemodule"], function(m) { m.run(); } );

Andere Tipps

Versuchen Sie folgendes: require.undef (Modulname)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top