ExpressJS puede enviar texto al navegador con solo unas pocas líneas de código:
También podemos enviar HTML más complejo al navegador:
request
y response
como demostración.
Estos se representan comúnmente como req
y res
en la documentación, por lo que los usaremos en el futuro.
De esta forma resultaría tedioso y complicado a medida que nuestra aplicación crezca. ¿Te imaginas que nuestro app.js
tenga miles de líneas? ¡Tiene que haber una mejor manera!
En ExpressJS -y en la mayoría de los frameworks- puedes crear archivos específicamente para nuestro HTML. De esta forma, podemos mantener el HTML separado de la lógica de nuestra aplicación.
Estos archivos se llamarán vistas, y una vez que aprendamos a usarlos, simplemente podemos llamar a res.render
en lugar de res.send
y enviar un archivo HTML al navegador:
Las vistas son plantillas específicamente para HTML. HTML es lo que verá el cliente en su navegador.
Para comenzar a usar vistas, debemos crear una carpeta dentro de nuestro proyecto llamada views
para agruparlas. Crearemos nuestra primera vista index.hbs
:
La ventaja de separar las vistas es que separamos la lógica del servidor ExpressJS (rutas, configuración del servidor, inicio del servidor, etc.) y la presentación (HTML), haciendo nuestro código más manejable y bien estructurado.
ExpressJS no sabrá por sí solo dónde decidimos agrupar nuestras vistas, pero hay una solución fácil. Podemos decirle a nuestra aplicación Express dónde buscar nuestras vistas:
En Express, en lugar de usar HTML simple, podemos usar una versión más elegante de HTML: hbs
, o Handlebars.
En breve entraremos en más detalles sobre HBS, pero por ahora, asegúrese de instalarlo en nuestra aplicación:
… Y decirle a nuestra aplicación Express que HBS se encargará de renderizar el HTML:
Abrimos el archivo views/index.hbs
y le agregamos un poco de contenido:
Finalmente, en lugar de res.send()
tenemos que decirle a Express que envíe y muestre nuestra vista de index
al cliente:
Cuando visitemos localhost:3000
, veremos nuestro HTML renderizado!
Como vimos en el ejemplo anterior, nuestro archivo tenía una extensión .hbs
. Esta extensión se utiliza por la palabra Handlebars. Handlebars.js es una biblioteca de JavaScript para crear plantillas limpias y sin lógica basadas en Moustache Templating Language.
Una de las características esenciales de usar Handlebars es que podemos hacer que las plantillas sean dinámicas enviándoles información y usando esos datos para renderizar nuestra aplicación web.
El método res.render()
puede tomar un parámetro adicional que contendrá un objeto JavaScript con información que podemos usar en la vista.
Veamos un ejemplo:
Cualquier clave pasada en el objeto estará disponible en la vista, con una variable del mismo nombre.
{{variableName}}
significa que una variable se enviará al HTML que enviamos al cliente
Las plantillas son en su mayoría HTML, pero HBS
las analizará y ejecutará JavaScript antes de que muestre el HTML final y lo envíe al navegador:
Por defecto, Handlebars escapa a los valores HTML incluidos en una expresión con el {{ }}
. Eso significa que si enviamos datos como este:
Y lo imprimimos en nuestro archivo HBS
:
Veríamos el contenido con las <span>
:
Si no queremos que Handlebars escape de un valor, deberíamos usar triple llave: {{{ }}}
.
Además de la función de plantilla dinámica, Handlebars nos brinda excelentes ayudantes para hacernos la vida más fácil al codificar nuestra web.
if
Puede usar el bloque if
para renderizar un bloque condicionalmente. Eso significa que, si su argumento devuelve "falso", "indefinido", "nulo", "" "," 0 "o" [] ", Handlebars no mostrará el bloque.
Ya que lastName
es undefined
, nuestro tag <h2>
no se va a mostrar! Ahora, agreguemos la propiedad lastName
a los datos!
También podemos agregar una declaración else
, ¡lo que hace que esto sea aún más poderoso!
unless
Puede usar el bloque unless
como el inverso del bloque if
. Representará el bloque si la expresión devuelve un valor falso.
Si buscar address
en el contexto actual devuelve un valor falso, Handlebars mostrará el mensaje. De lo contrario, no mostrará nada. En nuestro ejemplo, mostrará el mensaje.
Si agregamos la propiedad address
el mensaje va a desaparecer!
each
El bloque each
nos ayuda a iterar sobre una lista de elementos, principalmente objetos
y arrays
. Imagínese imprimir la lista de materias que tiene una carrera. Podemos hacer algo como esto:
Estamos repitiendo la misma etiqueta <li>
seis veces, solo cambiando el contenido dentro de las etiquetas. Usando el bloque each
, podemos hacer lo siguiente:
Primero, necesitamos pasar los datos a nuestra vista:
Una vez que tenemos los datos en nuestro archivo index.hbs
:
this
para hacer referencia al elemento que estamos iterando.
Opcionalmente, puede proporcionar una sección {{else}}
que se mostrará solo cuando la lista esté vacía.
@index
Al recorrer los elementos de each
, opcionalmente puedes hacer referencia al índice del ciclo actual a través de{{@index}}
@key
Además, para la iteración del object
,{{@key}}
hace referencia al nombre de la clave actual:
@first
- @last
Los primeros y últimos pasos de la iteración se anotan mediante las variables @first
y @last
cuando se itera sobre una matriz.
Es importante notar que los ayudantes @first
y @last
devuelven un boolean! Al iterar sobre un objeto, solo @first
está disponible.
with
Por lo general, Handlebars evalúa su plantillas frente al contexto pasado al método compilado. Podemos cambiar ese contexto a una sección de una plantilla usando el bloque incorporado with
.
Por ejemplo, pasando los siguientes datos:
Podemos hacer esto:
Usando el bloquewith
, cambiamos el contexto, entonces nos podemos referir a {{address.street}}
y {{address.number}}
, como {{street}}
y {{number}}
.