Dlaczego JSX jest dobry, gdy skrypty JSP są złe?


21

React.js zapewnia JSX jako składnię podobną do XHTML do konstruowania drzewa komponentów i elementów. JSX kompiluje się w Javascripcie, a zamiast dostarczania pętli lub warunków w JSX, używasz Javascript bezpośrednio:

<ul>
  {list.map((item) =>
    <li>{item}</li>
  )}
</ul>

Nie byłem jeszcze w stanie wyjaśnić, dlaczego uważa się to za dobre, jeśli analogiczne konstrukcje są uważane za złe w JSP?

Coś takiego w JSP

<ul>
   <% for (item in list) { %>
     <li>${item}</li>
   <% } %>
</ul>

uważa się za problem z czytelnością, który należy rozwiązać za pomocą tagów takich jak <c:forEach>. Rozumowanie za tagami JSTL również wydaje się mieć zastosowanie do JSX:

  • jest trochę łatwiejszy do odczytania, gdy nie przełączasz się między składnią podobną do XHTML (nawiasy kątowe, zagnieżdżanie) i Java / JavaScript (curlies, przecinki, parens)
  • kiedy masz do dyspozycji pełny język i platformę do użycia w funkcji renderowania, nie musisz już zniechęcać do wprowadzania logiki, która tam nie należy.

Jedyne powody, dla których mogę wymyślić, dlaczego JSX jest inny, to:

  • w Javie miałeś motywację do zrobienia czegoś złego - JSP zostałby ponownie załadowany na gorąco, więc kuszenie było umieszczenie kodu w JSP, aby uniknąć cyklu odbudowywania / restartowania. Utrzymanie poświęcono dla natychmiastowej produktywności. Usunięcie skryptletów i ograniczenie do ustalonego zestawu konstrukcji szablonów było skutecznym sposobem na wymuszenie łatwości konserwacji. W świecie JS nie ma takich zniekształceń.

  • Składnia JSP i Java jest nieporęczna, ponieważ <% ... %>pozwala odróżnić kod Java od generowania elementów, a natywna składnia Java nie ma foreachkoncepcji ani funkcji pierwszej klasy (do niedawna). Kara składniowa za używanie natywnego Javascript dla pętli i instrukcji warunkowych w JSX jest niezerowa (moim zdaniem), ale nie tak zła jak JSP i prawdopodobnie niewystarczająca, aby uzasadnić wprowadzenie elementów specyficznych dla JSX dla pętli i instrukcji warunkowych.

Czy brakuje mi czegoś jeszcze?


1
Nie sądzę, że źle jest mieć pętle w JSP per se, problem polega na osadzaniu kodu w tagach skryptletów. Jeśli je wyrzucisz i użyjesz JSTL, będziesz zmuszony uprościć swoje strony JSP. Ponadto, jak zauważyłeś, dodatkową zaletą jest to, że składnia JSTL jest nieco mniej zgrzytliwa niż składnia skryptletów. Chociaż nie jestem zaznajomiony z JSX, domyślam się, że prawdopodobnie możesz nadużywać fragmentów JSX z dużą ilością skomplikowanej logiki, która nie byłaby zalecana, ale której nie zapobiegnie.
PhilDin

Odpowiedzi:


11

Przede wszystkim ludzie, którzy stworzyli JSX, nie zgadzali się z ludźmi, którzy nie lubili JSP. Zobacz ich dyskusję tutaj: Dlaczego stworzyliśmy React? a także Wyświetlanie danych

Szablony oparte są na pomyśle stworzenia podziału między logiką a prezentacją strony. Zgodnie z tą teorią, twój kod javascript (lub java) nie powinien przejmować się tym, co wyświetla kod, a twój kod nie powinien dotyczyć żadnej logiki. Podział ten jest zasadniczo powodem, dla którego ludzie krytykują różne języki szablonów, które z łatwością pozwalały na mieszanie kodu z szablonem (PHP / JSP / ASP).

React opiera się na komponentach. Autorzy reakcji twierdzą, że logika i prezentacja komponentu są ze sobą ściśle powiązane, a próba ich podziału nie ma żadnego sensu. Zamiast tego stronę należy podzielić na logiczne elementy. Możesz więc podzielić pasek nagłówka, komentarze, posty, powiązane pytania itp. Na osobne elementy. Ale próba podzielenia logiki powiązanych pytań z prezentacji nie ma sensu.

Podstawowa różnica między czymś takim jak JSX a czymś takim jak JSP polega na tym, że JSP to język szablonów, który zawiera trochę java dla logiki. JSX to javascript z rozszerzeniem składni, aby ułatwić konstruowanie fragmentów HTML. Nacisk jest inny. Ponieważ JSX przyjmuje to podejście, w rezultacie uzyskuje się ładniejsze, czystsze podejście niż JSP lub przyjaciele.

Ale ostatecznie sprowadza się to do tego, że ludzie, którzy zareagowali, nie lubili szablonów. Uważają, że to zły pomysł i że powinieneś umieścić logikę znaczników i prezentacji w tym samym miejscu.


Nie narzekam na enkapsulację renderfunkcji w tym samym miejscu, co inne elementy logiki. Jestem ściśle zainteresowany czytelnością mieszania generowania elementów z innymi rodzajami kodu.
wrschneider,

