Jakie są sprawdzone zalety narzędzi takich jak GWT w porównaniu z czystymi strukturami JavaScript?

11

GWT to stos oprogramowania, który tłumaczy kod Java i podzbiór biblioteki klas Java Runtime na kod JavaScript.

W porównaniu z zestawami narzędzi JavaScript, GWT może wydawać się alienujące, z natury i przy użyciu, i zbyt skomplikowane, aby robić nawet proste rzeczy, pozbawiając wiele drobiazgowej kontroli, którą miałbyś, używając bezpośrednio JavaScript.

Dlaczego twórca stron internetowych miałby używać takiego narzędzia, jak GWT, który używa języka pierwotnie nieprzeznaczonego dla sieci, zamiast używać czystych struktur JavaScript i skryptów JavaScript i zestawów narzędzi?

Czy jest to wymiernie lepsze i oparte na jakich kryteriach?

Sourav Majumder
źródło

Odpowiedzi:

27

Zawiera baterie

Narzędzia Java

To jest po prostu niesamowite:

  • IDE: nawet jeśli niektóre IDE obsługują JavaScript, poziom wsparcia po prostu się nie porównuje. Spróbuj refaktoryzować kod JavaScript na dużych bazach kodowych (powiedzmy 40K + LOC) i płacz.
  • Testy jednostkowe: chociaż podniosły się one w ciągu ostatnich kilku lat, są też o wiele bardziej dojrzałe w świecie Java.
  • Ciągła integracja i ciągła kontrola
  • Generowanie dokumentacji: Na pewno masz JSDoc i kilka innych

Pisanie statyczne

Wczesne wykrywanie błędów. (Adres Google Closure podam nieco, utrzymując programistę w świecie JavaScript, jeśli wolisz).

Zoptymalizowany JavaScript

GWT pisze szybszy i bardziej kompaktowy JavaScript niż ty (dla dużych aplikacji) i pozwala określić, co zostanie wysłane do klienta prawdopodobnie łatwiej niż w przypadku równoważnych pełnych rozwiązań JS.

Architektura

Zapewnia dobre rozdzielenie problemów w przypadku dużych aplikacji, z przyzwoitymi architekturami MVC lub MVP już upieczonymi na wyciągnięcie ręki.

Przyzwoita biblioteka

GWT zapewnia interesujące biblioteki i ułatwia (dobrze, łatwiej) tworzenie aplikacji obsługujących I18N z dynamicznym ładowaniem pakietów.

Testów jednostkowych

Korzystanie z JUnit z poziomu środowiska IDE Eclipse iz wiersza polecenia. Odnosi się to do mojej pierwszej kwestii. Równie dobrze możesz użyć niektórych narzędzi jakości kodu Java w projekcie GWT (do sprawdzania źródła, a nie sprawdzania kodu bajtowego, ponieważ nie ma żadnych).

To wszystko o tobie!!

GWT nie jest dla wszystkich. To sprawia, że ​​niektórzy ludzie są bardziej produktywni i daje dobre narzędzie dla programistów spoza JS do tworzenia profesjonalnych aplikacji internetowych z dynamicznymi interfejsami bez dotykania (za dużo) JavaScript. Ale jeśli to nie działa, po prostu użyj czegoś innego.

Jeśli chcesz większość z powyższych, ale po prostu nie chcesz Java, spójrz na Google Closure lub Dojo Toolkit .

Był wtedy dobrym pomysłem: historia ma znaczenie !!

Świat JavaScript (i ogólnie technologie front-endowe w Internecie) są obecnie bardzo aktywne, więc wszystko wygląda dobrze. Ale zaledwie kilka lat temu sprawy nie były tak jasne. LESS / SASS nie były tak popularne, jQuery nie było jeszcze de-fabryczną biblioteką JS, biblioteki JavaScript nie były odradzane co drugi tydzień, a narzędzia wcale nie były takie świetne.

Jednak już teraz rosło zapotrzebowanie na profesjonalne i duże aplikacje internetowe z dynamicznymi interfejsami, więc była luka do wypełnienia, aby zwiększyć produktywność programistów. JavaScript ma wiele pułapek i dziwactw, o których musisz wiedzieć, a może lepiej nie martwić się o nie. Stąd nisza dla narzędzi takich jak GWT.

