Domanda

sviluppare un'applicazione in un ambiente integrato. Si tratta di un ambiente di calcolo di alto livello con un browser web completo in cima ad un sistema Linux busybox. L'unica eccezione è che il sistema ha un numero limitato di memoria di sistema.

La nostra applicazione è costruita in JavaScript e corre all'interno di un browser web basato su Webkit ed è costituito da un sacco di moduli JavaScript che vengono caricati in sequenza (che non è molto efficiente).

Alcuni moduli forniscono funzionalità comune che viene utilizzato da più moduli. Siamo nel processo di conversione nostro caricatore javascript corrente con requirejs, ma c'è una necessità specifica dobbiamo affrontare prima.

E 'possibile scaricare un modulo quando è stato caricato utilizzando requirejs? Assumiamo di carica dinamicamente un modulo utilizzando:

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

che funziona bene per il carico e che eseguono 'QualcheModulo' e anche risolvere tutte le dipendenze per 'QualcheModulo' e il quadro requirejs memorizza un riferimento a 'QualcheModulo' per le richieste future.

Se a un certo punto necessità di memoria di recupero, per esempio per essere in grado di caricare ed eseguire un numero infinito di moduli, dobbiamo iniziare a rimuovere alcuni di loro dopo un certo tempo. È quello possibile con requirejs senza alterare l'implementazione interna?

Qualcuno ha affrontato questo tipo di problema prima? La maggior parte singola pagina JS applicazioni viene eseguito in un browser web su un PC desktop in cui l'utilizzo della memoria di solito non è una preoccupazione importante.

È stato utile?

Soluzione

RequireJS non dispone di una funzione integrata scarico, ma potrebbe essere aggiunto, forse come parte aggiuntiva si potrebbe costruire in esso. Se si desidera avere questa caratteristica, non esitate a proporlo in mailing list o come GitHub problema .

Se si voleva sperimentare per vedere se aiuta la vostra situazione, quello che dovete fare è la seguente:

1) Rimuovere il modulo definito dalla cache modulo RequireJS. Se non si utilizza il supporto multiversione, si può fare qualcosa di simile:

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

2) Poi si può provare a rimuovere il tag script per vedere se questo aiuta:

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

Si noti che il modulo non può essere garbage collection se un altro modulo aggrappa ad esso tramite la funzione di chiusura () {} che definisce detto altro modulo. Che altro modulo dovrebbe essere rimosso anche.

Si può cercare di limitare tale impatto da non passare nel modulo come argomento di funzione, ma solo l'uso richiedono ( "QualcheModulo") all'interno della definizione della funzione ogni volta che si desidera ottenere una sospensione di moduli dipendenti, e non aggrappandosi a che richiedono il valore di ritorno per troppo tempo.

Inoltre, nel tuo esempio sopra, per i moduli che l'uso require.def di definire se stessi, dovrebbe assomigliare a questo (senza il suffisso .js):

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

Altri suggerimenti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top