React.js proporciona JSX como una sintaxis similar a XHTML para construir un árbol de componentes y elementos. JSX compila a Javascript, y en lugar de proporcionar bucles o condicionales en JSX propiamente dicho, usa Javascript directamente:
<ul>
{list.map((item) =>
<li>{item}</li>
)}
</ul>
Lo que aún no he podido explicar es, ¿por qué esto se considera bueno si las construcciones análogas se consideran malas en JSP?
Algo así en JSP
<ul>
<% for (item in list) { %>
<li>${item}</li>
<% } %>
</ul>
se considera un problema de legibilidad que se debe resolver con etiquetas como <c:forEach>
. El razonamiento detrás de las etiquetas JSTL también parece que podrían aplicarse a JSX:
- es un poco más fácil de leer cuando no se alterna entre sintaxis tipo XHTML (corchetes angulares, anidamiento) y Java / Javascript (curvas, comas, parens)
- cuando tienes el lenguaje completo y la plataforma disponibles para usar dentro de la función de representación, hay menos para desanimarte de poner lógica que no pertenece allí.
Las únicas razones por las que puedo pensar por qué JSX es diferente es:
en Java, tenía un incentivo para hacer lo incorrecto: JSP se volvería a cargar en caliente, por lo que era tentador poner código en JSP para evitar un ciclo de reconstrucción / reinicio. La mantenibilidad fue sacrificada por la productividad inmediata. Desterrar los scriptlets y limitarse a un conjunto fijo de construcciones de plantillas fue efectivamente una forma de hacer cumplir la mantenibilidad. No existe tal distorsión en el mundo JS.
La sintaxis JSP y Java es torpe con el extra
<% ... %>
para distinguir el código Java de la generación de elementos, y la sintaxis nativa de Java carece de unforeach
concepto o funciones de primera clase (hasta hace poco). La penalización de sintaxis de usar Javascript nativo para bucles y condicionales en JSX no es cero (en mi opinión) pero no es tan malo como JSP, y posiblemente no sea lo suficientemente malo como para justificar la introducción de elementos específicos de JSX para bucles y condicionales.
¿Hay algo más que me estoy perdiendo?