Molto tempo fa, in una galassia molto, molto lontano, JavaScript era un linguaggio odiato. In effetti, "odiato" è un eufemismo; JavaScript era una lingua disprezzata. Di conseguenza, gli sviluppatori in genere l'hanno trattato come tale, solo spostando le dita dei piedi nelle acque JavaScript quando avevano bisogno di aggiungere un po 'di fascino alle loro applicazioni. Nonostante il fatto che ci sia un bel po 'di bene nel linguaggio JavaScript, a causa della diffusa ignoranza, pochi hanno avuto il tempo di apprenderlo appropriatamente. Invece, come alcuni di voi potrebbero ricordare, l'uso standard di JavaScript comportava una notevole quantità di copia e incolla.
"Non preoccuparti di sapere cosa fa il codice o se segue le migliori pratiche, semplicemente incollalo!" - Il peggior consiglio di sempre
Poiché l'ascesa di jQuery ha riacceso l'interesse per il linguaggio JavaScript, gran parte delle informazioni sul web è un po 'approssimativa.
Ironia della sorte, si scopre che gran parte di ciò che la comunità di sviluppo odiava aveva molto poco a che fare con il linguaggio JavaScript, in sé. No, la vera minaccia sotto la maschera era il DOM, o "Document Object Model", che, soprattutto all'epoca, era orribilmente incoerente dal browser al browser. "Certo, potrebbe funzionare in Firefox, ma per quanto riguarda IE8? Ok, potrebbe funzionare in IE8, ma per quanto riguarda IE7?" La lista continuò instancabilmente!
Fortunatamente, a partire da circa cinque anni fa, la comunità JavaScript vedrebbe un incredibile cambiamento in meglio, poiché le librerie come jQuery sono state introdotte al pubblico. Queste librerie non solo fornivano una sintassi espressiva particolarmente attraente per i web designer, ma riuscivano anche a livellare la sensazione di gioco, rimuovendo le soluzioni alternative per i vari dettagli del browser nella sua API. grilletto $ .ajax
e lascia che jQuery faccia la parte difficile. Avanti veloce a oggi e la community JavaScript è più vivace che mai, in gran parte grazie alla rivoluzione di jQuery.
Poiché l'ascesa di jQuery ha riacceso l'interesse per il linguaggio JavaScript, gran parte delle informazioni sul web è un po 'approssimativa. Questo è meno dovuto all'ignoranza degli scrittori e più al fatto che stavamo tutti imparando. Ci vuole tempo perché emergano le migliori pratiche.
Fortunatamente, la comunità è maturata immensamente da quei giorni. Prima di immergerci in alcune di queste migliori pratiche, esponiamo prima alcuni cattivi consigli diffusi sul web.
Il problema con suggerimenti come questo è che portano l'idea della pre-ottimizzazione ad un estremo.
Molto simile a Ruby on Rails, la prima introduzione di molti sviluppatori a JavaScript era attraverso jQuery. Questo ha portato a un ciclo comune: impara jQuery, innamorati, scavare in JavaScript vaniglia e salire di livello.
Anche se non c'è sicuramente nulla di sbagliato in questo ciclo, ha spianato la strada a innumerevoli articoli, che raccomandavano agli utenti non utilizzare jQuery in varie situazioni, a causa di "problemi di prestazioni". Non sarebbe raro leggere che è meglio usare la vaniglia per
cicli, oltre $ .Ogni
. Oppure, ad un certo punto o in un altro, potresti aver letto che è meglio usarlo document.getElementsByClassName
sul motore Sizzle di jQuery, perché è più veloce.
Il problema con suggerimenti come questo è che portano l'idea della pre-ottimizzazione a un estremo e non tengono conto delle varie incoerenze del browser - le cose che jQuery ha risolto per noi! Eseguire un test e osservare risparmi di pochi millisecondi su migliaia di ripetizioni non è un motivo per abbandonare jQuery e la sua elegante sintassi. Il tuo tempo è molto più ottimizzato investendo parti della tua applicazione che realmente farà la differenza, come la dimensione delle tue immagini.
Questo secondo anti-modello, ancora una volta, è stato il risultato della comunità (incluso il sottoscritto a un certo punto) che non capiva completamente cosa stava succedendo sotto il cofano. Come tale, è probabile che tu abbia trovato (o scritto te stesso) codice, che ha avvolto un elemento nell'oggetto jQuery innumerevoli volte all'interno di una funzione.
$ ('button.confirm'). on ('click', function () // Fallo una volta $ ('. modal'). modal (); // Ancora una volta $ ('. modal'). addClass ('attivo'); // E ancora per buona misura $ ('modale'). css (...););
Mentre questo codice potrebbe, all'inizio, sembrare innocuo (e in verità è nel grande schema delle cose), stiamo seguendo la cattiva pratica di creare più istanze dell'oggetto jQuery. Ogni volta che ci riferiamo a $ ( 'Modale')
, viene generato un nuovo oggetto jQuery. È così intelligente??
Pensa al DOM come a una piscina: ogni volta che chiami
$ ( 'Modale')
, jQuery si tuffa nella piscina e cerca le monete (o gli elementi) associati. Quando interroghi ripetutamente il DOM per lo stesso selettore, stai essenzialmente gettando quelle monete nell'acqua, solo per saltare dentro e ritrovarle tutte da capo!
Seleziona sempre selettori se intendi usarli più di una volta. Lo snippet di codice precedente può essere rifatto a:
$ ('button.confirm'). on ('click', function () $ ('. modal') .modal () .addClass ('active') .css (...););
In alternativa, usa "cache".
$ ('button.confirm'). on ('click', function () // Fallo SOLO una volta var modal = $ ('. modal'); modal.modal (); modal.addClass ('active') ; modal.css (...););
Con questa tecnica, jQuery salta nel pool DOM per un totale di una volta, anziché tre.
Troppa attenzione viene prestata alle prestazioni del selettore.
Sebbene non sia così onnipresente in questi giorni, non molto tempo fa, il web è stato bombardato da innumerevoli articoli sull'ottimizzazione delle prestazioni dei selettori in jQuery. Ad esempio, è meglio usare $ ('div p')
o $ ( 'Div'). Find ( 'p')
?
Pronto per la verità? Non importa. È certamente una buona idea avere una conoscenza di base del modo in cui il motore Sizzle di jQuery analizza le query del selettore da destra a sinistra (il che significa che è meglio essere più specifici alla fine del tuo selettore, piuttosto che all'inizio). E, naturalmente, più specifici puoi essere, meglio è. Chiaramente, $ ( 'A.button')
è meglio per le prestazioni di $ ( 'Bottone')
, dovuto al fatto che, con il primo, jQuery è in grado di limitare la ricerca solo agli elementi di ancoraggio nella pagina, piuttosto che a tutti gli elementi.
Oltre a ciò, tuttavia, viene prestata troppa attenzione alle prestazioni del selettore. In caso di dubbi, confida nel fatto che il team jQuery è composto dai migliori sviluppatori JavaScript del settore. Se c'è un aumento di prestazioni da raggiungere in biblioteca, lo avranno scoperto. E, se non loro, uno dei membri della comunità invierà una richiesta di pull.
Con questo in mente, sii consapevole dei tuoi selezionatori, ma non preoccuparti troppo delle implicazioni di rendimento, a meno che tu non possa verbalizzare perché è necessario farlo.
jQuery ha incoraggiato l'uso diffuso delle funzioni di callback, che possono certamente fornire una buona comodità. Piuttosto che dichiarare una funzione, usa semplicemente una funzione di callback. Per esempio:
$ ('a.external'). on ('click', function () // questa funzione di callback viene attivata // quando viene cliccato .external;
Hai sicuramente scritto un sacco di codice simile a questo; So di avere! Se usate con parsimonia, le funzioni di callback anonimo servono come utili comodità. Lo sfregio si verifica lungo la linea, quando entriamo ... callback hell (trigger thunderbolt sound)!
L'inferno di callback è quando il tuo codice si indovina numerose volte, mentre continui ad annidare le funzioni di callback.
Si consideri il seguente codice abbastanza comune qui sotto:
$ ('a.data'). on ('click', function () var anchor = $ (this); $ (this) .fadeOut (400, function () $ .ajax (// ... successo: function (data) anchor.fadeIn (400, function () // hai appena inserito callback hell););););
Come regola generale, più il codice è indentato, più è probabile che ci sia un odore di codice. O, meglio ancora, chiediti, il mio codice sembra il Mighty Ducks Flying V?
Quando si refactoring un codice come questo, la chiave è chiedersi: "Come potrebbe essere testato?" All'interno di questo bit di codice apparentemente semplice, un listener di eventi è associato a un link, l'elemento si attenua, viene eseguita una chiamata AJAX, in caso di successo, l'elemento si dissolve, presumibilmente, i dati risultanti verranno aggiunti da qualche parte. Questo è sicuramente molto da provare!
Non sarebbe meglio suddividere questo codice in pezzi più gestibili e verificabili? Certamente. Sebbene quanto segue possa essere ulteriormente ottimizzato, un primo passo per migliorare questo codice potrebbe essere:
var updatePage = function (el, data) // aggiungi dati recuperati al DOM; var fetch = function (ajaxOptions) ajaxOptions = ajaxOptions || // url: ... // dataType: ... success: updatePage; restituire $ .ajax (ajaxOptions); ; $ ('a.data'). on ('click', function () $ (this) .fadeOut (400, fetch););
Ancora meglio, se hai una varietà di azioni da attivare, contenga i metodi pertinenti all'interno di un oggetto.
Pensa a come, in un ristorante fast-food, come McDonalds, ogni lavoratore è responsabile di un compito. Joe fa le patatine, Karen registra i clienti e Mike griglia gli hamburger. Se tutti e tre i membri dello staff facessero tutto, ciò introdurrebbe una varietà di problemi di manutenibilità. Quando i cambiamenti devono essere implementati, dobbiamo incontrarci con ciascuna persona per discuterne. Tuttavia, se noi, per esempio, teniamo Joe esclusivamente focalizzato sulle patatine fritte, dovremmo avere bisogno di aggiustare le istruzioni per preparare le patatine fritte, abbiamo solo bisogno di parlare con Joe e nessun altro. Dovresti adottare un approccio simile al tuo codice; ogni funzione è responsabile di un compito.
Nel codice sopra, il andare a prendere
la funzione attiva semplicemente una chiamata AJAX all'URL specificato. Il updatePage
la funzione accetta alcuni dati e li aggiunge al DOM. Ora, se vogliamo testare una di queste funzioni per assicurarci che funzioni come previsto, ad esempio, il updatePage
metodo, possiamo prendere in giro l'oggetto dati e inviarlo alla funzione. Facile!
È importante ricordare che l'ecosistema di jQuery è maturato molto negli ultimi anni. Le probabilità sono, se hai bisogno di un particolare componente, che qualcun altro l'abbia già costruito. Certamente, continua a creare plugin per aumentare la tua comprensione della libreria jQuery (ne scriveremo uno in questo articolo), ma, per l'utilizzo nel mondo reale, fai riferimento a eventuali plugin esistenti prima di reinventare la ruota.
Ad esempio, è necessario un selettore di date per un modulo? Risparmia il lavoro sulle gambe e sfrutta invece la libreria dell'interfaccia utente jQuery guidata dalla community e altamente testata.
Una volta che hai fatto riferimento alla libreria dell'interfaccia utente jQuery e al foglio di stile associato, il processo di aggiunta di un selettore di date a un input è semplice:
O che ne dici di una fisarmonica? Certo, potresti scrivere tu stesso questa funzionalità o, ancora una volta, sfruttare l'interfaccia utente di jQuery.
Crea semplicemente il markup necessario per il tuo progetto.
Capitolo 1
Qualche testo.
capitolo 2
Qualche testo.
capitolo 3
Qualche testo.
Sezione 4
Qualche testo.
Poi, automagicamente trasformalo in una fisarmonica.
$ (function () $ ("# fisarmonica"). accordion (););
Che cosa succede se è possibile creare schede in trenta secondi?
Crea il markup:
- Riguardo a noi
- La nostra missione
- Mettiti in contatto
Riguardo a noi testo.
Il nostro testo di missione.
Mettiti in contatto con il testo.
E attiva il plugin.
$ (function () $ ("# tabs"). tabs (););
Fatto! Non richiede nemmeno alcuna comprensione notevole di JavaScript.
Esaminiamo ora alcune best practice per la creazione di plug-in jQuery, cosa che in un certo punto della tua carriera di sviluppo dovrai svolgere.
Useremo un relativamente semplice Casella dei messaggi
plugin come demo per il nostro apprendimento. Sentiti libero di lavorare insieme; infatti, per favore fallo!
L'incarico: implementare la funzionalità necessaria per visualizzare le finestre di dialogo, utilizzando la sintassi, $ .message ('SAY TO THE USER')
. In questo modo, ad esempio, prima di eliminare definitivamente un record, possiamo chiedere all'utente di confermare l'azione, piuttosto che ricorrere all'infrlessibile e brutto mettere in guardia
scatole.
Il primo passo è capire come "attivare" $ .message
. Piuttosto che estendere il prototipo di jQuery, per i requisiti di questo plugin, abbiamo solo bisogno di allegare un metodo allo spazio dei nomi jQuery.
(function ($) $ .message = function (text) console.log (testo);;) (jQuery);
È così facile; vai avanti, provalo! Quando chiami $ .message ('Ecco il mio messaggio')
, quella stringa deve essere registrata nella console del browser (Maiusc + Comando + i, in Google Chrome).
Sebbene non ci sia abbastanza spazio per esaminare il processo di test del plug-in, questo è un passaggio importante da ricercare. C'è un incredibile senso di sicurezza che si verifica quando si refactoring il codice testato.
Ad esempio, quando si utilizza la suite di test di jQuery, QUnit, è possibile testare il codice del passaggio 1 scrivendo:
module ('jQuery.message', test ('è disponibile nello spazio dei nomi jQuery', 1, function () ok ($. message, 'dovrebbe esistere il metodo messaggio');););
Il ok
la funzione, disponibile tramite QUnit, afferma semplicemente che il primo argomento è un valore di verità. Se la Messaggio
il metodo non esiste nello spazio dei nomi jQuery, quindi falso
sarà restituito, nel qual caso il test fallisce.
Seguendo il modello di sviluppo basato su test, questo codice sarebbe il primo passo. Dopo aver osservato che il test fallisce, il passo successivo sarebbe aggiungere il Messaggio
metodo, di conseguenza.
Mentre, per brevità, questo articolo non approfondirà ulteriormente il processo di sviluppo basato su test in JavaScript, ti invitiamo a fare riferimento al repository GitHub per questo progetto per esaminare tutti i test per il plug-in: https: // github .com / JeffreyWay / MessageBox / blob / padrone / test / MessageBox_test.js
UN Messaggio
metodo che non fa nulla non è di aiuto a nessuno! Prendiamo il messaggio fornito e mostriamolo all'utente. Tuttavia, piuttosto che incorporare un enorme glob di codice nel $ .message
metodo, utilizzeremo invece semplicemente la funzione per istanziare e inizializzare a Messaggio
oggetto.
(function ($) "use strict"; var Message = initialize: function (text) this.text = text; return this;; $ .message = function (text) // Richiede polyfill per IE8- - return Object.create (Message) .initialize (text);;) (jQuery);
Non solo questo approccio, di nuovo, rende il Messaggio
oggetto più testabile, ma è anche una tecnica più pulita, che, tra le altre cose, protegge di nuovo l'inferno di callback. Pensa a questo Messaggio
oggetto come la rappresentazione di una singola finestra di messaggio.
Se Messaggio
rappresenta una singola casella di messaggio, quale sarà l'HTML per uno? Creiamo a div
con una classe di casella dei messaggi
, e renderlo disponibile al Messaggio
esempio, tramite un EL
proprietà.
var Message = initialize: function (text) this.el = $ ('', ' class ':' message-box ',' style ':' display: none '); this.text = testo; restituiscilo; ;Ora, l'oggetto ha un riferimento immediato al wrapping
div
per la finestra di messaggio. Per accedervi, potremmo fare:var msg = Object.create (Message) .initialize (); // [â €Ricorda, ora abbiamo un frammento HTML, ma non è ancora stato inserito nel DOM. Ciò significa che non dobbiamo preoccuparci di eventuali reflussi inutili, quando aggiungiamo il contenuto al
div
.
Passaggio 5
Il prossimo passo è prendere la stringa di messaggio fornita e inserirla nel
div
. Questo è facile!initialize: function (text) // ... this.el.html (this.text); // [