Perché JSX è buono, quando gli scriptlet JSP sono cattivi?


21

React.js fornisce JSX come una sintassi simile a XHTML per la costruzione di un albero di componenti ed elementi. JSX si compila in Javascript e invece di fornire loop o condizionali in JSX, si utilizza direttamente Javascript:

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

Ciò che non sono stato ancora in grado di spiegare è, perché questo è considerato buono se costrutti analoghi sono considerati cattivi in ​​JSP?

Qualcosa del genere in JSP

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

è considerato un problema di leggibilità da risolvere con tag come <c:forEach>. Il ragionamento dietro i tag JSTL sembra anche che potrebbero applicarsi a JSX:

  • è un po 'più semplice da leggere quando non si alternano sintassi simili a XHTML (parentesi angolari, annidamento) e Java / Javascript (ricci, virgole, parentesi)
  • quando hai la lingua e la piattaforma complete disponibili per l'uso all'interno della funzione di rendering, c'è meno per scoraggiarti dal mettere la logica in quella che non vi appartiene.

Le uniche ragioni per cui riesco a pensare al perché JSX è diverso sono:

  • in Java, hai avuto un incentivo a fare la cosa sbagliata: JSP sarebbe stato ricaricato a caldo, quindi era allettante inserire codice in JSP per evitare un ciclo di ricostruzione / riavvio. La manutenzione è stata sacrificata per una produttività immediata. Bandire gli scriptlet e limitarsi a un insieme fisso di costrutti modello era effettivamente un modo per far rispettare la manutenibilità. Nessuna tale distorsione esiste nel mondo JS.

  • La sintassi JSP e Java è goffa con il supplemento <% ... %>per distinguere il codice Java dalla generazione di elementi e con la sintassi nativa di Java priva di un foreachconcetto o di funzioni di prima classe (fino a poco tempo fa). La penalità della sintassi dell'uso di Javascript nativo per loop e condizionali in JSX è diversa da zero (a mio avviso) ma non così grave come JSP, e probabilmente non abbastanza grave da giustificare l'introduzione di elementi specifici di JSX per loop e condizionali.

C'è qualcos'altro che mi manca?


1
Non credo sia male avere dei loop nel tuo JSP di per sé, il problema è con l'incorporamento del codice nei tag scriptlet. Se li bandisci e usi JSTL, sarai costretto a semplificare i tuoi JSP. Inoltre, come sottolineato, un ulteriore vantaggio è che la sintassi JSTL è un po 'meno stonante della sintassi dello scriptlet. Anche se non ho familiarità con JSX, la mia ipotesi è che probabilmente potresti abusare dei frammenti JSX con molta logica contorta che non sarebbe raccomandabile ma che non impedirà.
PhilDin,

Risposte:


11

In primo luogo, le persone che hanno creato JSX non erano d'accordo con le persone a cui non piaceva JSP. Vedi la loro discussione qui: Perché abbiamo costruito React? così come la visualizzazione dei dati

I modelli si basano sull'idea di creare una divisione tra la logica e la presentazione di una pagina. In base a questa teoria, il codice javascript (o java) non dovrebbe riguardare il markup visualizzato e il markup non dovrebbe riguardare nessuna delle logiche coinvolte. Questa divisione è essenzialmente il motivo per cui le persone criticano i vari linguaggi di template che hanno prontamente permesso di mescolare il codice con il tuo template (PHP / JSP / ASP).

React si basa sui componenti. Gli autori di reazioni sostengono che la logica e la presentazione di un componente sono strettamente connesse e il tentativo di dividerle non ha alcun senso. Invece, una pagina dovrebbe essere rotta da pezzi logici. Quindi potresti suddividere la barra di intestazione, i commenti, i post, le domande correlate, ecc. In componenti separati. Ma non ha senso cercare di dividere la logica per le domande correlate dalla presentazione.

La differenza principale tra qualcosa come JSX e qualcosa come JSP è che JSP è un linguaggio modello che include un po 'di java per la logica. JSX è javascript con un'estensione di sintassi per facilitare la costruzione di frammenti di HTML. L'enfasi è diversa. Dal momento che JSX abbraccia questo approccio, finisce per produrre un approccio più bello e più pulito, poi fatto da JSP o dagli amici.

Ma alla fine, dipende dal fatto che alle persone che hanno fatto la reazione non sono piaciuti i modelli. Pensano di essere una cattiva idea e che dovresti mettere la tua logica di markup e presentazione nello stesso posto.


