Ho un plugin che estende un modulo originale.
Dovrebbe solo modificare il modulo, quando richiesto esplicitamente.Come implementare un plugin, che modifica il modulo originale solo quando richiesto?
Problema:
Non appena richiesto una volta, il modulo originale viene modificato per sempre, anche nei casi in cui il plug-in non è una dipendenza.
L'ordine non importa qui, è sufficiente richiedere il plugin una volta.
Esempio:
define("main", [], function() {
return {opt: "A"};
});
define("plugin", ["main"], function(obj) {
obj.opt = "B";
});
require(["main", "plugin"], function(obj) {
console.log(obj.opt); // should log B
});
require(["main"], function(obj) {
console.log(obj.opt); // should log A but logs B
});
Credo che la strada da percorrere è quello di dire in qualche modo bisogno di ricaricare sempre main
dalla fonte invece di utilizzare la versione memorizzata nella cache.
Non ho idea di come, però.
O forse c'è un modo ancora più elegante?
Per favore illuminami, ragazzi.
Fiddle: http://jsfiddle.net/r75e446f
UPDATE: Alcuni potrebbero trovare importante sapere che ho bisogno di questo per il mio ambiente di test di unità karma per testare un modulo con e senza il plugin.
UPDATE2: Cerca di seguito la mia soluzione.
Non appena la tua app diventa sostanziale, questo causa problemi. Ogni contesto è ** totalmente ** isolato dagli altri. Se tutti i contesti utilizzano le stesse librerie di terze parti (che deve essere il caso se si carica la stessa app in diversi contesti), allora devono caricare tutte queste librerie. Se usano jQuery, caricheranno jQuery più volte. jQuery può o non può rilevare che è già caricato (dipende dal fatto che si usi '' noConflict''). RequireJS deve ancora recuperare la lib e eseguirla più volte, il che è tutt'altro che ottimale. Se progetti correttamente la tua applicazione, puoi evitare tutto questo. – Louis
Louis, tecnicamente, sei corretto e come discusso più volte qui ne sono consapevole. Questa però è esattamente la risposta alla mia domanda in questo caso, perché non ho chiesto "come renderlo più elegante o appropriato", ma "come fare questo". Il motivo (che ho aggiunto in seguito) è che la mia applicazione è un ambiente di test. Quindi qui non importa affatto che le librerie vengano caricate più volte. In realtà è desiderato. Gli utenti finali non si preoccupano del fatto che il plugin sia costantemente caricato, se necessario una volta. In realtà è più conveniente per loro. Ancora una volta: questo è esattamente quello che sto cercando. –
Nel tuo commento affermi "Non ho chiesto" come renderlo più elegante o appropriato "". Tuttavia, questo è direttamente dalla tua domanda: "O forse c'è un modo ancora più elegante?" – Louis