Qual è lo scopo di backbone.js?


442

Ho cercato di capire l'utilità di backbone.js dal suo sito http://documentcloud.github.com/backbone , ma non riuscivo ancora a capire molto.

Qualcuno può aiutarmi spiegando come funziona e come potrebbe essere utile per scrivere meglio JavaScript?


36
È un framework MVC. Ti incoraggia ad astrarre i tuoi dati in modelli e la manipolazione del DOM in viste e a unire le due cose usando eventi.
Raynos,

Come può una "vista" gestire gli eventi nel contesto di MVC? Questo è ciò che afferma backbonejs.org nella loro introduzione.

3
Vale la pena imparare. Ho avuto difficoltà a iniziare, ma dopo aver superato alcune gobbe nella curva di apprendimento non è davvero troppo difficile. Inizia con la demo di Wine Cellar.
kmitchel46725,

2
Nel contesto di Backbone, la vista si raddoppia come controller. Ascolta gli eventi DOM e li abbatte ai modelli come appropriato. Ascolta anche le modifiche ai modelli e alle raccolte e ridisegna il DOM in modo appropriato. La spina dorsale è un modello MV, ma la C è implicita. Se Backbone fosse Rails, il modello sarebbe la vista e la vista sarebbe il controller.
superluminario,

Ho pensato che fosse un framework MVVM in quanto in realtà non fornisce controller.
SoluableNonagon,

Risposte:


393

Backbone.js è fondamentalmente un framework super leggero che ti consente di strutturare il tuo codice Javascript in modo MVC (Model, View, Controller) dove ...

Il modello fa parte del codice che recupera e popola i dati,

View è la rappresentazione HTML di questo modello (le visualizzazioni cambiano quando cambiano i modelli, ecc.)

e Controller opzionale che in questo caso ti consente di salvare lo stato della tua applicazione Javascript tramite un URL hashbang, ad esempio: http://twitter.com/#search?q=backbone.js

Alcuni professionisti che ho scoperto con Backbone:

  • Niente più Spaghetti Javascript: il codice è organizzato e suddiviso in file .js semanticamente significativi che vengono successivamente combinati usando JAMMIT

  • Non più jQuery.data(bla, bla): non è necessario archiviare i dati nel DOM, archiviare invece i dati nei modelli

  • l'associazione di eventi funziona e basta

  • libreria di utilità Underscore estremamente utile

  • Il codice backbone.js è ben documentato e un'ottima lettura. Mi ha aperto gli occhi su una serie di tecniche di codice JS.

Contro:

  • Mi ci è voluto un po 'per avvolgerci la testa e capire come applicarlo al mio codice, ma sono un novizio di Javascript.

Ecco una serie di fantastici tutorial sull'uso di Backbone con Rails come back-end:

CloudEdit: un tutorial Backbone.js con Rails:

http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/

http://www.jamesyu.org/2011/02/09/backbone.js-tutorial-with-rails-part-2/

ps Esiste anche questa meravigliosa classe Collection che ti consente di gestire raccolte di modelli e imitare modelli nidificati, ma non voglio confonderti fin dall'inizio.



16
Questa risposta è sbagliata Backbone non è un framework MVC. È un framework MV *. Comprendere i componenti principali è piuttosto importante. E non ha controller. In bocca al lupo.

3
Giusto per ribadire, la stessa libreria Backbone non ha controller, anche se Jeremy Ashkenas ha detto che gli oggetti View prendono il loro posto poiché sono oggetti JavaScript che possiedono modelli e shuffle dati da e verso il front-end. Naturalmente non c'è nulla che ti impedisca di implementare un controller, un servizio, persino un ViewModel, se lo desideri, è solo JavaScript.
superluminario,

3
Che cos'è JAMMIT? ɯnɯıuıɯ ʇunoɔ ɹǝʇɔɐɹɐɥɔ
user1717828,

