Aplikacje przeglądarkowe i desktopowe tworzy się i działają inaczej, jeden sposób ani nie jest lepszy ani gorszy.
Sam nieraz tworzę sobie różne aplikacje jednego i drugiego typu, te bardziej udane wrzucam na swój GitHub.
Główną zaletą jest wieloplatformowość z natury, tą samą aplikację można uruchomić i na komputerze i na telefonie.
Jednak tworzenie takiej aplikacji przypomina trochę programowanie dla DOS, czylu pusty ekran tekstowy lub graficzny bez żadnego menedżera interfejsu. W przypadku aplikacji desktopowej, system operacyjny zapewnia okienka, kontrolki w określonym stylu kolorystycznym. W aplikacji przeglądarkowej styl kolorystyczny i czcionki można ogarnąć za pomocą CSS, ale zawsze zaczyna się od pustej strony. Jeżeli ma się pomysł, żeby aplikacja miała wiele okien wyświetlanych obok siebie, to w aplikacji desktopowej nie ma żadnego problemu, natomiast w przeglądarkowej takiego czegoś nie ma, da się zrobić wyskakujące okienka w DIV, ale co aplikacja to trzeba to tworzyć od początku, oprogramować przeciąganie myszki, pasek tytułu. Można to też rozłożyć na kilka zakładek lub okien samej preglądarki, ale to też trzeba to samemu obsłużyć.
Standardowe czcionki i style są po prostu brzydkie, Zwykła czarna czcionka na białym tle, to nie pasuje do stylów współczesnych OS, a z drugiej strony nie ma możliwości, żeby aplikacja przeglądarkowa przyjęła styl OS (czcionki, kolory, odstępy). W przypadku layoutu to trzeba się pomęczyć z div. Często szybciej i łatwiej użyć table/tr/td, ale jest to uważane za nieprawidłowy sposób, pomimo, że pozwala uzyskać zamierzony efekt.
Sam proces programowania przeglądarkowej aplikacji jest trudniejszy. Do desktopu czy konsoli jest duzo języków, w większości ze statycznym typowaniem, co znacznie ułatwia programowanie, współczesne IDE potrafią same wyświetlić metody dostępne dla danej zmiennej, które zależą od typu. W aplikacji przeglądarkowej jest tak naprawdę używany jeden język, jakim jest JavaScript. On jest niestety dynamicznie typowany, czyli ta sama zmienna raz może być liczbą, a raz napisem, również deklarowanie zmiennej nie jest obowiązkowe, a możliwe jest wielokrotne deklarowanie, to prowadzi do trudnych do wychwycenia błędów. Kolejna sprawa jest taka, że JavaScript ma tylko jeden typ liczbowy i to zmiennoprzecinkowy. W wielu przypadkach to się sprawdza, ale to odbija się na wydajności, a także może prowadzić do błędów. Dodatkowo, z powodu dynamiczności typów, nie ma możliwości, żeby IDE do JavaScript po napisaniu zmiennej umiał podać, jaki to jest typ zmiennej i jakie ma metody lub pola, bo nie wiadomo, czy w danym momencie będzie to tekst, czy taki obiekt, czy inny obiekt.
Jakiś czas temu napisałem w C++ aplikację wyświetlającą spectrogram w czasie rzeczywistym. Później napisałem identyczną aplikację w HTML5/JavaScript i wydajnościowo nie udało mi się dorównać wersji w C++, Udało się uzyskać może góra 30% wydajności.
Kolejną sprawą jest obsługa plików binarnych. W desktopie nie ma z tym żadnego problemu, natomiast w JavaScript trzeba się namęczyc. Można plik jakoś zaczytać do bloba, wyciągnąć bajty, ale one będą albo jako napis (tekst), albo jako ciąg liczb, więc abo dane będą nieprawidłowe, albo wydajność będzie słaba. Nawet z plikami tekstowymi też jest trochę zachodu, choćby zwykłe zaczytanie pliku .txt do zmiennej tekstowej, albo odczyt tekstu linia po linii. W C# to nie problem, a w JS trzeba się gimnastykować, chociaż jest to teoretycznie możliwe. Dobrym przykładem jest Unicode. Nazwy znaków są wyciągane z plików tekstowych udostepnianych przez konsorcium Unicode. Aby z nich skorzystać, musiałem utworzyć konwerter tekstu z tych plików na pliki JS zawierające funkcję wypełniającą jakąś tabelę. Sam konwerter też już mam w JavaScript, ale on nie potrafi zaczytać i zapisać pliku, tylko do jednego pol wkleja się tekst z pliku TXT, a skonwertowany tekst trafia do drugiego pola.
Mam też aplikację emulującą mikrokomputer oparty na Z80. W C++ czy C# to nie problem. Nieraz myślałem, żeby przerobić to na JavaScript, aby móc uruchomić w telefonie i zapomnieć o wersji w C++, ale obawiam się, że wydajnościowo nie dorównam (będzie dużo gorzej), a dodatkowo musiałbym całkowicie inaczej podejść do plików konfiguracyjnych.
Co ciekawe, kiedyś były próby uruchamiania aplikacji destkopowych przeglądarkach. Czytałem o GTK+ w HTML5, ale na zapowiedziach się kończyło. Do Javy istnieje AjaxSwing, którego kiedyś instalowałm i całkiem nieźle działał z wcześniej napisaną desktopową aplikacją w Javie, ale na szerszą skalę takie rozwiązanie jakoś nie przyjęło się. A jest to o tyle super, bo ma się jeden kod źródłowy i ten sam program może funkcjonować i w desktopie i w webie w zależności od potrzeby.