Attualmente sono su un progetto che è un grande sito che utilizza la libreria Prototype e c'è già un'enorme quantità di codice Javascript.Come posso iniettare Javascript (incluso Prototype.js) in altri siti senza ingombrare lo spazio dei nomi globale?
Stiamo lavorando su un pezzo di codice che andranno "iniettato" in siti di altre persone (foto persone aggiungendo un <sceneggiatura> tag nei loro siti) che sarà quindi eseguire il nostro codice e aggiungere un po 'di elementi DOM e funzionalità al loro sito. Questo avrà nuove parti di codice e riutilizzerà anche molto del codice che usiamo sul nostro sito principale.
Il problema che ho è che è, naturalmente, non raffreddare per aggiungere solo un <sceneggiatura> che includerà Prototype nelle pagine della gente. Se lo facciamo in una pagina che utilizza già lo ANY framework, siamo sicuri di rovinare tutto.
jQuery ci dà la possibilità di "rinominare" l'oggetto $, in modo che possa gestire questa situazione in modo decente, tranne ovviamente per il fatto che non stiamo usando jQuery, quindi dovremmo migrare lo di .
In questo momento sto contemplando una serie di scelte brutte, e io non sono sicuro di quello che è meglio ...
- riscrivere tutto da usare jQuery, con un $ oggetto rinominato in tutto il mondo.
- Creazione di una "nuova" libreria di prototipi con solo il sottoinsieme che utilizzeremmo nel codice "iniettato" e rinominare $ in qualcos'altro. Poi di nuovo dovrei adattare le parti del mio codice che sarebbero state condivise in qualche modo.
- Non utilizzare affatto una libreria nel codice iniettato, per mantenerlo il più pulito possibile e riscrivere il codice condiviso per non utilizzare alcuna libreria. Ciò ovviamente degenererebbe in noi creando il nostro stesso frankenstein di una biblioteca, che è probabilmente lo scenario peggiore di sempre.
mi chiedo che cosa pensate voi ragazzi che potevo fare, e anche se c'è qualche possibilità di magia che avrebbe risolto tutti i miei problemi ...
Per esempio, pensi che potrei usare qualcosa come Caja/Cajita per sandbox il mio codice e isolarlo dal resto del sito, e avere Prototype all'interno di lì? O mi manca completamente il punto?
Ho anche letto una volta su una tecnica per bookmarklets, sono stati si aggiunge il codice come questo:
(function() { /* your code */ })();
E poi il codice è tutto all'interno della vostra funzione anonima e non hanno toccato il namespace globale a tutti . Pensi che ho potuto fare un file che contiene:
(function() {
/* Full Code of the Prototype file here */
/* All my code that will run in the "other" site */
InitializeStuff_CreateDOMElements_AttachEventHandlers();
})();
Vorrei che il lavoro? Raggiungerebbe l'obiettivo di non ingombrare lo spazio dei nomi globale e non uccidere la funzionalità su un sito che utilizza jQuery, ad esempio?
Oppure Prototype è troppo complesso in qualche modo per isolarlo in quel modo?
(NOTA: penso di sapere che ciò creerebbe chiusure ovunque ed è più lento, ma non mi interessa troppo le prestazioni, il mio codice non sta facendo nulla di così complesso)
In genere, quando si inserisce il proprio codice su altri siti Web, si fornisce una piccola parte della funzionalità dell'applicazione principale, quindi è opportuno codificare semplicemente le funzionalità richieste nel javascript "nativo". Tuttavia, sembra che non sia il caso del tuo progetto. Penso che funzionerebbe con la funzione di wrapper anonimo. Alcuni bookmarklet hanno routine che caricano dinamicamente le librerie richieste. Eseguendo alcuni test per confermare che la tecnica funziona, dovrebbe essere veloce. :) – Favio