Sfondo
Recentemente ho sviluppato, per due diversi progetti, due applicazioni web. I due hanno seguito approcci abbastanza diversi. Il primo era una classica applicazione di inventario (elenchi di elementi da visualizzare, selezionare, modificare .. molto CRUD) ed è stata sviluppata con Razor e ASP.NET MVC: controller che accetta le richieste, ottiene un modello attraverso un repository, costruisce diversi Viewmodels da per visualizzare e modificare, passare Viewmodel al motore di visualizzazione e renderizzare la pagina.
Cose molto dirette (puoi quasi creare un'applicazione con wizard solo con ASP.NET MVC), con pochissimo Javascript "magico" (solo il minimo offerto fuori dagli schemi MVC, principalmente per la validazione).
Il secondo era abbastanza diverso: questa applicazione è fondamentalmente un insieme di schermate (viste) attraverso le quali l'utente può navigare avanti e indietro, il cui aspetto cambia man mano che gli utenti inseriscono i dati in luoghi diversi - è fondamentalmente un hub in cui visualizzazioni degli utenti e informazioni sulle recensioni collegate ai suoi account. Ho creato questa seconda applicazione come servizio REST (creato con ServiceStack e quindi seguendo i modelli di progettazione che applica - come Data Transfer Object) e un'applicazione SPA implementata utilizzando AngularJS. L'applicazione angolare utilizza il suo (eccellente) servizio http per ottenere gli oggetti JSON dal servizio di restituzione e quindi popola il suo Viewmodel (lato client) (l'ambito). Molto pulito e ordinato; è facile navigare avanti e indietro tra le varie informazioni sull'account (che viene visualizzato in molti modi diversi: liste, grafici, ...)
A volte potrebbe essere un po 'più difficile codificarlo (l'autenticazione / l'autorizzazione è un po' più difficile (ad esempio, devi fare attenzione a simulare il controllo su client e server).
Ora sto iniziando un terzo progetto. È una via di mezzo: è ancora un'applicazione CRUD, ma deve essere molto reattiva. Ad esempio, in una pagina, abbiamo un'informazione complessa da inserire (combo di forma e lista); nella lista l'utente deve selezionare un elemento da un altro elenco, ma se l'elemento non è lì vogliamo aprire la vista "modifica lista articoli", lasciarlo inserire l'oggetto e tornare alla pagina originale .. tutto senza refresh / pushback / ... hai avuto l'idea.
La domanda
Qual è il modo migliore per farlo, per sviluppare un'applicazione web moderna, veloce e reattiva? Ho visto troppi approcci diversi:
- approccio basato sul controllo (jQuery): costruisci la pagina usando il tuo framework MVC (che produrrà html, una tabella per esempio), usa jQuery per "arricchire" l'html e renderlo ajax
- "basato sui dati" (Angolare): crea la pagina come pagina html con collegamenti dati, un'applicazione JS e struttura il lato server come servizio REST, che l'app JS utilizza per ottenere / pubblicare dati
- il mix n. 1: parte dell'app è costruita utilizzando il tuo framework MVC (che sputa html), parte utilizzando un framework basato sui dati (come angolare). L'ambito / modello angolare viene inizializzato utilizzando jQuery per estrarre i dati iniziali dal DOM html.
- il mix # 2: parte dell'app è costruita usando il tuo framework MVC (che sputa html), parte usando un framework basato sui dati (come angolare). Oltre a html, il server scrive uno "script", che è dati JSON, e lo incorpora nella pagina. Angular quindi lo utilizza come modello per il rendering della visualizzazione dei dati (lato client)
- il mix # 3: lo stesso, ma questa volta nessun JSON incorporato: il server espone un servizio REST che viene utilizzato da Angular per recuperare i dati di cui ha bisogno. È essenzialmente una parte generata sul server, una parte sul client attraverso una chiamata di secon per ottenere l'oggetto JSON e
- (more ...?)
Personalmente trovo il mix n. 1 e n. 2 brutto, ma sono troppo "nuovo" per il moderno sviluppo di Javascript da giudicare. Sono comuni? Per esempio, vedo che un vantaggio del mix # 1 è che ottieni immediatamente la vista iniziale, non devi aspettare che JS lo renderizzi. Entrambi i mix 1 e 2 fanno solo una chiamata al server.
Quindi qual è la migliore pratica? O quale (i) dovrei davvero evitare? Io (personalmente) sono più a mio agio con un mix di pagine generate lato server e JS lato client; fare una SPA usando completamente i servizi non era così facile, più di una volta desideravo generare qualcosa usando la logica lato server, ma potrei sbagliarmi (è per questo che sto chiedendo!)