1
RE: "jQuery.data (bla, bla): non è necessario archiviare i dati in DOM" IIRC, jQuery li archivia comunque in memoria. cioè non reimposta gli data-attributi sugli elementi DOM. (Quindi se il tuo HTML avesse degli data-attributi quando la pagina veniva caricata e fossero cambiati, il DOM e la rappresentazione in memoria sarebbero OOS - ma dovresti comunque lavorare con i dati in-mem)
JoeBrockhaus

250

Se hai intenzione di creare interfacce utente complesse nel browser, probabilmente ti ritroverai a inventare la maggior parte dei pezzi che compongono framework come Backbone.js e Sammy.js. Quindi la domanda è: stai costruendo qualcosa di abbastanza complicato nel browser da meritare di usarlo (quindi non finisci per inventare la stessa cosa da solo).

Se ciò che prevedi di creare è qualcosa in cui l'interfaccia utente cambia regolarmente la modalità di visualizzazione ma non va al server per ottenere intere nuove pagine , probabilmente avrai bisogno di qualcosa come Backbone.js o Sammy.js. L'esempio cardine di qualcosa del genere è GMail di Google. Se l'hai mai usato, noterai che scarica un grosso pezzo di HTML, CSS e JavaScript quando accedi per la prima volta e poi tutto ciò accade in background. Può passare dalla lettura di un'e-mail all'elaborazione della posta in arrivo e dalla ricerca e viceversa, senza mai richiedere il rendering di una pagina completamente nuova.

È quel tipo di app che questi framework eccellono nel rendere più semplice lo sviluppo. Senza di essi finirai per riunire un insieme diversificato di singole librerie per ottenere parti della funzionalità (ad esempio, jQuery BBQ per la gestione della cronologia, Events.js per eventi, ecc.) O finirai per costruire tutto da solo e dover mantenere e testare tutto da soli. In contrasto con qualcosa come Backbone.js che ha migliaia di persone che lo guardano su Github, centinaia di fork in cui le persone potrebbero lavorarci e centinaia di domande già poste e risposte qui su Stack Overflow.

Ma nulla di tutto ciò ha alcuna importanza se ciò che si prevede di costruire non è abbastanza complicato da valere la curva di apprendimento associata a un framework. Se stai ancora costruendo siti PHP, Java o qualcos'altro in cui il server back-end sta ancora facendo tutto il lavoro pesante di costruzione delle pagine Web su richiesta dell'utente e JavaScript / jQuery è solo la ciliegina su quel processo, non sei " non sarà necessario o non è ancora pronto per Backbone.js.


21
Grazie per il confronto con Gmail. Questo è stato un modo semplice per me di capire che non ho bisogno di approfondire questo per il sito che sto sviluppando.
Eric Hu,

15
+1 per menzionare che finirai per scrivere qualcosa come backbone.js se il tuo progetto diventa abbastanza grande: re Greenspan's 10th Rule
Matthew Lock

Se si utilizza PHP o qualcosa di simile solo come endpoint per un servizio Web, non si utilizza l'80 o il 90% del tradizionale framework di sviluppo Web in stile richiesta / risposta. Quindi c'è una grande differenza nel modo in cui questo tipo di app finisce per essere costruita rispetto a un'app Web più tradizionale.
John Munsch,

2
Grazie John per la tua risposta è davvero
illuminante

1
Il riferimento di Gmail mi ha davvero aperto gli occhi. Grazie!
T.Kaukoranta,

95

La spina dorsale è ...

... una libreria di componenti molto piccola che puoi usare per organizzare il tuo codice. Viene fornito in un unico file JavaScript. Escludendo i commenti, ha meno di 1000 righe di JavaScript reale. È scritto in modo ragionevole e puoi leggere tutto in un paio d'ore.

È una libreria front-end, la includi nella tua pagina web con un tag script. Interessa solo il browser e dice poco sul tuo server, tranne che dovrebbe esporre idealmente un'API riposante.

Se hai un'API, Backbone ha alcune utili funzioni che ti aiuteranno a parlarne, ma puoi usare Backbone per aggiungere interattività a qualsiasi pagina HTML statica.

