2011-07-30 13 views
10

Mam obecnie do czynienia z dość trudnym problemem związanym z układami kodów GWT i miałem nadzieję na jakąś pomoc.Best GWT CodeSplitting projekt do enkapsulacji "modułów"

Obecnie pracuję nad dużą starszą aplikacją GWT (dni pre-MVP) i szukam kodu dzielenia tej aplikacji na moduły "portletów" (to, co nazywamy różnymi złożonymi widżetami, które budujemy nasze strony z) są częścią.

Obecnie nasze moduły są właśnie identyfikowane przez pakiet, w który portlet wchodzi, ale jestem otwarty na zmianę tego, aby lepiej pasował do generycznego brzmienia konstrukcji kodu.

Wszelkie pomysły na temat tego, jak zaprojektować ten kod, aby wskazać, że portlet/kompozyt należy do określonego "modułu", a następnie podzielić kod tak, aby po raz pierwszy załadowany został dowolny portlet/kompozyt w module X, całość moduł X jest załadowany?

Dzięki

+0

Nadal masz problemy?+1 dla motywacji :) –

+0

haha ​​nie miał czasu na zaglądanie, ponieważ opuściłeś @Nico, ale wkrótce nadejdzie, więc myślałem, że zadam to pytanie tak długo :) – brent777

Odpowiedz

1

Hmm ... normalnie, to całkiem proste, ale myślę, że nie jest twój prawdziwy problem ...

Wystarczy użyć tego:

GWT.runAsync(new RunAsyncCallback() { 
    public void onFailure(Throwable reason) { 
     ... 
    } 
    public void onSuccess() { 
     ... 
    } 
}); 

Wszystko w sposobie onSuccess będzie następnie podzielić go na inny plik javascript, który zostanie załadowany na żądanie.

Jeśli chcesz oddzielić kompozyty od reszty kodu, po prostu umieść kompozycję w tej metodzie onSuccess.

Można również zagnieździć metody GWT.runAsync, aby można było ponownie podzielić część w różnych częściach, np. pierwszy moduł ładujący GWT.runAsync ładuje X, w konstruktorze modułu X można wykonać kolejną funkcję runAsync, która następnie ładuje kompozycję.

Z tego powodu, mogą występować pewne zależności między częścią, która utrudnia kompilatorowi podział, ale przetestowałem go z jednym z moich projektów (około 40k linii kodu) i działał jak czar.

+1

dzięki za odpowiedź, ale wiem jak używać szukałem więcej schematu projektowego, który posłużyłby do podziału całych modułów bez dodawania asynchronicznego wywołania zwrotnego dla każdego kompozytu (w zasadzie odmiana wzorców opublikowanych przez zespół GWT). – brent777

0

Packagaing ma niewiele wspólnego z dzieleniem kodu, głównym czynnikiem, który sprawia, że ​​dzielenie kodu działa, jest małe splątanie spaghetti pomiędzy klasami. Jeśli jedna klasa wymaga innej i tak dalej, w której ostatecznie osiąga i chwyta wszystkie klasy, to dzielenie kodu może bardzo dobrze rozłożyć na wiele, ponieważ sam akt wymagania pierwszego oznacza, że ​​wszystko jest wymagane. Jeśli oddzielisz swoje obawy od luźnego sprzężenia, powinieneś mieć coś, co dobrze nadaje się do rozszczepienia.

+1

dzięki za odpowiedź, ale już wiem wszystkiego, o czym wspomniałeś. Jak już wspomniałem w swoim pytaniu, obecnie nasze moduły są podzielone wyłącznie według pakietu, ale jestem otwarty na to, aby to zmienić (ponieważ wiem, że nie ma to nic wspólnego z układami kodów). To, o co pytam, to sposób grupowania wielu kompozytów w "moduł" po stronie klienta i zdobycia jakiejś klasy "managera", która jest wystarczająco inteligentna, aby załadować cały moduł, gdy używany jest dowolny kompozyt z tego modułu. Chcę uniknąć zapisywania asynchronicznych wywołań zwrotnych dla każdego kompozytu. – brent777

0

Jak korzystać z GWTP - jest to dobra struktura MVP i zapewnia automatyczne dzielenie kodu. Konieczne będzie zreorganizowanie bazy kodu w celu użycia rzutnika/widoku dla każdego z modułów, które chcesz podzielić. Następnie dodając codesplitting jest tak proste jak dodanie następujących linii do prezentera:

@ProxyCodeSplit 
@NameToken("firstpage") 
public interface MyProxy extends ProxyPlace<FirstPagePresenter> {} 

GWTP posiada również wtyczki Eclipse, który generuje większość kodu boilerplate.

+0

Żałuję, że nie możemy tego zrobić, niestety nasz system jest dość "od dawna w ząb" i jest mocno powiązany z architekturą open-source, którą napisał jeden z naszych byłych architektów zwany gwt-portletami. Jest to ogromny system, który wymagałby więcej czasu niż obecnie, aby przekształcić się w projekt typu MVP. Zajrzę do tego jednak i jeśli okaże się to wykonalne dla nas, to przyjmę twoją odpowiedź. – brent777

+0

Nie musisz przekształcać całej bazy kodu w MVP, tylko kontenery najwyższego poziomu. Załóżmy, że Twoja aplikacja jest podzielona na pięć różnych sekcji. Będziesz mieć prezentera/widok najwyższego poziomu, zawierający 5 sekcji, z których każda jest refaktoryzowana jako prezenter/widok. Każda sekcja może nadal zawierać portlety gwt, nie trzeba także modyfikować portletów, aby skorzystać z dzielenia kodu. –

+0

mmmm .... to może nam pomóc, poświęcę trochę czasu na zrobienie dowodu koncepcji opartego na tym projekcie i jeśli to się uda, przyjmuję twoją odpowiedź. Bardzo dziękuję za sugestię. – brent777