javascript - compile - ¿Es posible utilizar requirejs cuando es necesario quitar los módulos para conservar la memoria?
requirejs wikipedia (2)
Prueba esto: require.undef(moduleName)
Desarrollamos una aplicación en un entorno embebido. Es un entorno informático de alto nivel con un navegador web completo sobre un sistema Linux de busybox. La única excepción es que el sistema tiene una cantidad limitada de memoria del sistema.
Nuestra aplicación está incorporada en JavaScript y se ejecuta dentro de un navegador web basado en Webkit y consta de una gran cantidad de módulos javascript que se cargan en secuencia (lo cual no es muy eficiente).
Algunos módulos proporcionan una funcionalidad común que es utilizada por varios módulos. Estamos en el proceso de convertir nuestro cargador de javascript actual con requirejs, pero hay una necesidad específica que debemos abordar primero.
¿Es posible descargar un módulo cuando se ha cargado utilizando requirejs? Supongamos que cargamos dinámicamente un módulo usando:
require(["somemodule.js"], function(m) { m.run(); } );
Eso funciona bien para cargar y ejecutar ''somemodule'' y también para resolver todas las dependencias para ''somemodule'' y el marco de trabajo de requirejs almacenará una referencia a ''somemodule'' para futuras solicitudes.
Si en algún momento necesitamos recuperar memoria, por ejemplo, para poder cargar y ejecutar un número infinito de módulos, debemos comenzar a eliminar algunos de ellos después de algún tiempo. ¿Es eso posible con requirejs sin alterar la implementación interna?
¿Alguien ha tratado este tipo de problema antes? La mayoría de las aplicaciones JS de una sola página se ejecutan en un navegador web en una PC de escritorio donde el uso de memoria generalmente no es una preocupación importante.
RequireJS no tiene una función de descarga incorporada, pero podría agregarse quizás como una parte adicional que podría incluir en ella. Si desea tener esa característica, siéntase libre de proponerla en la lista de correo o como un problema de GitHub .
Si desea experimentar para ver si ayuda a su situación, lo que debe hacer es lo siguiente:
1) Eliminar el módulo definido de la memoria caché del módulo RequireJS. Si no está utilizando el soporte multiversion, puede hacer algo como:
var context = require.s.contexts[''_''];
delete context.defined[moduleName];
delete context.specified[moduleName];
delete context.loaded[moduleName];
2) Luego puedes intentar eliminar la etiqueta de 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 como basura si otro módulo lo mantiene a través de la función de cierre () {} que define ese otro módulo. Ese otro módulo tendría que ser eliminado también.
Puede intentar limitar ese impacto al no pasar el módulo como un argumento de función, pero solo use require ("somemodule") dentro de la definición de la función cuando quiera obtener una retención de los módulos dependientes, y no retener eso requiere retorno valor por demasiado tiempo.
Además, en el ejemplo anterior, para los módulos que requieren require.def para definirse a sí mismos, debería tener este aspecto (sin el sufijo .js):
require(["somemodule"], function(m) { m.run(); } );