JSP komut dosyaları kötü olduğunda JSX neden iyidir?


21

React.js, JSX'i bir bileşen ve öğe ağacı oluşturmak için XHTML benzeri bir sözdizimi olarak sağlar. JSX Javascript için derler ve doğru JSX döngü veya koşul sağlamak yerine, Javascript doğrudan kullanın:

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

Henüz açıklayamadığım şey, benzer yapıların JSP'de kötü olduğu düşünülürse neden iyi sayılır?

JSP'de böyle bir şey

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

gibi etiketlerle çözülecek bir okunabilirlik sorunu olarak kabul edilir <c:forEach>. JSTL etiketlerinin ardındaki mantık da JSX için geçerli olabilir gibi görünüyor:

  • XHTML benzeri sözdizimi (açılı ayraçlar, iç içe geçme) ve Java / Javascript (kıvrımlar, virgüller, parenler) arasında geçiş yapmadığınızda okumak biraz daha kolaydır
  • oluşturma işlevinin içinde kullanabileceğiniz tam bir dil ve platform varsa, oraya ait olmayan bir mantık koymaktan vazgeçirecek daha az şey vardır.

JSX'in neden farklı olduğunu düşünebilmemin tek nedeni:

  • Java, yanlış bir şey yapmak için bir teşvik vardı - JSP sıcak yeniden yüklenecek, bu yüzden bir yeniden oluşturma / yeniden başlatma döngüsü önlemek için JSPs kodu koymak cazip oldu. Sürdürülebilirlik hemen üretkenlik için feda edildi. Komut dosyalarının kaldırılması ve sabit bir şablon yapı kümesiyle sınırlandırılması, sürdürülebilirliği etkili bir şekilde güçlendirmenin bir yoluydu. JS dünyasında böyle bir bozulma yok.

  • JSP ve Java sözdizimi, <% ... %>Java kodunu öğe oluşturma işleminden ayırmak için fazladan ve Java'nın bir foreachkavram veya birinci sınıf işlevlerden yoksun olan yerel sözdizimiyle (yakın zamana kadar) tıknazdır. JSX'teki döngüler ve koşullu için yerel Javascript kullanmanın sözdizimi cezası sıfır değildir (bence) ama JSP kadar kötü değildir ve muhtemelen döngüler ve koşullu için JSX'e özgü öğelerin tanıtılmasını gerektirecek kadar kötü değildir.

Özlediğim başka bir şey var mı?


1
JSP'nizde döngülere sahip olmanın kötü olduğunu düşünmüyorum, sorun scriptlet etiketlerine kod gömmek. Bunları yasaklar ve JSTL kullanırsanız JSP'lerinizi basitleştirmek zorunda kalacaksınız. Ayrıca, işaret ettiğiniz gibi, ek bir bonus da JSTL sözdiziminin scriptlet sözdiziminden biraz daha az rahatsız edici olmasıdır. JSX'e aşina olmasam da, tahminim JSX parçalarını, önerilmeyecek, ancak önlenmeyecek çok sayıda kıvrık mantıkla kötüye kullanabileceğinizdir.
PhilDin

Yanıtlar:


11

Öncelikle, JSX'i oluşturan insanlar JSP'yi sevmeyen insanlarla aynı fikirde değillerdi. Tartışmalarını burada görebilirsiniz: React'i neden oluşturduk? sıra sıra Verileri Görüntüleme

Şablonlar, bir sayfanın mantığı ile sunumu arasında bir ayrım oluşturma fikrine dayanır. Bu teoride, javascript (veya java) kodunuz hangi işaretlemenin gösterildiğiyle ilgilenmemeli ve işaretlemeniz ilgili mantığın hiçbiriyle ilgilenmemelidir. Bu bölüm, temelde insanların şablonunuzla (PHP / JSP / ASP) kodun kolayca karıştırılmasına izin veren çeşitli şablon dillerini eleştirmektedir.

Reaksiyon bileşenlere dayanır. Tepki yazarları, bir bileşenin mantığı ve sunumunun sıkı bir şekilde bağlı olduğunu ve bunları bölmeye teşebbüsün bir anlamı olmadığını savunuyorlar. Bunun yerine, bir sayfa mantıksal parçalarla kesilmelidir. Böylece başlık çubuğunu, yorumları, postayı, ilgili soruları vb. Ayrı bileşenlere ayırabilirsiniz. Ancak ilgili soruların mantığını sunumdan ayırmaya çalışmak mantıklı değildir.

JSX gibi bir şey ve JSP gibi bir şey arasındaki birincil fark, JSP'nin mantık için biraz java içeren bir şablon dili olmasıdır. JSX, HTML parçalarını oluşturmayı kolaylaştırmak için sözdizimi uzantısına sahip bir javascripttir. Vurgu farklıdır. JSX bu yaklaşımı benimsediğinden, JSP veya arkadaşları tarafından daha güzel, daha temiz bir yaklaşım üretiyor.

Ama sonuçta, tepki gösteren insanların şablonlardan hoşlanmadığı gerçeği ortaya çıkıyor. Kötü bir fikir olduklarını ve işaretleme ile sunum mantığınızı aynı yere koymanız gerektiğini düşünüyorlar.


renderFonksiyonun diğer bileşen mantığı ile aynı yerde kapsüllenmesinden şikayet etmiyorum . Kesinlikle diğer kod türleriyle karıştırma öğesi oluşturma okunabilirliği ile ilgileniyorum.
wrschneider