Od tego czasu pojawiły się inne (przychodzi na myśl CoffeeScript, Dart jest w drodze, ale także duże frameworki JavaScript, rewolucja JS po stronie serwera z Node.JS i innymi oraz silny powrót JavaScript jako „wystarczająco dobrego” wszystkiego -okólny język używany nie tylko po stronie klienta, ale także w innych częściach stosu biznesowego.


Dodatkowe uwagi

W odniesieniu do twojego oryginalnego (teraz edytowanego) pytania o korzystanie z Firebug

Możesz oczywiście debugować kod GWT za pomocą Firebug, ale najlepiej debugować go bezpośrednio z debugera Eclipse IDE, który teraz zapewnia obsługę debugowania kodu na żywo.

Jednak Firebug jest nadal użyteczny, chociaż należy pamiętać, że GWT generuje zoptymalizowany i skompresowany JavaScript, który może nie być łatwy do debugowania w obecnej postaci.

W odniesieniu do twojego oryginalnego (teraz edytowanego) pytania o CSS

Tak, oczywiście nadal musisz sam napisać kod CSS. Łączysz swój projekt GWT z innymi narzędziami (takimi jak SASS), mniej lub bardziej łatwo.

To tylko narzędzie!

Nie myl GWT z tym, czym nie jest: nie piszesz kodu Java, który ma być uruchamiany bezpośrednio po stronie klienta jako bajtowy kod Java. Piszecie kod w języku Java, który jest następnie tłumaczony na JavaScript w celu zwiększenia wydajności i umożliwienia korzystania z języka wyższego poziomu (lub przynajmniej tak to powinno być postrzegane).

Prawdopodobnie Java i JavaScript można uznać za porównywalne pod względem poziomów abstrakcji. Jednak Java ma pewne zalety (wyszczególnione powyżej), stąd korzyść w czerpaniu korzyści z istniejących narzędzi bez konieczności ich ponownego pisania. Programiści Google wpadli na sprytny pomysł, aby umożliwić ponowne wykorzystanie istniejących narzędzi zorientowanych na Javę, ale w efekcie opracowanie aplikacji JavaScript.

Dodatkowo rozwiązują inny problem, którym były często kłopotliwe zarządzanie dwujęzycznymi aplikacjami internetowymi, w których JavaScript i kod Java były traktowane osobno. Zastosowanie GWT pozwala na pewien poziom konwergencji dla obu stron procesu rozwoju.


Dalsza lektura:

Haylem
źródło
„Prawdopodobnie Java i JavaScript można uznać za porównywalne pod względem ekspresji”. Żart? Równoważna funkcjonalność w Javie jest około 5 razy dłuższa.
kevin cline
@kevincline: zgadza się, nie chciałem pisać ekspresji, miałem na myśli poziomy poziomów abstrakcji. Dzięki za wykrycie go (jest 2 w
nocy
6
@kevincline: plus powiedziałem „sporny”, a zagorzali fanatycy jakiegoś języka lub innego argumentowali by cokolwiek :)
haylem
1
Oprócz elementów @ Halem wrzuciłbym OO oparte na prototypie JavaScript może być nieco dziwne dla kogoś pochodzącego z systemu klasowego, takiego jak Java. Spójność podejścia jest często przydatna.
Matthew Flynn
@MatthewFlynn: i vice-versa: dlatego programiści z czystego JS zdecydowanie trudniej są wsiąść do wagonu pasmowego GWT lub używać bardziej rozbudowanych frameworków, które replikują mniej więcej klasowy paradygmat OO.
haylem
6

Po latach spędzonych na opracowywaniu aplikacji internetowej w GWT uważam, że GWT ma tak poważne wady, że nigdy więcej jej nie użyję, jeśli nie będę do tego zmuszony.

Drzewo DOM

Chociaż wydajność JavaScript może być lepsza, renderowane drzewo DOM jest często niepotrzebnie złożone. Na przykład implementacja drzewa używa ponad 13 elementów DOM, w tym <tabela> dla każdego pojedynczego elementu. Korzystanie z dużych drzew (około 10000 pozycji) po prostu zamraża przeglądarkę. Drzewo czystego JavaScript / HTML / CSS było w stanie łatwo obsłużyć taką samą liczbę elementów.

Rozwój

Nie można pobić cyklu modyfikacji i próbowania źródła czystego JavaScript / HTML / CSS. Wystarczy zapisać plik źródłowy i odświeżyć stronę w przeglądarce. Jest to kluczowy czynnik w wydajności i GWT po prostu nie może konkurować nawet przy użyciu serwera kodu.

Debugowanie JavaScript jest absolutnie łatwe i przyjemne dzięki debuggerowi Chrome lub Firebug.

Hammer Experts

Pomysł używania Java do wszystkiego jest przeznaczony dla programistów, którzy są „ekspertami od młotków”. Są mistrzami młota, więc wszystko jest gwoździem. Myślę, że takie podejście jest bardzo błędne. Korzystanie z GWT wymaga również znajomości CSS i HTML. Bez tego programiści GWT często napotykają problemy, które są prawie niemożliwe do rozwiązania, podczas gdy ktoś z doświadczeniem HTML / CSS może wymyślić rozwiązanie. Jeśli programiści potrzebują tych kompetencji, mogą to ułatwić dzięki programowaniu w HTML.

Moim zdaniem większość zalet dostarczonych przez GWT jest co najmniej wątpliwa, podczas gdy wady są znacznie poważniejsze w porównaniu do rozwoju w czystym JavaScript / HTML / CSS.

Zsolt Sky
źródło
2

To nie jest wymiernie lepsze.
Do codziennego użytku weź pod uwagę jQuery , AmpleSDK lub kilka wypełniaczy HTML5 .

GWT ma wiele kosztów ogólnych: rzeczywistych i koncepcyjnych.

Może się przydać, jeśli masz aplikację Java lub kod Java po stronie serwera, aby przenieść go na interfejs WWW.

ZJR
źródło
Masz na myśli ClojureScript. Clojure sam w sobie oparty na LISP język skierowany do JVM. ClojureScript jest tym, który produkuje kod JS.
haylem
Tak, zresztą już to zredagowałem. Prostota.
ZJR
2

Kilka korzyści z używania GWT, o których myślę (więcej szczegółów przeczytaj mój blog http://www.pandurangpatil.com/2012/09/benefits-of-using-gwt.html )

  1. Ponieważ aplikacja kliencka GWT jest napisana w Javie, daje się możliwość wychwycenia błędów składniowych w czasie kompilacji z tego samego powodu (chociaż nie obsługuje wszystkich klas JRE, ponieważ te funkcje nie są obsługiwane przez same przeglądarki). Weźmy przykład, aby zrozumieć, co mówię. W przypadku błędnego wpisania nazwy zmiennej JavaScript przy użyciu czystej biblioteki JavaScript. Jedynym sposobem na złapanie takiego błędu jest uruchomienie aplikacji i przetestowanie pod kątem pożądanych wyników. Funkcje Java, takie jak Ogólne i Adnotacje, są w pełni wykorzystywane i można ich używać w aplikacji.

  2. Można skorzystać z istniejących dostępnych bibliotek lub napisać bibliotekę, aby z łatwością wygenerować kod zgodnie z wymaganiami, ponieważ kod, który należy wygenerować, musi znajdować się w Javie. Kompilator GWT zajmuje się jego kompilacją i konwersją na JavaScript.

  3. Zarządzanie kodem staje się łatwiejsze.

  4. Można po prostu napisać pewną wspólną logikę biznesową w taki sposób, aby można ją było zastosować w kodzie klienta GWT, a także w kodzie serwera, tak jak w Javie, np. Sprawdzanie poprawności danych lub niektórych typowych funkcji narzędziowych.

  5. Za pomocą wtyczki GWT eclipse można łatwo debugować kod klienta w Javie dla logiki biznesowej.

  6. Gdy kompilator GWT kompiluje kod Java klienta i generuje z niego JavaScript. Którego potrzebujesz wdrożyć na swoim serwerze, a na żądanie jest obsługiwany i uruchamiany w przeglądarce użytkownika. Podczas generowania tego JavaScript dokona pewnych optymalizacji.

    • Podczas generowania JavaScript nie bierze pod uwagę martwego kodu, kiedy mówię martwy kod, mam na myśli „kod, który istnieje, ale nie jest wywoływany z głównego przepływu”. To z kolei zmniejsza efektywny rozmiar końcowego kodu JavaScript.

    • Dba o zaciemnienie wygenerowanego kodu JavaScript.

    • Dokonuje minimalizacji wygenerowanego kodu JavaScript.

    • A co ważniejsze, wygeneruje on osobno zoptymalizowany kod specyficzny dla przeglądarki. Kiedy mówię osobno, wygeneruje oddzielny JavaScript specyficzny dla przeglądarki, który będzie obsługiwany, gdy odpowiednie żądanie zostanie otrzymane z danej przeglądarki. To z kolei zmniejsza rozmiar kodu JavaScript, który jest pobierany dla określonej przeglądarki, ponieważ nie zawiera całej obsługi specyficznej dla przeglądarki w jednym kodzie.

  7. Jeśli piszesz swoją aplikację dla różnych języków, tj. Angielskiego, hindi, marathi itp., Korzystając z funkcji internacjonalizacji GWT. Podczas generowania kodu JavaScript tworzy kopię dla każdego języka i kombinacji przeglądarki. Co sprawia, że ​​wygenerowany kod JavaScript dla danej kombinacji języka i przeglądarki jest najbardziej optymalny i mały.

  8. W przypadku potrzeby użycia bezpośredniego JavaScript, który można wywołać z kodu Java GWT, można to zrobić za pomocą JSNI (JavaScript Native Interface). Można nawet oddzwonić do kodu Java GWT z JavaSctipt.

  9. Jeśli chcesz ustawić strony z zakładkami, możesz skorzystać z funkcji Historia GWT.

  10. Jeśli chcesz używać JSON jako formatu danych do komunikacji i manipulacji, ma on bardzo dobrą funkcję o nazwie Typy nakładek JavaScript.

  11. Funkcja odroczonego wiązania GWT jest dobrą funkcją, którą, jak sądzę, można zapewnić dzięki Javie.

  12. Możesz zbudować interfejs użytkownika, korzystając z dostępnych widżetów GWT w stylu Java Swing. Możesz nawet bardzo łatwo tworzyć niestandardowe widżety.

  13. Jeśli chcesz zbudować interfejs użytkownika (strony internetowe) w czystym stylu HTML, możesz skorzystać z funkcji deklaratywnego interfejsu użytkownika GWT. Które uważam za jedną z głównych cech GWT. Co ułatwia programistom tworzenie stron w czystym stylu HTML. Wydaje mi się, że jest łatwiejsze do utrzymania niż kodowanie w stylu Swing. Co najważniejsze, nadal możesz mieć swoją logikę w Javie, a tylko część prezentacji w czystym HTML. (Uwaga: jakąkolwiek metodę użyjesz (deklaratywny interfejs użytkownika lub styl Swing) ostatecznie będzie to tylko HTML, ale to, co robi różnicę, to sposób, w jaki ją kodujesz i utrzymujesz).

  14. Funkcja pakietu klienta GWT ułatwia zarządzanie innymi zasobami internetowymi, takimi jak css, obrazy i inna zawartość tekstowa.

    • Zasoby CSS umożliwiają logikę warunkową w twoim css. Możesz również uzyskać dostęp do niektórych wartości dynamicznych z kodu Java po stronie klienta GWT.
    • Zajmie się także zaciemnianiem twoich klas css. Co najważniejsze, GWT ma zautomatyzowane generowanie interfejsów z plików css w celu użycia klas css.
    • Zasób obrazu ułatwia programistom korzystanie z obrazów w aplikacji w bardzo łatwy do utrzymania sposób. Kiedy mówię łatwo, mam na myśli, że kiedy chcesz używać obrazów w kodzie GWT Java zamiast używać zakodowanego adresu URL, możesz użyć zasobu obrazu. Korzyścią, jaką otrzymasz za pomocą zasobu obrazu, jest to, że jeśli zamierzasz zmienić lokalizację lub użyć innego obrazu o innej nazwie, wystarczy zmienić go w jednym miejscu. Ważniejszą cechą zasobu obrazu jest użycie go z zasobem CSS jako duszka. Zadba o to, aby ten obraz był zapisany w postaci danych URI w wierszu danych lub używał go z ikoną. Nie twierdzę, że nie da się tego zrobić za pomocą innych frameworków, ważniejsze jest to, jak szybko i łatwo można to zrobić. GWT ułatwia ci to zadanie.
    • Zasób danych dodaje optymalizację dla plików danych, takich jak .pdf, aby zmienić nazwy tych plików na podstawie ich zawartości, aby była silnie buforowana przez przeglądarkę. Małe pliki danych można konwertować na wbudowane dane uri.
    • Korzystając z Pakietu klienta dla innych zasobów sieciowych i jeśli odpowiednio ustrukturyzujesz swoją aplikację na różne moduły. Może stać się modułem wielokrotnego użytku jako całość z każdym zasobem. O co chodzi z modułami wielokrotnego użytku? cóż, jeśli używasz obrazów przy użyciu bezpośredniego adresu URL w jakimś module. A jeśli umieścisz ten moduł w innym module i spróbujesz użyć komponentów utworzonych w tym module, nadal będziesz musiał skopiować te obrazy na publiczny adres URL ostatecznej aplikacji. Nie musisz tego robić, jeśli używasz tych obrazów jako zasobów graficznych.
    • Inną optymalizację można osiągnąć, tworząc małe moduły za pomocą pakietu klienta dla css i obrazów. Gdzie możesz wybrać, aby dołączyć tylko wymagane moduły do ​​swoich końcowych modułów. Różnica sprawi, że będzie to końcowy kod JavaScript modułu, a inne zasoby będą zawierać tylko wymaganą zawartość, a nie całą zawartość, nawet jeśli chcesz użyć małego fragmentu modułu.
  15. Widżety komórkowe: Aby zaprezentować paginowane zbieranie danych, GWT posiada Widżety komórkowe. Istnieją widżety, takie jak CellTable, CellList, CellTree i CellBrowser.

    • CellTable służy do prezentacji danych w formacie tabeli paginowanej, ma funkcję, w której można zmienić zawartość danej komórki w miejscu. Obsługuje paginację zarówno po stronie klienta, jak i serwera, obsługuje sortowanie według kolumny, a także obsługuje wybór jednego lub wielu rekordów i generowanie zdarzeń dla tego samego.
    • CellList może służyć do prezentacji danych w formacie listy, a elementy mogą być wyświetlane w formacie niestandardowym. Obsługuje także paginację po stronie klienta i serwera oraz wybór jednego lub wielu rekordów i generuje zdarzenia do wyboru. CellTree i CellBrowser mogą być używane do prezentacji danych w formacie drzewa.
  16. Komunikacja z serwerem z kodu klienta GWT. Obsługuje wiele sposobów implementacji komunikacji klient-serwer.

    • Jeśli nie obawiasz się protokołu używanego do przesyłania danych, to mechanizm GWT RPC. Bardzo łatwo jest zintegrować kod po stronie klienta do przesyłania danych z serwerem. Możesz zdefiniować niestandardowe DTO (obiekt przesyłania danych) w kodzie klienta, którego można nawet użyć w kodzie po stronie serwera. Implementacja po stronie serwera akceptuje te same DTO jako parametr lub wartość zwracaną. Wszystko inne jest obsługiwane przez ramkę GWT RPC. Nawet propaguje wyjątki zgłaszane z kodu po stronie serwera do dzwoniącego w kodzie po stronie klienta (pod warunkiem, że musisz zdefiniować te klasy wyjątków w pakiecie kodu po stronie klienta. GWT RPC wewnętrznie wykorzystuje połączenia AJAX z własnym niestandardowym protokołem do przesyłania danych.

    • Jeśli nie chcesz używać GWT RPC, możesz wykonywać wywołania serwera AJAX w celu pobierania danych z serwera za pomocą Kreatora żądań. Co jest również znacznie łatwiejsze do wdrożenia. Ma również ciekawą funkcję Fabryka zapytań. Dzięki tej funkcji możesz ustawić swoją DAO lub warstwę usługową na wywołanie z kodu klienta. Aby to zrobić, musisz zdefiniować kilka zestawów interfejsów dla swojej usługi i niestandardowych typów danych. Za pomocą tych interfejsów można uzyskać dostęp do tych usług z kodu klienta. Napisałem wtyczkę maven do wygenerowania tych interfejsów. Jeśli adnotujesz swoją warstwę DAO za pomocą niektórych wymaganych adnotacji, zapoznaj się ( https://github.com/pandurangpatil/gwt-mvn-helper) zapoznaj się z modułem mvn-helper-test w celu użycia. Fabryka żądań jest bardziej ukierunkowana na integrację z warstwą ORM, taką jak JDO lub JPA na serwerze. Ma obsługę wywoływania stałego na danym obiekcie z kodu klienta. I najważniejsze, gdy wywołasz metodę persist, oblicza i wysyła tylko zmiany (delta) do serwera, aby zapisać.

    • Jeśli chcesz wykonać połączenie JSONP między domenami, możesz zrobić to samo.

Pandurang Patil
źródło