Backbone è per ...

... aggiunta di struttura a JavaScript.

Poiché JavaScript non impone alcun modello particolare, le applicazioni JavaScript possono diventare molto disordinate molto rapidamente. Chiunque abbia costruito qualcosa di oltre banale in JavaScript probabilmente avrà incontrato domande come:

  1. Dove memorizzerò i miei dati?
  2. Dove inserirò le mie funzioni?
  3. Come collegherò le mie funzioni insieme, in modo che vengano chiamate in modo sensato e non si trasformino in spaghetti?
  4. Come posso rendere questo codice gestibile da diversi sviluppatori?

Backbone cerca di rispondere a queste domande dandoti:

  • Modelli e raccolte per aiutarti a rappresentare dati e raccolte di dati.
  • Viste, per aiutarti ad aggiornare il tuo DOM quando i tuoi dati cambiano.
  • Un sistema di eventi in modo che i componenti possano ascoltarsi a vicenda. Ciò mantiene i componenti disaccoppiati e previene la spaghettificazione.
  • Un insieme minimo di convenzioni sensate, in modo che gli sviluppatori possano lavorare insieme sulla stessa base di codice.

Lo chiamiamo un modello MV *. Modelli, viste ed extra opzionali.

La spina dorsale è leggera

Nonostante le apparenze iniziali, Backbone è incredibilmente leggero, non fa quasi nulla. Quello che fa è molto utile.

Ti dà una serie di piccoli oggetti che puoi creare e che possono emettere eventi e ascoltarsi a vicenda. Ad esempio, è possibile creare un piccolo oggetto per rappresentare un commento, quindi un piccolo oggetto commentView per rappresentare la visualizzazione del commento in un determinato punto del browser.

Puoi dire a commentView di ascoltare il commento e ridisegnare se stesso quando il commento cambia. Anche se hai lo stesso commento visualizzato in più punti della tua pagina, tutte queste viste possono ascoltare lo stesso modello di commento e rimanere sincronizzate.

Questo modo di comporre il codice ti aiuta a evitare di aggrovigliati anche se la tua base di codice diventa molto grande con molte interazioni.

Modelli

All'inizio, è comune archiviare i dati in una variabile globale o nel DOM come attributi di dati . Entrambi hanno problemi. Le variabili globali possono essere in conflitto tra loro e sono generalmente in cattive condizioni. Gli attributi di dati archiviati nel DOM possono essere solo stringhe, dovrai analizzarli nuovamente. È difficile archiviare elementi come matrici, date o oggetti e analizzare i dati in un formato strutturato.

Gli attributi dei dati sono simili al seguente:

<p data-username="derek" data-age="42"></p>

Backbone risolve questo problema fornendo un oggetto Model per rappresentare i dati e i metodi associati . Supponi di avere un elenco di cose da fare, avresti un modello che rappresenta ogni elemento in quell'elenco.

Quando il modello viene aggiornato, genera un evento. Potresti avere una vista legata a quel particolare oggetto. La vista ascolta gli eventi di cambio modello e si esegue nuovamente il rendering.

Visualizzazioni

Backbone fornisce oggetti View che parlano al DOM. Tutte le funzioni che manipolano il DOM o ascoltano gli eventi DOM vanno qui.

Una vista in genere implementa una funzione di rendering che ridisegna l'intera vista, o possibilmente parte della vista. Non è obbligatorio implementare una funzione di rendering, ma è una convenzione comune.

Ogni vista è associata a una parte particolare del DOM, quindi potresti avere un searchFormView, che ascolta solo il modulo di ricerca, e un shoppingCartView, che visualizza solo il carrello.

Le viste sono in genere associate anche a modelli o raccolte specifici. Quando il Modello si aggiorna, genera un evento che la vista ascolta. La vista potrebbe chiamarli render per ridisegnarsi.

Allo stesso modo, quando si digita in un modulo, la vista può aggiornare un oggetto modello. Ogni altra vista che ascolta quel modello chiamerà quindi la propria funzione di rendering.