@wrschneider, bir tepki renderişlevinin karıştırılmakta olan kod türlerinde tipik şablon dilinize göre farkı nedir?
Winston Ewert

3

React'in dışından biri olarak, JSX'i çok sayıda çerçeve kokusu hayvanat bahçesinde bir başka "çerçeve kokusu" olarak gördüm. Hala durumun bu olmadığına ikna olmadım.

"Yararlı" bir uygulanabilir tanımı bir kütüphane / çerçeve / desen neden daha fazla sorun çözüyor olduğunu düşünüyorum. JSX bu tanıma uygun olduğuna henüz emin değilim. Meşhur "balonu sıkmak" ... burada bir problemi eziyorsun, oradan dışarı çıkıyor. Bana göre, JSX herhangi bir problemi çözmüyor ... sadece "farklı".

Biçimlendirilmiş bir oluşturma işlemi gerektiren derlenebilir bir anlambilim getirme fikri bazı durumlarda yararlıdır: örneğin, .css dosyalarının LESS derlemesi, ithalat ve geçersiz kılmalara sahip hiyerarşik bir yapı olan css çevresinde çok ihtiyaç duyulan bir yapı sağlar. "spagetti çözümlerine" çok eğilimli olmak. Ama Javascript ön derleyicileri ... çok fazla değil.


"Faydalı bir uygulanabilir tanımı ..." bu harika bir nokta. Ve evet JSX düşündüğümüzden daha fazla problemi çözüyor. React view bileşeni JSX ile daha basit ve etkileyici. sığ işleme ile birim test edilebilir. Eğer koku söylerseniz JSP kokuyor olabilir ve hata olasılığı daha fazladır. Ve ben agnest jsp değilim.
Sagar

Üzgünüm, ama bunun soruyu nasıl cevapladığını göremiyorum.
sleske

Sleske, edebi eleştiri adanmışları buna sorunun “içeriden okunması” diyecektir. Yüzeydeki soru bir karşılaştırma ister, ancak iç kısımda çerçeveler sorulur. Cevabım, "neden olduklarından daha fazla problem çözen çerçeveler" kavramını ele alıyor. OP daha sonra yorumumu alabilir, bu krediyi özel, kendine özgü durumuna uygulayabilir ve JSX'in bir yardım mı yoksa engel mi olduğuna karar verebilir. Bir ifadelerinizin ya sorun tam sonuca neden olabilecek şekilde cevap veya anlamada eksikliğine bir eksiklik, olup olmadığını sorusunu akla getiriyor diyebiliriz
dwoz

1

Kısacası:

  • Ön uç geliştiricilerin komut dosyası yazmayı ve şablon oluşturmayı bilmesi bekleniyor
  • JSX ve JSP'nin ikisi de cazip dillerdir
  • JavaScript bir betik dilidir
  • Java bir komut dosyası dili değildir

Referanslar


0

Açıklamanıza göre JSX kullanmama rağmen, JSX parçasının işi verileri sunmaktır, yani MVC parlance bir görünüm bileşenidir. JSX parçası muhtemelen verilerin nereden geldiğini bilmiyor veya umursamıyor.

İyi yapılandırılmış bir JSP sayfası, bahsettiğiniz gibi sadece JSTL direktiflerini içerecektir. JSTL direktifleri sadece JSP'lerinizi basitleştirir, böylece kapsamdan getirme, null vb.

Tıpkı JSX parçası gibi; JSP'nin tek işi, nereden geldiğini düşünmeden aldığı verileri nasıl sunacağını bulmak olmalıdır.

Özet olarak, görünümünüz JSX veya JSP ise, düzgün bir şekilde yapıyorsanız, görünümünüz yalnızca veri sunacaktır.

Sunuyu neden sunucuda yapmak yerine istemciye kaydırabileceğinize gelince, bu size daha fazla esneklik sağlar. Web siteniz verilerini web hizmetleri (örneğin ReST) aracılığıyla alabilir ve yalnızca başka bir istemci olabilir. Daha sonra yerel bir Android veya iOS uygulaması istediğinize karar verirseniz, web sitenizle aynı web hizmetleri kümesini kullanabilirler.


JSX'in istemci tarafında veya sunucu tarafında kullanılabileceğini unutmayın. JSX'i kullanmanın şık yolu, ilk denetimleri sunucuda oluşturmak ve daha sonra istemci tarafında DOM güncelleştirmelerini (hizmet çağrılarına yanıt olarak) gerçekleştirmektir. Her neyse, React'ın görüntü katmanı olduğu konusunda haklısınız ( Facebook'tan alıntı yaparak : "Birçok kişi React'ı MVC'de V olarak kullanıyor").
Brian

Özel soru, React / JSX'in neden döngüler / şartlar için yerel Javascript sözdizimini kullanmanın iyi bir şey olduğunu düşünürken, JSP yerel Java sözdizimini (komut dosyaları) ortadan kaldırmıştır.
wrschneider

Üzgünüm, bu noktayı kaçırdım. Bir cevap oluşturmaya başladım ama daha sonra bunun "tahmininiz benim kadar iyi" bir durum olduğunu fark ettim. JSX için güzel bir sunum katmanı sözdizimi yararlı olabilir, bunun sadece JSX tasarımcıları için değil Java tasarımcıları için önemli olduğunu tahmin edebilirim.
Kasım'da PhilDin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.