2009-02-09 16 views
63

Mi godo con un'applicazione web jquery basata su ajax piuttosto intensiva. Sta arrivando a un punto in cui quasi mi dimentico di quali eventi dovrebbero scatenare quali azioni ecc.Come strutturare il mio codice javascript/jquery?

Sono quasi rimasto con la sensazione che la mia struttura javascript sia errata, ad un livello più basilare. Come strutturate il vostro codice javascript/jquery, la gestione degli eventi, ecc., Ogni consiglio per uno sviluppatore javascript novizio.

risposta

33

AMDS!

È passato un po 'di tempo da quando sono state pubblicate le prime risposte a questa domanda e molte cose sono cambiate. In primo luogo, il mondo dei browser JS sembra muoversi verso AMD (definizione asincrona dei moduli) per l'organizzazione del codice.

Il modo in cui funziona è che si scrive tutto il codice come moduli di AMD, per esempio:

define('moduleName', ['dependency1', 'dependency2'], function (dependency1, dependency2) { 
    /*This function will get triggered only after all dependency modules loaded*/ 
    var module = {/*whatever module object, can be any JS variable here really*/}; 
    return module; 
}); 

E poi i moduli ottenere caricato utilizzando caricatori AMD come curl.js o require.js ecc, per esempio:

curl(
    [ 
     'myApp/moduleA', 
     'myApp/moduleB' 
    ], 
).then(
    function success (A, B) { 
     // load myApp here! 
    }, 
    function failure (ex) { 
     alert('myApp didn't load. reason: ' + ex.message); 
    } 
); 

vantaggi sono:

  1. Nella pagina è necessario includere solo un elemento <script> che carica il caricatore AMD (alcuni sono piuttosto piccoli).

  2. Dopo che tutti i file JS verranno recuperati automaticamente in NON BLOCCO asincrono! moda, quindi molto più veloce!

  3. I moduli necessari verranno eseguiti solo dopo aver caricato le sue dipendenze.

  4. Modulare (che significa codice che è più facile da mantenere e riutilizzare).

  5. Le variabili globali possono essere completamente ridotte se utilizzate correttamente.

Onestamente, una volta cliccato concetto ha nella tua testa, non avrai mai tornare al vecchio modo.

P.S: jQuery si registra come modulo AMD a partire dalla versione 1.7.

Maggiori informazioni sul AMDS:

+1

Fantastico, guarderò questo per il mio prossimo progetto. Grazie mille per aver aggiunto a questa domanda molto più tardi. –

25

Per codice javascript ho trovato i seguenti collegamenti da Christian Heilmann indispensabili

Mi piace molto anche il metodo descritto da Peter Michaux here

per jQuery , Raccomando vivamente di leggere le guide su Authoring un d Ho trovato questo tutorial su jQuery plugin patterns molto buona

+1

+1 per raccomandare il link authoring. Devo per i neofiti. – bendewey

+1

Mi piace il link di authoring (che devo ringraziare per), ma devo ammettere che non sono un grande fan del modo in cui i plugin jQuery espongono i metodi pubblici. Penso di trovare il metodo di Christian per esporre un singolo oggetto pubblico o i rendimenti pubblici di Paul più chiari da leggere. – Steerpike

+1

Christian mi ha appena indicato un'altra opzione per il modulo, ancora più elegante: http://www.wait-till-i.com/2007/08/22/again-with-the-module-pattern-reveal-qualcosa -to-the-world/ –

1

file My js di solito seguono una convenzione di denominazione simile a questo:

  • xxx.utility.js
  • mypage.events.js
  • xxx. common.js
  • /lib/
  • /OS-DoNotDistribute/lib/

Dove

  • 'mypage' è il nome del html, aspx, php, ecc file.
  • 'xxx' è il concetto. (Cioè orders.common.js)
  • 'utilità' significa che è uno script riutilizzabile biblioteca (cioè ajax.utility.js, controlfader.utility.js)
  • 'comune' è la funzionalità riutilizzabile per questa applicazione, ma non riutilizzabili in tutta altri progetti
  • 'lib' è una sottodirectory per gli script esterni o biblioteca
  • 'OS-DoNotDistribute' è una sottodirectory per garantire l'assenza di codice concesso in licenza del sistema operativo viene distribuito se l'applicazione è mai venduto.

Inoltre, per ajax, ho una convenzione di denominazione speciale per le funzioni di richiamata, quindi è facile dire quali sono.

Non sono sicuro che sia vicino a quello che stavi cercando, ma spero che sia d'aiuto.

9

per mantenere il mio eventi in controllo Io uso una pubblicazione/sottoscrizione meccanismo

jQuery.subscribe = function(eventName, obj, method){ 
    $(window).bind(eventName, function() { 
     obj[method].apply(obj, Array.prototype.slice.call(arguments, 1)); 
    }); 
    return jQuery; 
} 

jQuery.publish = function(eventName){ 
    $(window).trigger(eventName, Array.prototype.slice.call(arguments, 1)); 
    return jQuery; 
} 

Ecco un esempio del suo utilizzo

// a couple of objects to work with 
var myObj = { 
    method1: function(arg) { 
     alert('myObj::method1 says: '+arg); 
    }, 
    method2: function(arg1, arg2) { 
     alert(arg1); 
     //republish 
     $.publish('anEventNameIMadeUp', arg2); 
    } 
} 

var myOtherObj = { 
    say: function(arg){ 
     alert('myOtherObj::say says: ' + arg); 
    } 
} 



// you can then have all your event connections in one place 

//myObj::method2 is now listening for the 'start' event 
$.subscribe('start', myObj, 'method2'); 

//myOtherObj::say is now listening for the 'another' event 
$.subscribe('anotherEvent', myOtherObj, 'say'); 

//myObj::method1 is now listening for the 'anEventNameIMadeUp' event 
$.subscribe('anEventNameIMadeUp', myObj, 'method1'); 
//so is myOtherObj::say 
$.subscribe('anEventNameIMadeUp', myOtherObj, 'say'); 


// ok, trigger some events (this could happen anywhere) 
$.publish('start', 'message1', 'message2'); 
$.publish('anotherEvent', 'another message'); 
+2

Durante l'attivazione di eventi jQuery personalizzati, è necessario considerare quanto è lento utilizzare il DOM come origine evento. Considera l'utilizzo di [un plugin PubSub] (http://higginsforpresident.net/js/static/jq.pubsub.js) dopo aver dato un'occhiata alle [metriche su PubSub utilizzando eventi di memoria rispetto a eventi DOM jQuery] (http: // weblog.bocoup.com/publishsubscribe-with-jquery-custom-events). –

2
(function($, window, slice) 
{ 

    $.subscribe = function(eventName, obj, method) 
    { 
     $(window).bind(eventName, function() 
     { 
      obj[method].apply(obj, slice.call(arguments, 1)); 
     }); 
     return $; 
    }; 

    $.publish = function(eventName) 
    { 
     $(window).trigger(eventName, slice.call(arguments, 1)); 
     return jQuery; 
    }; 

})(jQuery, window, Array.prototype.slice); 
+0

@Akzhan, guarda i commenti che ho postato su @meouw. L'utilizzo degli eventi DOM è lento rispetto a un'alternativa in memoria. –

2

da aggiungere alle risposte esistenti, ecco un great post che copre tecniche più avanzate che si basano sul modello modulo.

Una volta che il codice Javascript raggiunge una determinata dimensione, è inevitabile che lo si debba rifattare suddividendolo in più file/moduli/sottomoduli. Se non sei sicuro di come ottenere ciò utilizzando il modello di modulo, questo articolo è obbligatorio.

0

Possiamo usare il modello mvc nelle nostre applicazioni javascript-jquery. (Backbone.js, knockout.js vs ....) sono librerie mature che possiamo usare per questo scopo.

Problemi correlati