Incorporando le lib nel modello di modulo

2

Recentemente ho iniziato a utilizzare require.js (insieme a Backbone.js, jQuery e una manciata di altre librerie JavaScript) e adoro il modello del modulo (ecco una bella sinossi se non conosci: link ). Qualcosa con cui mi imbatto sono le migliori pratiche sull'incorporazione di librerie che non supportano il modello del modulo (out of the box). Ad esempio, jQuery senza modifiche verrà caricato in una variabile jQuery globale e basta. Require.js lo riconosce e fornisce un progetto di esempio da scaricare con una versione (leggermente) modificata di jQuery da incorporare con un progetto require.js.

Questo va contro tutto ciò che ho imparato sull'uso di librerie esterne - non modificare mai la fonte. Posso elencare una tonnellata di ragioni. Indipendentemente da ciò, questo non è un approccio con cui mi sento a mio agio.

Ho usato un approccio misto - in cui costruisco / carica le librerie JS "tradizionali" in un modo "tradizionale" (disponibile nello spazio dei nomi globale) e poi utilizzo il modello di modulo per tutto il codice dell'applicazione. Questo mi sembra a posto, ma mi infastidisce perché una delle bellezze reali del modello del modulo (nessuna globalità) si sta pervertendo.

Qualcun altro ha una soluzione migliore a questo problema?

    
posta webnesto 14.04.2012 - 06:58
fonte

2 risposte

1

IMHO una delle funzionalità più interessanti che si potrebbero aggiungere allo standard html sarebbe proprio questa: caricare uno script senza eseguirlo subito *. Mi piacerebbe avere tutto il codice in uno script racchiuso in una chiusura e chiamarlo come una funzione quando e se volevo (forse anche passandoci i parametri, per esempio usando gli attributi html per quello - ma questa è un'altra storia). Oggi risolverebbe molti problemi di programmazione per il browser.

jQuery ci fornisce l'utilità noConflict , che è utile se vuoi rimuovere il binding globale ( s), ma devi chiamarlo "dopo il fatto". Non ho esperienza con require.js, quindi è difficile dire se questo sarebbe un problema. Ma è uno dei modi migliori che conosco per mantenere i tuoi programmi liberi da tutto il mondo e tendo a imitare nei miei script.

La maggior parte dei plugin jQuery si astiene anche dalla creazione di globals, ma di solito richiedono che jQuery (e talvolta $ , sebbene sia una cattiva pratica) esista come globale per funzionare correttamente, quindi è meglio usare noConflict dopo tutti i plugin sono caricati (e anche quelli mal costruiti potrebbero non funzionare)

Un modo di "ultima istanza" che posso pensare di raggiungere lo stesso obiettivo sarebbe caricare uno script come testo, usando Ajax ad esempio, avvolgendolo in una chiusura prima di chiamare eval su di esso. Ingombrante, ma non privo di vantaggi (è possibile apportare verifiche / modifiche allo script caricato prima di eseguirlo effettivamente, ad esempio se lo si carica da fonti esterne). Perdereste alcune protezioni del browser contro XSS però ...

Informazioni sulla modifica delle fonti, sono d'accordo con MainMa, non c'è niente di sbagliato in questo corto di pro / contro specifici dichiarati.

* Nota: quando dico "avvolgere tutto il codice in una chiusura", non intendo il modo in cui la maggior parte degli script già fa: creare una funzione e quindi chiamarla. Intendevo creare una funzione e consentire a un'altra parte del tuo programma di memorizzarla, eseguendola quando conveniente. AFAIK non esiste un modo "conforme agli standard" per farlo.

    
risposta data 14.04.2012 - 07:31
fonte
0

Non c'è (quasi) nulla di sbagliato nella modifica delle librerie esterne. jQuery è un progetto open source, quindi se puoi adattarlo alle tue esigenze particolari, fallo e basta.

Potrebbero esserci alcuni problemi con questo approccio:

  • Quando viene rilasciata una nuova versione di jQuery, cosa è più facile da fare? Aggiorna il tag <script> di un sito web per utilizzare la nuova versione o spreca tempo a riapplicare le modifiche che hai già apportato alla versione precedente?

  • Quando utilizzi una versione ufficiale di jQuery, puoi beneficiare di Google CDN. Se hai la tua versione modificata, devi ospitarla tu stesso.

  • Se lavori con altre persone, potrebbero non avere familiarità con le tue modifiche e assumere che tu stia utilizzando la libreria jQuery originale.

Tutti questi problemi sono ancora minori nella maggior parte delle circostanze. Ad esempio, a meno che tu non abbia un'applicazione web su larga scala, non sono sicuro che sia il fatto che non usi Google CDN che sarà il collo di bottiglia.

Quindi, se hai abbastanza esperienza per farlo, non c'è nulla di sbagliato nella modifica delle librerie esistenti per soddisfare meglio le tue esigenze.

    
risposta data 14.04.2012 - 07:12
fonte

Leggi altre domande sui tag