Het is belangrijk het verschil tussen een library zoals jQuery of Zepto en een framework (MVC, MVVM, …

zoals Ember, Knockout, Backbone of Angular te begrijpen.
Javascript libraries verbergen de complexiteit en browserverschillen van Javascript achter een uniforme en eenvoudige interface. Het ganse selector, DOM manipulatiegedeelte en AJAX van bv. jQuery maakt het een stuk eenvoudiger en sneller om elementen van een pagina aan te passen (in de brede zin van het woord: animaties, verbergen/tonen, vervangen, …

. Het is allemaal in pure Javascript perfect te doen, maar dikwijls is het verboser (meer code om hetzelfde te bereiken) en vooral naar oudere browser support toe moet je dikwijls een andere syntax gebruiken. Libraries verbergen dat voor je.
Javascript frameworks draaien meer rond het organiseren, separation of concerns en encapsulaten van code aan de clientside. Je moet het in dat opzicht echt vergelijken met een serverside framework à la Symphony, Ruby on Rails, CakePHP, … De meest populaire hanteren het MVC (model-view-controller) of MVVM (model-view-viewmodel) model. Een kleine waarschuwing hierbij: daar eindigt de analogie ook. Het serverside MVC model is eigenlijk niet 100% hoe het originele MVC model werkt, het clientside MVC komt er dichter bij in de buurt.
Javascript MVC frameworks hebben een aantal voordelen eens je complexere datadriven apps gaat ontwikkelen. Ze hebben allemaal een of andere vorm van binding, bij de ene wat meer doe-het-zelf (Backbone) en bij de andere meer opinionated (Ember en Angular). Dat wil zeggen dat als je een aanpassing doet in het model (bv. de naam van een blog post) en dat komt verschillende malen voor op de pagina (zichtbaar of onzichtbaar) zal die ene aanpassing zich automatisch overal propageren. Ik probeer het hier allemaal een beetje simpel te houden, er zit veel meer achter, maar dat is hetgeen direct opvalt eens je zo'n framework begint te gebruiken. Doordat de code ook proper gescheiden is kan je ook veel makkelijker unit en integrity testing gaan doen, waardoor je robustere webapps krijgt (iets wat zeker aan de clientside, maar nog veel te veel aan de serverside nooit of onvoldoende gedaan wordt).
Schematisch gezien doorloop je dus volgende stack:
Code:
server api <-> model (<-> route/controller <->) view
Ember is een goed voorbeeld om het verschil tussen een framework en een library te tonen. Ember doet gans het MVC verhaal: binding, data storage (via ember-data adapters bv.), templating, … Ember gebruikt voor het aanpassen van de DOM (het uittekenen van de pagina dus) echter gewoon jQuery. Ember zal dus jQuery gebruiken om deeltjes van de pagina te vervangen, AJAX calls naar de server te doen, styles op elementen te plaatsen etc. Ember gebruikt voor z'n View rendering laag dus jQuery.
Nu wil ook ook nog wel één groot misverstand uit de wereld helpen. Er wordt dikwijls gezegd dat jQuery code in vergelijking met een framework tot spaghetticode leidt. Dat hangt echter volledig af van de developer. Je kan perfect propere code juist met jQuery schrijven die veel van de functionaliteit van een framework bevat. De realiteit is echter dat veel "jQuery developers" gewoon ongeteste spaghetticode schrijven en een pak plugins (waarvan er ook een heel aantal van bedenkelijke kwaliteit zijn) met haken en ogen aan mekaar hangen en dan pochen over hoe fancy hun website of webapplicatie wel niet is. Met een framework ga je een bepaalde filosofie en methodiek hanteren die dergelijk fout gebruik ontmoedigt (maar daarom nog niet elimineert, slechte developers zullen slechte code blijven schrijven).
Moet je nu voor alles een framework gebruiken omdat het zogezegd zoveel beter is? Nee.
In sommige gevallen is het overkill of niet nuttig. Als je een website hebt waar je zowat alle serverside gaat renderen (een volledige pagina doorsturen dus) en enkel hier en daar wat interactiviteit erover wil sprenkelen, dan is een library op zich genoeg. Heb je een website die door search engines moet geïndexeerd worden of waar je uitgebreide serverside caching wil doen dan is een clientside framework ook niet de beste oplossing. Google werkt aan Javascript site crawling, maar momenteel ben je nog altijd aangewezen op behoorlijk complexe ingrepen aan de serverside om zoekmachines echte HTML aan te leveren.
Ben je echter bezig met een complexe en featurerich webapplicatie (let op het woord applicatie!) en maak je de keuze om aan de serverside enkel business logic en persistence te voorzien en te exposen via een API naar de client, die dan al de rest voor z'n rekening neemt, dan is een framework wel aan te raden. En dan is het gewoon kijken welke je het beste ligt en de beste oplossing is voor het soort app dat je wil ontwikkelen. Zoals op
de Discourse blog mooi gezegd wordt: hoe interactiever een applicatie wordt, hoe meer je van een clientside MVC framework zal profiteren.
Ik heb wel een aantal dingen wat eenvoudiger voorgesteld dan ze eigenlijk zijn, maar da's om het toch een beetje begrijpbaar te houden.
Je kan een mooie vergelijking zien tussen alle verschillende frameworks (dezelfde todo app) op
TodoMVC. Daar staat trouwens ook hoe je het zonder framework of zelfs zonder jQuery zou moeten doen.
Maar de beste manier om het te snappen is het gewoon te doen. Neem een klein idee, kies een framework, lees de "Getting Started" secties, zoek wat youtube filmkes op en begin eraan. Voor frontend development raad ik ook aan om
Yeoman (die direct ook
Grunt en
Bower zal installeren) te gebruiken. Da's echt wel iets dat je helpt om maintainable frontend code te krijgen.