Est-il possible d'utiliser requirejs lorsque les modules peuvent être retirés à la mémoire Conserve

StackOverflow https://stackoverflow.com/questions/3164049

Question

Nous développons une application dans un environnement embarqué. Il est un environnement informatique de haut niveau avec un navigateur Web complet sur le dessus d'un système Linux busybox. La seule exception est que le système dispose d'une quantité limitée de mémoire système.

Notre application est construite en JavaScript et fonctionne dans un navigateur Web basé sur Webkit et se compose d'un grand nombre de modules javascript qui sont chargés dans l'ordre (ce qui est très efficace).

Certains modules offrent des fonctionnalités communes qui est utilisée par plusieurs modules. Nous sommes en train de convertir notre chargeur actuel javascript avec requirejs, mais il y a un besoin spécifique, nous devons d'abord l'adresse.

Est-il possible de décharger un module quand il a été chargé à l'aide requirejs? Supposons que nous charge dynamiquement un module en utilisant:

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

qui fonctionne bien pour le chargement et en cours d'exécution « UnModule » et aussi toutes les dépendances résoudre pour « UnModule » et le cadre de requirejs stockera une référence à « UnModule » pour les demandes futures.

Si nous à un moment donné besoin de mémoire régénèrent, par exemple d'être en mesure de charger et d'exécuter un nombre infini de modules, nous devons commencer à enlever certains d'entre eux après un certain temps. Est-ce possible avec requirejs sans altérer la mise en œuvre interne?

Quelqu'un at-il traité ce genre de problème avant? La plupart seule page JS applications fonctionne dans un navigateur Web sur un ordinateur de bureau où l'utilisation de la mémoire est généralement pas une préoccupation majeure.

Était-ce utile?

La solution

RequireJS ne dispose pas d'une fonction intégrée de déchargement, mais il pourrait ajouter peut-être une partie supplémentaire que vous pourriez construire en elle. Si vous souhaitez avoir cette fonctionnalité, vous pouvez le proposer dans la liste de diffusion ou en GitHub question .

Si vous voulez expérimenter pour voir si elle aide votre situation, ce que vous devez faire est le suivant:

1) Enlever le module défini à partir de la mémoire cache du module RequireJS. Si vous n'utilisez pas le support multiversion, vous pouvez faire quelque chose comme:

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

2) Ensuite, vous pouvez essayer de supprimer la balise de script pour voir si cela aide:

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;
    }
}

Notez que le module ne peut pas être si un autre ramasse-miettes module peut contenir à elle via la fonction de fermeture () {} qui définit cet autre module. Ce autre module devrait être supprimé aussi.

Vous pouvez essayer de limiter cet impact en ne passant pas dans le module comme argument de la fonction, mais juste utiliser require ( « UnModule ») dans la définition de fonction chaque fois que vous voulez obtenir une prise de modules dépendants, et non tenue à qui exigent la valeur de retour trop longtemps.

En outre, dans votre exemple ci-dessus, pour les modules que l'utilisation require.def de se définir, il devrait ressembler à ceci (sans le suffixe .js):

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

Autres conseils

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top