Patrząc na kod JavaScript, który zawsze piszę pod określony projekt, doszedłem do wniosku że na pewno da się to lepiej zrobić albo chociażby to ustrukturyzować lepiej niż do tej pory:

sample-js-app

Jak tak zacząłem się zastanawiać jak to można by lepiej zrobić zacząłem powoli dochodzić do struktury która zbliżała się bardzo do Backbone jak i Spine.

Jednak Spine i Backbone są do siebie bardzo podobne – Spine API bazuje na API backbone. Różnica jest w czasie istnienia projektów – Spine jest dość nowy, nie ma zbyt silnego community a po przeczytaniu książki JavaScript Web Applications, w której autor tworzy Spine stwierdziłem, że nie ma po co go w ogóle dotykać – jakoś nie mam dobrej opinii o książce, tym bardziej nie chciałem próbować biblioteki wytworzonej przez autora (nawet jeżeli okaże się ona później wielkim sukcesem).

Zaś za Backbone przemawia chociażby Trello – aplikacja, wykorzystująca Backbone w real world. Więcej info o tym tutaj.

W tym samym czasie kiedy zrezygnowałem ze Spine, przypomniałem sobie o Knockout – library autora chyba najlepszych książek odnośnie ASP.NET MVC Stevena Sandersona. Już kiedyś jej próbowałem, ale z powodu braku dokumentacji/przykładów/community i problemów na które natrafiłem zrezygnowałem z Knockout. Nadszedł więc czas by znów coś z tym zrobić/spróbować.

W zeszłym tygodniu skoncentrowałem się na napisaniu tego samego przykładu kodu w Backbone jak i w Knockout by sprawdzić czy mi odpowiada API, czy wszystko co chcę da się zrobić itp. Itd. Jako przykład wziąłem dosłownie fragment aplikacji, którą muszę teraz napisać.

Mól plan był prosty: porównać dwie biblioteki, napisać mały post i powiedzieć wybrałem X ze względu na A,B i C.

Wynik jednak jest zupełnie inny. W knockout zaciąłem się mniej więcej na 1 dzień nie wiedząc jak coś zrobić z dostępnymi bindigami, tak by to było chociażby czytelne dla więcej niż jednej osoby. Próbowałem szukać przykładów gdzie Knockout jest wykorzystywany – jakaś aplikacja? Jak ludzie to robią z MVC by nie powtarzać kodu z ASP.NET MVC? Nie licząc kilku(nastu) przykładów jak „ja to robię” z MVC nie znalazłem nic ciekawego – przykłady dla banalnie prostych aplikacji były ciekawe, unobtrusive binding, undo itp. Jednak żadnego real world example (nawet na liście dyskusyjnej)– jedynie strona knockout pokazuje, że można coś takiego zrobić. Serio, jak na bibliotekę to brak jakichkolwiek Best Practices czy nawet real world examples.

W którymś momencie by móc pracować z Knockout przerzuciłem się na JSFiddle bo VS 2010 nie umożliwia takiego rozkładu okien (nie można mieć dwóch rozdzielonych na prawo i lewo i jednego na dole, nie da rady.

Dlaczego na JSFiddle? Dlatego, że inaczej skakanie po plikach zaczynało być drażniące. Moja aplikacja JS wymagała odpowiednich bindingów po stronie HTML, odpowiedniego kodu po stronie JS oraz odpowiednich klas po stronie CSS. Praca tak naprawdę cały czas na 3 oknach.

W Backbone zaś spędziłem ekstra dzień na robieniu manual bindingiu a następnie na beznadziejnych próbach spamiętania nazwy własności przy robieniu model.get(‘prop_name’); — no już bez przesady!

I mniej więcej w tym właśnie czasie natrafiłem na post Roba Conery który robi właśnie porównanie Backbone i Knockout.

Post ten dosłownie trafia w sedno. Nic dodać nic ująć. Nie ma co się już bardziej rozpisywać. Jeżeli się zastanawiacie nad tym czy wybrać Knockout czy Backbone, przeczytajcie to co Rob ma do powiedzenia.

Ja nie mam czasu by dalej bawić się Backbone zaś Knockout po raz kolejny dał d#$py w moim przypadku. A tak fajnie się zapowiadał dla prostych przykładów :(

Na końcu cytat który znalazłem a idealnie oddaje IMO knockout:

I think KO could be huge if it presents itself as a client side framework, instead of presenting as a nifty toy.