Non mi lamento di incapsulare la renderfunzione nello stesso posto della logica di altri componenti. Sono strettamente interessato alla leggibilità di mescolare la generazione di elementi con altri tipi di codice.
wrschneider,

@wrschneider, in che modo una renderfunzione di reazione differisce nei tipi di codice miscelati rispetto al tipico linguaggio di template?
Winston Ewert,

3

Come estraneo a React, ho visto JSX come l'ennesimo "odore di struttura" nello zoo molto affollato di puzzi di struttura. Non sono ancora convinto che non sia così.

Penso che una definizione praticabile di "utile" sia che una libreria / framework / pattern risolva più problemi di quanti ne causi. Non sono ancora convinto che JSX si adatti a tale definizione. È il proverbiale "spremere il palloncino" ... si schiaccia un problema qui, si apre laggiù. Per me, JSX non sta risolvendo alcun problema particolare ... è solo "diverso".

L'idea di introdurre una semantica compilabile che necessita di un processo di compilazione formalizzato è utile in alcune circostanze: ad esempio, MENO la compilazione di file .css fornisce una struttura molto necessaria attorno a css, che è una struttura gerarchica con importazioni e sostituzioni, quindi essendo molto incline a "soluzioni di spaghetti". Ma i pre-compilatori Javascript ... non così tanto.


"Una definizione praticabile di utile è ..." questo è un ottimo punto. E sì, JSX risolve più problemi di quanto pensiamo. Il componente React view è più semplice ed espressivo con JSX. può essere testabile in unità con rendering superficiale. Se dici odore che JSP ha può avere odori e ha maggiori possibilità di errori. E non sono più nervoso.
Sagar,

Scusa, ma non vedo come questo risponda alla domanda.
sleske,

Sleske, i devoti della critica letteraria lo definirebbero una "lettura interna" della domanda. La domanda in superficie richiede un confronto, ma all'interno sta chiedendo dei quadri. La mia risposta affronta il concetto di "framework che risolvono più problemi di quanti ne causino". L'OP potrebbe quindi prendere il mio commento, applicare quel credo alla sua particolare, unica situazione e decidere se JSX è un aiuto o un ostacolo. Si potrebbe dire che la tua affermazione pone la domanda se c'è una carenza nella risposta o una carenza nella tua comprensione, poiché entrambi i problemi potrebbero causare il tuo esatto risultato
dwoz


0

Anche se non uso JSX, in base alla tua descrizione, il compito del frammento JSX è presentare i dati, ovvero è un componente di visualizzazione nel linguaggio MVC. Il frammento JSX presumibilmente non sa né cura da dove provengono i dati, qual è ciò che desideri.

Una pagina JSP ben strutturata conterrà solo le direttive JSTL come dici tu. Le direttive JSTL semplificano semplicemente i tuoi JSP in modo che non siano ingombri di recupero dall'ambito, controllo di null, ecc. È sorprendente la quantità di disordine che rimuove e ti incoraggia anche a mantenerlo declassato.

Proprio come il frammento JSX; l'unico compito del JSP dovrebbe essere quello di capire come presentare i dati che ha ricevuto senza preoccuparsi della sua provenienza.

In sintesi, se la tua vista è JSX o JSP, se lo stai facendo correttamente, la vista presenterà solo i dati.

Per quanto riguarda il motivo per cui potresti spostare la presentazione sul client invece di farlo sul server, questo ti dà maggiore flessibilità. Il tuo sito web può ottenere i suoi dati tramite servizi web (ad esempio ReST) ed essere solo un altro client. Se in seguito decidi di volere un'app nativa per Android o iOS, possono utilizzare lo stesso set di servizi Web del tuo sito web.


Si noti che JSX può essere utilizzato sul lato client o sul lato server. Il modo elegante di utilizzare JSX è eseguire il rendering dei controlli iniziali sul server e quindi eseguire gli aggiornamenti DOM (in risposta alle chiamate di servizio) sul lato client. Ad ogni modo, hai ragione che React è il livello di visualizzazione ( citando Facebook : "Molte persone usano React come V in MVC").
Brian,

La domanda specifica è perché React / JSX considera una buona cosa usare la sintassi Javascript nativa per loop / condizionali mentre JSP ha eliminato la sintassi Java nativa (scriptlet).
wrschneider,

Scusa, ho perso quel punto. Ho iniziato a scrivere una risposta, ma poi ho capito che era semplicemente un caso di "la tua ipotesi è buona come la mia". Una bella sintassi del livello di presentazione per JSX potrebbe essere utile, posso solo supporre che ciò fosse importante per i progettisti Java e non per i progettisti JSX.
PhilDin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.