Questo ci dà una netta separazione delle preoccupazioni che mantiene il nostro codice pulito e ordinato.

La funzione di rendering

È possibile implementare la funzione di rendering in qualsiasi modo lo ritenga opportuno. Potresti semplicemente inserire un po 'di jQuery qui per aggiornare manualmente il DOM.

È inoltre possibile compilare un modello e utilizzarlo. Un modello è solo una stringa con punti di inserimento. Lo si passa a una funzione di compilazione insieme a un oggetto JSON e si ottiene una stringa compilata che è possibile inserire nel DOM.

collezioni

Hai anche accesso a raccolte che memorizzano elenchi di modelli, quindi un todoCollection sarebbe un elenco di todo modelli. Quando una raccolta guadagna o perde un modello, cambia il suo ordine o un modello in una raccolta si aggiorna, l'intera raccolta genera un evento.

Una vista può ascoltare una raccolta e aggiornarsi ogni volta che la raccolta si aggiorna.

È possibile aggiungere metodi di ordinamento e filtro alla propria raccolta e, ad esempio, farla ordinare automaticamente.

Ed eventi per legare tutto insieme

Per quanto possibile, i componenti dell'applicazione sono separati l'uno dall'altro. Comunicano utilizzando gli eventi, quindi un carrello acquisti può ascoltare una raccolta carrello acquisti e ridisegnarsi quando viene aggiunto il carrello.

shoppingCartView.listenTo(shoppingCart, "add", shoppingCartView.render);

Ovviamente, anche altri oggetti potrebbero ascoltare lo shoppingCart e fare altre cose come aggiornare un totale o salvare lo stato nella memoria locale.

  • Le viste ascoltano Modelli e eseguono il rendering quando il modello cambia.
  • Le viste ascoltano le raccolte e visualizzano un elenco (o una griglia, o una mappa, ecc.) Quando un elemento della raccolta cambia.
  • I modelli ascoltano le visualizzazioni in modo che possano cambiare stato, magari quando un modulo viene modificato.

Disaccoppiare i tuoi oggetti in questo modo e comunicare usando gli eventi significa che non sarai mai ingarbugliato in nodi e aggiungere nuovi componenti e comportamenti è facile. I tuoi nuovi componenti devono solo ascoltare gli altri oggetti già presenti nel sistema.

Convegni

Il codice scritto per Backbone segue una serie libera di convenzioni. Il codice DOM appartiene a una vista. Il codice di raccolta appartiene a una raccolta. La logica aziendale si inserisce in un modello. Un altro sviluppatore che raccoglierà la tua base di codice sarà in grado di colpire il terreno correndo.

Per riassumere

Backbone è una libreria leggera che presta struttura al tuo codice. I componenti sono disaccoppiati e comunicano tramite eventi in modo da non finire nel caos. Puoi estendere facilmente la tua base di codice, semplicemente creando un nuovo oggetto e facendolo ascoltare correttamente gli oggetti esistenti. Il tuo codice sarà più pulito, più bello e più gestibile.

Il mio piccolo libro

Backbone mi è piaciuto così tanto che ho scritto un piccolo libro introduttivo al riguardo. Puoi leggerlo online qui: http://nicholasjohnson.com/backbone-book/

Ho anche suddiviso il materiale in un breve corso online, che puoi trovare qui: http://www.forwardadvance.com/course/backbone . Puoi completare il corso in circa un giorno.


1
La vista non rende tecnicamente un modello, non in realtà "se stesso"? Sembra giocare più del ruolo di "Presentatore" o "ViewModel".
JoeBrockhaus,

1
Buon punto, anche se la vista può rendere qualsiasi cosa tu gli chieda. Questo potrebbe essere un modello, un jQuery arbitrario o persino qualcosa di minuscolo come un valore in una forma o un numero in un badge.
superluminario,

3
@superluminary aiuta davvero !!
Antoops,

2
Spiegazione fantastica!
TastyCode

