Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
[javascript] Tacomini
Nadszedł najwyższy czas na przedstawienie mojego rozwiązania “konkurującego” z Taconite (wpis na moim blogu).
Naszym głównym celem jest możliwość przejrzystego i łatwego wykonywania funkcji JavaScript ze “strony serwera” (czyli automatyczne wykonywanie funkcji JavaScript na podstawie wykonanego żądania Ajax - wzorując się na Taconite). Dodatkowo chcemy otrzymać elastyczne rozwiązanie, które umożliwiałoby nam doklejanie informacji do ostatecznej odpowiedzi na żądanie (w przypadku formatu XML jest to bardzo utrudnione) - opcja ta jest bardzo przydatna, gdy dane żądanie składa się z wykonania kilku akcji (na przykład aktualizujemy zarówno treść główną jak i menu), wtedy każda z nich generuje swoją odpowiedź niezależnie od innych akcji.
Przejdźmy więc do mojego rozwiązania.
Generowanie widoku.
Wykonanie akcji w JavaScript w widoku oznaczam przez wyrażenie:
#tn action="nazwa_metody_js" params="parametry_json" tn# kod_html
gdzie: nazwa_metody_js - nazwa metody JavaScript która ma być wykonana po stronie klienta, parametry_json - parametry metody w formacie json, kod_html - kod HTML, który również zostanie przekazany metodzie jako parametr.
Jeżeli korzystamy z systemu Zend Framework można stworzyć helper widoku (tak też uczyniłem), który generuje nam kod Tacomini (czyli #tn … tn#), tylko wtedy gdy żądanie jest typu Ajax. Dzięki temu widok może być wykorzystywany zarówno przy żądaniach zwykłych jak i Ajaxowych.
Po stronie klienta.
W opisywanym rozwiązaniu założyłem, iż możemy wykonywać tylko metody stworzone przeze mnie. Do tego też celu stworzyłem klasę TacominiMethods. Zawiera ona wszystkie metody, których nazwy możemy podać w kodzie widoku (parametr action). Na przykład:
-
var TacominiMethods = {
-
loginProcess: function(html, params) {
-
// tutaj kod metody
-
}
-
}
Jak łatwo się domyślić parametry przykładowej metody to odpowiednio kod_html i parametry_json, które zostały podane w kodzie widoku.
Z racji, iż Tacomini nie parsuje automatycznie wyników zwracanych przez żądania Ajax (jak to czynił Taconite), odpowiednie sparsowanie i wykonanie musimy obsłużyć sami, w takiej postaci:
-
$.get(‘adres_url’, function(text) {
-
Tacomini.parse(text).run();
-
);
Oczywiście zalecane jest stworzenie w JavaScript metody pomocniczej, która automatycznie parsowałaby wynik żądania.
Przykład:
-
// Tworzymy metode w JavaScript
-
var TacominiMethods = {
-
showMessage: function(html, params) {
-
if(!!params.isError) {
-
html = "ERROR: " + html;
-
}
-
alert(html);
-
}
-
}
-
// Wywolanie
-
$.get(‘/showmessage/’, function(text) {
-
Tacomini.parse(text).run();
-
);
-
// HTML generowany przez url /showmessage/
-
#tn action="showMessage" params="{’isError’: ‘1′}" tn#
-
Informacja wyświetlona za pomocą Tacomini!
-
-
// Wynikiem, będzie alert o treści
-
// "ERROR: Informacja wyświetlona za pomocą Tacomini!"
Podsumowanie :
Plusy:
- liniowe budowanie odpowiedzi, to znaczy, iż odpowiedź może być budowana z kilku akcji kolejno do siebie przekierowywanych, każda z nich generuje tylko swoją część
- umożliwia uruchomienie zarówno metod jQuery (jak Taconite) jak również własnych metod
- ładny podział funkcjonalności na metody w JavaScript (najczęściej jedna metoda JavaScript odpowiada jednej akcji)
- prosty w użyciu
- elastyczny
Minusy:
- nie wszystkim zapewne spodoba się format odpowiedzi
- trzeba pisać kod w JavaScript (przy większych aplikacjach, jednak i tak jest to konieczne)
Zastanawiacie się zapewne jak wygląda wydajność takiego rozwiązania. Ze wstępnej analizy parsowania odpowiedzi żądania można wnioskować, iż nie jest źle: HTML wielkości 50-60KB został sparsowany (nie mylić z wykonaniem) w 250ms, natomiast 16KB w 32ms. W obu przypadkach odpowiedź zawierała 4 kody Tacomini (czyli do wykonania były 4 metody).
Komentarze: 3 to “[javascript] Tacomini”
Napisz komentarz
Na początku byłem sceptycznie nastawiony do tego rozwiązania, jednak po zastosowaniu w praktyce, okazało się to bardzo wygodne.
Na pewno tacomini jest lepsze od taconite.
Moje uwagi, sugestie:
- lepiej zorganizować (np w kontrolery) wywoływane metody js (showMessage itd)
- aby wyeliminować narzut związany z parsowaniem, niech odpowiedz będzie w formacie json (pod warunkiem, że można w zmiennych json umieszczać kod html):
[{method:showMessage,parasm: {}, text: hubert},{method:updateMenu,parasm: {key:14}, text: }]
- z organizacją wywoływanych metod się zgadzam (zreszta tak sam robie - podział na moduły), nie wspomniałem jednak o tym dla prostoty opisu
- format JSON w połączeniu z HTMLem byłby dobrym pomysłem gdyby HTMLa było mało.. ciężko mi powiedzieć jak się zachowa przy większych stronach, tym bardziej, że na zwróconym wyniku wykonuje się eval() Z drugiej strony samo parsowanie nie zajmuje dużo czasu.
PS. Dzięki za słowa poparcia
[...] Taconite. Szczegóły dotyczące tacomini można znaleźć na blogu autora wtyczki pod adresem: http://webprogramming.pl/2008/javascript-tacomini/ Category: Język JavaScript, jQuery [...]