¿Es posible utilizar RequireJS cuando los módulos pueden tener que ser eliminado para conservar la memoria

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

Pregunta

desarrollar una aplicación en un entorno integrado. Es un entorno de computación de alto nivel con un navegador web completa en la parte superior de un sistema Linux busybox. La única excepción es que el sistema tiene una cantidad limitada de memoria del sistema.

Nuestra aplicación está construida en JavaScript y se ejecuta dentro de un navegador web basado en WebKit y consta de una gran cantidad de módulos de JavaScript que se cargan en la secuencia (que no es muy eficiente).

Algunos módulos proporcionan funcionalidad común que es utilizado por varios módulos. Estamos en el proceso de convertir nuestro cargador Javascript actual con RequireJS, pero hay una necesidad específica que debemos abordar en primer lugar.

¿Es posible descargar un módulo cuando se ha cargado mediante RequireJS? Supongamos que de forma dinámica las cargas de un módulo usando:

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

que funciona bien para cargar y ejecutar 'somemodule' y resolver todas las dependencias para 'somemodule' y el marco RequireJS almacenará una referencia a 'somemodule' para futuras solicitudes.

Si en algún momento necesidad de memoria de recuperación, por ejemplo que seamos capaces de cargar y ejecutar un número infinito de módulos, tenemos que empezar a eliminar algunos de ellos después de algún tiempo. Es que es posible con RequireJS sin alterar la implementación interna?

¿Alguien ha tratado este tipo de problema antes? La mayoría sola página JS aplicaciones se ejecuta en un navegador web en un PC de escritorio, donde el uso de memoria por lo general no es una preocupación importante.

¿Fue útil?

Solución

RequireJS no tiene una característica integrada de descarga, pero se podría añadir tal vez como una parte adicional se podría construir en él. Si le gustaría tener esa característica, no dude en proponerla en la lista de correo o como GitHub tema .

Si quieres experimentar para ver si ayuda a su situación, lo que tiene que hacer es la siguiente:

1) Retire el módulo definido desde la caché del módulo RequireJS. Si no está utilizando el soporte multiversión, se puede hacer algo como:

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

2) A continuación, puede intentar quitar la etiqueta script para ver si eso ayuda:

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

Tenga en cuenta que el módulo no puede ser recolectado si otro módulo se aferra a ella a través de la función de cierre () {} que define ese otro módulo. tendría que ser eliminado también que otro módulo.

Se puede tratar de limitar ese impacto al no pasar en el módulo como un argumento de función, pero sólo uso require ( "somemodule") dentro de la definición de la función cada vez que desee obtener una bodega de módulos dependientes, y no aferrarse a que requieren valor de retorno durante demasiado tiempo.

Además, en el ejemplo anterior, para los módulos que el uso require.def a definirse a sí mismos, se debe tener este aspecto (sin el sufijo .js):

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

Otros consejos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top