3
Il libro è molto utile Grazie per averlo scritto.
Sung Cho,

32

Ecco una presentazione interessante:

Un'introduzione a Backbone.js

Suggerimento (dalle diapositive):

  • Rotaie nel browser? No .
  • Un framework MVC per JavaScript? Sorta .
  • Una grande macchina a grasso? !

14

Backbone.js è un framework JavaScript che ti aiuta a organizzare il tuo codice. È letteralmente una spina dorsale su cui costruire la tua applicazione. Non fornisce widget (come l'interfaccia utente di jQuery o Dojo).

Ti offre un fantastico set di classi base che puoi estendere per creare codice JavaScript pulito che si interfaccia con gli endpoint RESTful sul tuo server.


Uso jQuery e mootools e javascript in generale sul mio progetto. Come imparare backbone.js mi aiuterà e qual è l'endpoint Restful. Scusa se la mia domanda non ha senso.
sushil bharwani,

1
jQuery è principalmente per la manipolazione DOM, in quanto Backbone è ampiamente utilizzato come framework guidato da eventi oltre ad essere utilizzato per la modellazione dei dati.
RobertPitt,

14

JQuery e Mootools sono solo una cassetta degli attrezzi con molti strumenti del tuo progetto. Backbone si comporta come un'architettura o una spina dorsale per il progetto su cui è possibile creare un'applicazione utilizzando JQuery o Mootools.


sì, in realtà è facile supporre che il nome sia solo un nome, ad esempio "jquery" presumibilmente significa "query javascript" che in realtà non implica molto da solo. Ma in questo caso significa letteralmente spina dorsale :)
msanjay


11

Devo ammettere che tutti i "vantaggi" di MVC non hanno mai reso il mio lavoro più facile, veloce o migliore. Rende l'intera esperienza di codifica più astratta e richiede tempo. La manutenzione è un incubo quando si tenta di eseguire il debug di qualcun altro concezione sul significato di separazione. Non so quanti di voi abbiano mai provato ad aggiornare un sito FLEX che utilizzava Cairngorm come modello MVC, ma ciò che dovrebbe richiedere 30 secondi per l'aggiornamento può spesso richiedere più di 2 ore (ricerca / traccia / debug solo per trovare un singolo evento ). MVC è stato ed è ancora, per me, un "vantaggio" che puoi fare.


2
Onestamente qualsiasi struttura di framework può essere mutilata e deformata da programmatori ignoranti o programmatori che non si preoccupano. Una volta ho lavorato su un sito CodeIgniter che avrebbe dovuto essere molto semplice e semplice da costruire. Ma l'idiota con cui ho lavorato era così abituato a fare le cose alla maniera degli anni '90 che l'ha cambiato da un approccio OOP pulito a un approccio procedurale deformato all'interno di OOP.
Patrick,

9
Ho anche visto qualcuno scrivere un sito da zero e scriverlo magnificamente senza usare alcun framework. In un'occasione questo è stato fatto da un programmatore PHP relativamente nuovo / verde. Gli è capitato di avere una mente molto razionale che ha messo a punto un modo piuttosto semplice di implementare le cose. L'uso di un buon framework ti porterà solo lontano. Considerando che l'uso di buone pratiche di programmazione ti porterà anni luce nel futuro.
Patrick,

2
@ user1415445: Quello che dici significa essenzialmente che avere una singola classe che gestisce la logica dei dati, la logica di rendering e la comunicazione tra i widget del livello di presentazione e il codice di archiviazione / recupero dei dati è più facile da gestire rispetto a quando ognuno di questi problemi viene gestito da classi / oggetti separati. È difficile da credere. A meno che tu non possa dimostrare un'app non banale scritta due volte, una volta con MVC e una volta senza, che la sua versione non MVC è più facile da mantenere, ecc.
Behrang Saeedzadeh,

1
Qualsiasi applicazione oltre la banale necessita idealmente di un modello e MVC è un modello eccellente quando si ha a che fare con la presentazione dei dati. Sembra che tu abbia avuto una brutta esperienza, ma non è colpa del modello.
Superluminario,