@wrschneider, w jaki sposób renderfunkcja reagowania różni się w zależności od rodzaju mieszanego kodu od typowego języka szablonów?
Winston Ewert

3

Jako outsider React, widziałem JSX jako kolejny „zapach ramowy” w bardzo zatłoczonym zoo cuchnących ramami. Nadal nie jestem przekonany, że tak nie jest.

Myślę, że praktyczną definicją „użytecznego” jest to, że biblioteka / framework / wzorzec rozwiązuje więcej problemów niż powoduje. Nie jestem jeszcze przekonany, czy JSX pasuje do tej definicji. Jest to przysłowiowe „ściskanie balonu” ... tutaj rozwiązujesz problem, wyskakuje tam. Dla mnie JSX nie rozwiązuje żadnego konkretnego problemu ... jest po prostu „inny”.

Pojęcie wprowadzenia kompilowalnej semantyki, która wymaga sformalizowanego procesu kompilacji, jest przydatne w niektórych okolicznościach: na przykład kompilacja LESS plików .css zapewnia bardzo potrzebną strukturę wokół css, która jest strukturą hierarchiczną z importami i nadpisaniami, a zatem będąc bardzo podatnym na „rozwiązania spaghetti”. Ale prekompilatory Javascript ... nie bardzo.


„Przydatna definicja użyteczna to…”, to jest świetny punkt. I tak, JSX rozwiązuje więcej problemów, niż nam się wydaje. Komponent widoku React jest prostszy i bardziej wyrazisty dzięki JSX. może być testowany jednostkowo z płytkim renderowaniem. Jeśli mówisz, że zapach JSP może pachnieć i ma większą szansę na błędy. I nie jestem agnest jsp.
Sagar

Przepraszam, ale nie rozumiem, jak to odpowiada na pytanie.
sleske,

Śleske, wielbiciel krytyki literackiej nazwałby to „lekturą wewnętrzną” pytania. Pytanie na powierzchni wymaga porównania, ale wewnątrz pyta o ramy. Moja odpowiedź dotyczy koncepcji „frameworków rozwiązujących więcej problemów niż one powodują”. OP może następnie wziąć mój komentarz, zastosować to credo do swojej szczególnej, wyjątkowej sytuacji i zdecydować, czy JSX jest pomocą czy przeszkodą. Można powiedzieć, że twoje stwierdzenie nasuwa pytanie, czy jest jakiś brak odpowiedzi lub brak zrozumienia, ponieważ każdy z tych problemów może spowodować dokładny wynik
dwoz


0

Chociaż nie używam JSX, na podstawie twojego opisu, zadaniem fragmentu JSX jest prezentacja danych, to znaczy jest to komponent widoku w języku MVC. Fragment JSX prawdopodobnie nie wie ani nie obchodzi, skąd pochodzą dane, z czego chcesz.

Dobrze zorganizowana strona JSP będzie zawierać tylko dyrektywy JSTL, tak jak wspomniałeś. Dyrektywy JSTL po prostu upraszczają pliki JSP, aby nie były zaśmiecone pobieraniem z zakresu, sprawdzaniem wartości zerowej itp. Zaskakujące jest, jak dużo bałaganu to usuwa, a także zachęca do jego uporządkowania.

Podobnie jak fragment JSX; jedynym zadaniem JSP powinno być ustalenie sposobu prezentacji otrzymanych danych, bez obawy o to, skąd one pochodzą.

Podsumowując, niezależnie od tego, czy Twój widok to JSX czy JSP, jeśli robisz to poprawnie, Twój widok po prostu przedstawia dane.

To, dlaczego możesz przenieść prezentację do klienta zamiast robić to na serwerze, daje to większą elastyczność. Twoja strona internetowa może uzyskiwać dane za pośrednictwem usług internetowych (na przykład ReST) i być tylko kolejnym klientem. Jeśli później zdecydujesz, że chcesz mieć natywną aplikację na Androida lub iOS, mogą one korzystać z tego samego zestawu usług internetowych, co Twoja witryna.


Pamiętaj, że JSX może być używany po stronie klienta lub po stronie serwera. Fantazyjnym sposobem korzystania z JSX jest renderowanie początkowych kontroli na serwerze, a następnie przeprowadzanie aktualizacji DOM (w odpowiedzi na wezwania serwisowe) po stronie klienta. W każdym razie masz rację, że React jest warstwą widoku ( cytując Facebooka : „Wiele osób używa React jako V w MVC”).
Brian

Konkretne pytanie brzmi: dlaczego React / JSX uważa, że ​​warto używać natywnej składni JavaScript dla pętli / warunków, podczas gdy JSP wyeliminował natywną składnię Java (skryptlety).
wrschneider,

Przepraszam, przegapiłem ten punkt. Zacząłem komponować odpowiedź, ale potem zdałem sobie sprawę, że to po prostu przypadek „twoje przypuszczenia są tak dobre jak moje”. Przydatna składnia warstwy prezentacji dla JSX może być użyteczna, mogę tylko przypuszczać, że było to ważne dla projektantów Java, a nie dla projektantów JSX.
PhilDin,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.