la documentazione sarà sempre la rosetta mancante, indipendentemente dai modelli e dalle pratiche utilizzati, perché quelli cambiano nel tempo. il bello di schemi come MVC è che una volta capito l'impianto idraulico, non devi mai perdere tempo a scrivere impianti idraulici ogni volta che aggiungi una nuova funzionalità o ne aggiorni una vecchia. Quindi sì, fino a quando non capirai l'impianto idraulico, sarà un esercizio di futilità. L'unico modo per garantire un'adeguata comprensione dei futuri sviluppatori sconosciuti è seguire standard abbastanza ragionevoli E ANCHE documentare bene. Mantenere e comprendere il disordine spagettificato di qualcuno non è più veloce o più facile ..
JoeBrockhaus


3

backbone.js è Model-View-Controller (MVC) con JavaScript ma Extjs migliore di backbone per MVC Pattern di script java

Con la spina dorsale hai la libertà di fare quasi tutto ciò che desideri. Invece di provare a sfogliare l'API e personalizzare vorrei usare Backbonejs per la sua semplicità e facilità di implementazione. Ancora una volta è difficile dire che ciò di cui hai bisogno sia una libreria, un altro un componente


3

Backbone è stato creato da Jeremy Ashkenas che ha anche scritto CoffeeScript. Come applicazione pesante di JavaScript, quella che ora conosciamo come Backbone era responsabile della strutturazione dell'applicazione in una base di codice coerente. Underscore.js, l'unica dipendenza di backbone, faceva anche parte dell'applicazione DocumentCloud.

Backbone aiuta gli sviluppatori a gestire un modello di dati nella loro app Web sul lato client con la stessa disciplina e struttura che otterresti nella logica tradizionale dell'applicazione lato server.

Ulteriori vantaggi dell'utilizzo di Backbone.js

  1. Vedi Backbone come una libreria, non come un framework
  2. Javascript ora si sta organizzando in modo strutturato, il modello (MVVM)
  3. Grande comunità di utenti

2

Aggiunge inoltre il routing tramite controller e viste con KVO. Sarai in grado di sviluppare applicazioni "AJAXy" con esso.

Vedilo come una leggera struttura Sproutcore o Cappuccino.


1

È un modello di progettazione MVC sul lato client, credimi .. Ti farà risparmiare tonnellate di codice, per non parlare di un codice più pulito e chiaro, un codice più facile da mantenere. All'inizio potrebbe essere un po 'complicato, ma credimi è un'ottima biblioteca.


0

Tante buone risposte già. Backbone js aiuta a mantenere organizzato il codice. La modifica del modello / raccolta si occupa della visualizzazione automatica del rendering che riduce molto il sovraccarico di sviluppo.

Anche se offre la massima flessibilità per lo sviluppo, gli sviluppatori dovrebbero fare attenzione a distruggere i modelli e rimuovere correttamente le viste. Altrimenti potrebbe esserci una perdita di memoria nell'applicazione.


-3

Un'applicazione Web che coinvolge molte interazioni dell'utente con molte richieste AJAX, che deve essere cambiata di volta in volta e che viene eseguita in tempo reale (come Facebook o StackOverflow) dovrebbe utilizzare un framework MVC come Backbone.js. È il modo migliore per creare un buon codice.

Se l'applicazione è solo piccola, allora Backbone.js è eccessivo, soprattutto per gli utenti alle prime armi.

Backbone offre MVC lato client e tutti i vantaggi impliciti da questo.


5
"deve" usare la spina dorsale? Non riesco a vedere StackOverflow o Facebook, i tuoi due esempi, usando la spina dorsale o il trattino basso. Hai un riferimento per tale richiesta?
David Meister,

Esistono ovviamente molte altre librerie MV *, di cui Backbone è una di queste. Generalmente, MVC aiuta a mantenere le cose in ordine quando si sviluppano pezzi di codice più grandi.
superluminario,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.