Escolar Documentos
Profissional Documentos
Cultura Documentos
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 1 de 25
Manual de Handlebars
Los sistemas de plantillas son muy importantes, porque nos permiten separar el cdigo por
responsabilidades y crear la salida de las aplicaciones de una manera sencilla, manteniendo el
cdigo HTML separado del cdigo Javascript. En este manual aprenders a usar el sistema de
plantillas Javascript tanto en el lado del cliente como en el lado del servidor con NodeJS.
Puedes usar Handlebars junto con cualquier librera de manipulacin del DOM como jQuery, o
simplemente con Javascript plano. Tambin puedes usarla en el lado del servidor, con NodeJS
en el caso que tengas que generar salida formateada desde ese lenguaje.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 2 de 25
Manual de Handlebars
Las siguientes personas han participado como autores escribiendo artculos de este manual.
Eduard Toms
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 3 de 25
Manual de Handlebars
Qu son los motores de plantillas y cmo nos pueden facilitar la vida a los
programadores en Javascript. Ejemplos de libreras que implementan las
plantillas.
Si pensabas que las plantillas eran algo ligado al back-end es que todava tienes bastante que
explorar en cuanto a desarrollo del lado del cliente. En este artculo pretendemos explicar qu
son las plantillas Javascript, de modo que podamos entender su utilidad y cmo pueden llegar
a ser esenciales para una programacin front-end sencilla y mantenible.
Creo que lo mejor para entender la necesidad de usar plantillas en Javascript es haberse visto
en el quebradero de cabeza en que nos encontramos cuando queremos generar dinmicamente
elementos en el DOM de la pgina web. As que comenzaremos explicando sus ventajas con un
ejemplo en el que podemos habernos encontrado.
No sera mejor mantener esas estructuras en HTML plano y simplemente llamar a una
funcin que nos cargue los datos enviados dentro del cdigo HTML? Pues eso es bsicamente
lo que conseguimos con las plantillas.
No hay mucho secreto. Nuestra plantilla tendra un aspecto como este cdigo HTML:
<div class="estructura">
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 4 de 25
Manual de Handlebars
<h1>{{titulo}}</h1>
<div class="cuerpo">
{{cuerpo}}
</div>
</div>
Nota: Esa plantilla est basada en la sintaxis Mustache Templates, que utiliza la librera
Handlebars JS.
Como ves, hay bloques de contenido que se pueden rellenar con datos variables, son los
{{titulo}} y {{body}}. Pues nada ms tendramos que invocar a esa plantilla enviando los datos
que queremos cargar en el HTML y nos devolver el cdigo HTML resultante, ya con los datos
dentro de las etiquetas, en una cadena que podramos insertar en el DOM de una manera
sencillsima con nuestra librera Javascript preferida, ya sea jQuery o con cualquier otra.
Nos queda en el aire ver cmo sera el sistema para ejecutar la plantilla, pero realmente esa
implementacin depende del sistema de plantillas que ests utilizando, aunque generalmente
ser algo tan sencillo como ejecutar un mtodo o una funcin.
Nota: Qu tal, se entiende bien la estructura del HTML de la plantilla a simple vista? Si
todava no te resulta obvio lo til de mantener las plantillas en HTML, echa un vistazo al
cdigo Javascript siguiente. Algo como esto sera lo que tendramos que escribir usando
jQuery para crear esa estructura HTML como la de la plantilla anterior:
$("<div></div>")
.addClass("estructura")
.append($("<div></div>")
.html(cuerpo)
.addClass("cuerpo"))
.appendTo("body");
Como se puede ver, construir estructuras DOM desde jQuery no es muy prctico, y aunque
se pueda hacer perfectamente, no resulta cmodo.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 5 de 25
Manual de Handlebars
Los sistemas de plantillas son adems compaeros inseparables de algunas libreras avanzadas
Javascript que nos traen paradigmas de desarrollo diferentes, como los MVVM, que sera algo
parecido al MVC pero para desarrollo en el cliente. En los ltimos meses se ha hablado mucho
de AngularJS, que ya viene con su propio sistema de plantillas. Pero otras, como por ejemplo
Backbone no implementan su propio sistema de templating, de modo que cualquiera de las
siguientes libreras Javascript te vendr ideal.
Handlebars:
Un motor de plantillas para Javascript que implementa la sintaxis Mustache Templates y que
provee de funcionalidades adicionales para su compilacin y procesamiento.
handlebarsjs.com
Underscore.js:
Una librera Javascript que provee un gran abanico de funcionalidades diversas y tiles para
cualquier proyecto. Entre otras cosas podrs generar y usar plantillas Javascript.
underscorejs.org
Pure:
beebole.com/pure
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 6 de 25
Manual de Handlebars
jsrender:
github.com/BorisMoore/jsrender
En general, podramos nombrar algunas otras libreras, pero estas son las que actualmente
mejor pinta tienen. En la actualidad todo depende de tus preferencias, ya que en Javascript
existen decenas de libreras para resolver las mismas cosas. Todo ser ver la que al final acaba
teniendo mayor penetracin.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 7 de 25
Manual de Handlebars
En este artculo te vamos a poner manos a la obra con HandlebarsJS y ahorrarte muchas lneas
de cdigo Javascript o jQuery, que puede llegar a ser bastante enrevesado y de difcil
mantenimiento. Si te dedicas a la programacin front-end, debes invertir una rato con
nosotros leyendo estas lneas.
Nota: este artculo est realizado a raz del programa #jQueryIO emitido recientemente, en
el que Eduard Toms nos present Handlebars y nos mostr varios ejemplos de su uso. No
es una transcripcin directa, pero todas las explicaciones estn basadas en las que nos
ofreci Edu. Los ejemplos que vamos a ver son los que el propio ponente nos present
durante su exposicin.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 8 de 25
Manual de Handlebars
Adems, en las plantillas podrs tener estructuras sencillas como bloques condicionales,
iteradores que recorran colecciones, etc. Veremos que todo ello es sencillo porque Handlebars
es una librera con funciones limitadas, tiles, pero bastante restringidas al propsito nico de
generar HTML a partir de objetos JSON.
Cargar una plantilla, que no es ms que un cdigo HTML mezclado con unos sencillos
elementos de control
Compilar la plantilla, que nos permite convertirlo en una funcin JS
Ejecutar la plantilla para obtener la cadena HTML a partir del JSON
Insertar en el DOM el cdigo HTML resultante de ejecutar el template, usando jQuery o
nuestra librera preferida
Nota: Se debe pensar en que, si se intenta ejecutar un template Handlebars con Javascript
se encontrar con un error, ya que el template est escrito en cdigo HTML. Por ello se
coloca un type a la etiqueta Script que el navegador no conozca, de modo que nos
aseguremos que no va a intentar ejecutarlo.
La otra opcin es usar una llamada a AJAX para traerte los templates, con la nica limitacin
que se debe sincronizar el retorno de la llamada con la compilacin y ejecucin de los
templates. En otras palabras, debemos esperar que la llamada a AJAX para traerte el template
se ha producido con xito para poder compilar llas plantillas que vamos a usar en nuestra
pgina.
Compilar un template:
En Handlebars tenemos que hacer un paso previo antes de poder ejecutar un template, que es
compilarlo. Es algo muy simple. Llamamos a Handlebars.compile() envindole como
parmetro el texto de nuestra plantilla. El resultado de esto es una funcin, que es la que
tendremos que invocar para ejecutarla.
La variable "stemplate" es la cadena con el contenido del template. Finalmente, una vez
compilada, en la variable que recibimos como retorno, que hemos llamado tmpl, tendrs la
funcin de la plantilla.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 9 de 25
Manual de Handlebars
Obtenemos como respuesta de la funcin del template un cdigo HTML listo para ser
insertado en el DOM.
Nota: Los templates los compilamos una nica vez y los ejecutamos tantas veces como
queramos. El proceso costoso en tiempo de ejecucin es compilar los templates. Una vez se
ha hecho ejecutar el template para producir el HTML es un proceso rpido que podemos
realizar tantas veces como necesitemos sin tener que sufrir por el rendimiento de la
aplicacin.
{{/each}}
</script>
Luego explicaremos las estructuras de control para las plantillas, pero podrs apreciar aqu
una iteracin en la que se recorre una estructura llamada "Beers" y se va mostrando su dato
"Name".
Nota: aqu ves el mtodo html() de jQuery, pero no quiere decir que Handlebars use
jQuery de manera nica, lo podemos usar con cualquier librera que deseemos. A lo largo
de este ejemplo se usa jQuery diversas veces.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 10 de 25
Manual de Handlebars
Ahora podramos traernos nuestro JSON por medio de AJAX. De nuevo, usaremos la librera
que deseemos. Con la cadena JSON recibida simplemente le aplicamos un contexto:
html = tmpl(ctx);
$("#content").append(html);
$("#content").show();
[{"Name":"Estrella","Brewery":"Damm","Style":"Euro Lager","Abv":"5.4","Ibu":"25","Favorite":false,"LastCheckin":{"When":"24/04/2013 -
20:00:01","Drinker":"@eiximenis"}},
{"Name":"Voll Damm","Brewery":"Damm","Style":"Bock","Abv":"7.2","Ibu":"40","Favorite":false,"LastCheckin":{"When":"24/04/2013 -
21:00:01","Drinker":"@CKGrafico"}},
22:00:01","Drinker":"@midesweb"}},
23:00:01","Drinker":"@eiximenis"}}]
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Beer List</title>
<script src="handlebars.js"></script>
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 11 de 25
Manual de Handlebars
<script src="jquery-2.0.0.min.js"></script>
{{/each}}
</script>
</head>
<body>
<strong>Our Beers...</strong><br/>
</div>
<script type="text/javascript">
$(function() {
url: '/api/Beers'
});
xhr.done(function (data) {
ctx.Beers = data;
$("#content").append(html);
$("#content").show();
});
});
</script>
</body>
</html>
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 12 de 25
Manual de Handlebars
En los artculos anteriores del Manual de Handlebars hemos podido conocer qu nos ofrecen
los sistemas de plantillas Javascript y cmo dar los primeros pasos con Handlebars. Ahora
vamos a estudiar ms de cerca esta librera de plantillas Javascript para entender su
funcionamiento.
Comenzamos por observar en las plantillas los bloques delimitados por {{ }} dos llaves de
inicio y dos llaves de cierre. Esa forma de abrir y cerrar un bloque en la plantilla es la que da
nombre a la sintaxis que utiliza "Mustache".
{{valor}}
Aunque tambin se pueden usar tres llaves a la vez, en cuyo caso no escapar el cdigo HTML
que haya en el valor.
{{{valor}}}
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 13 de 25
Manual de Handlebars
terminarlo.
Esto nos va a permitir ejecutar templates en un contexto distinto al del original. Luego lo
veremos exactamente. Entre los bloques disponibles tememos:
each {{# each expresion}} Itera sobre cada elemento de expresin y genera el template
asociado. El elemento por el que se itera pasa a ser el nuevo contexto.
if {{if expresion}} Si expresion devuelve false, undefined, "", null o [] NO renderiza el
bloque. Admite {{else}}.
Unless {{#unless expresion}} esto, al contrario que if, renderiza el bloque si expresion
devuelve false, undefined, null, "" o [].
Las propiedades del objeto JSON son perfectamente navegables, accediendo al nombre
{{name}}, pero tambin a compuestas en notacin de objeto, como {{author.name}}. Incluso
podemos hacer el paso contrario e irnos al contexto padre con {{../name}}, siendo "name" una
propiedad encontrada en el contexto padre.
Helpers en Handlebars
Tambin tenemos disponible la figura de los "Helpers", que nos ayudan a registrar nuestras
propias funciones para hacer cosas ms concretas y repetitivas. Podemos entender los helpers
como una extensin del propio sistema de plantillas Handlebars, y son como funciones que se
pueden referenciar desde cualquier template. Permiten ejecutar cdigo para dar mayor
funcionalidad a las plantillas y as modificar/combinar datos del contexto.
{{fullName author}} invoca al helper fullName pasndole la propiedad author del contexto.
})
Para crear un helper siempre usamos el mtodo "registerHelper", indicando como primer
parmetro el nombre del helper, seguido de un segundo parmetro que es la funcin del helper
propiamente dicho. En esa funcin recibimos adems datos que podemos usar dentro del
cdigo del helper y cuyos valores le pasamos desde el cdigo de la plantilla.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 14 de 25
Manual de Handlebars
Por ejemplo, el helper anterior llamado "Italize" se podra invocar desde la plantilla con el
siguiente cdigo:
{{/each}}
Nota: en este caso el helper Italize simplemente cambia a cursiva un texto y no sera muy
necesario implementar por medio de un helper. Podra venirnos bien si ms adelante todos
los "Italize" los queremos mostrar de una manera especial y que solo tengamos que
modificar para ello el cdigo del helper, pero generalmente lo usaremos para alguna
estructura un poco ms compleja.
Podemos ver el cdigo fuente del ejemplo segundo de Handlebars, que hace uso del anterior
helper.
!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Beer List</title>
<script src="handlebars.js"></script>
<script src="jquery-2.0.0.min.js"></script>
{{/each}}
</script>
</head>
<body>
<strong>Our Beers...</strong><br/>
</div>
<script type="text/javascript">
(function() {
});
})();
$(function() {
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 15 de 25
Manual de Handlebars
url: '/api/Beers'
});
xhr.done(function (data) {
ctx.Beers = data;
$("#content").append(html);
$("#content").show();
});
});
</script>
</body>
</html>
Si te fijas en el cdigo fuente del ejemplo del artculo anterior de este manual, encontrars que
el Javascript que usamos para compilar la plantilla, invocar al backend para traernos por
AJAX el JSON y ejecutar la plantilla, es muy parecido. Realmente esto es normal, porque todo
ese proceso no variar apenas en los distintos ejemplos que hagamos. Lo que encontrars que
varan son las plantillas y los helpers que podamos construir.
Recuerda que el JSON es el mismo en todos los ejercicios que hemos realizado sobre
Handlebars y que lo puedes ver en:
www.desarrolloweb.com/articulos/ejemplos/handlebars/Beers.json
{{# if Favorite}}
{{/if}}
{{/each}}
Con esto conseguimos que solo se impriman aquellas cervezas que se han maracado como
"Favorite".
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 16 de 25
Manual de Handlebars
if (value) {
} else
return "";
});
En este Helper se usa el parmetro "value" para cargar datos que ser un boleano en el objeto
JSON. En caso positivo muestra una imagen de un icono y en caso negativo no muestra nada.
<br />
{{/each}}
Otra posibilidad interesante es que podramos tener, por ejemplo, un helper que convirtiese un
nombre de usuario Twitter en un enlace a su perfil.
});
Fjate que este helper tiene ya cierta complejidad, porque hacemos un tratamiento Javascript
al "value", para quitarle la "@" de un usuario Twitter. Para transformar un dato usamos el
mtodo de String "substr()", con lo que demostramos que cuando se est programando un
helper no solamente se pueden mostrar datos de nuestro jSON tal cual, sino tambin se
pueden transformar antes de presentar en la pgina.
<ul>
</li>
{{/each}}
</ul>
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 17 de 25
Manual de Handlebars
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 18 de 25
Manual de Handlebars
Los helpers de bloque en Handlebars nos permiten cambiar el contexto. En los ejemplos vistos
hasta ahora en el Manual de Handlebars hemos trabajando siempre dentro del mismo
contexto, pero tambin podemos restringirlo a un sub-bloque en un contexto diferente.
Los contextos los podemos entender como niveles de profundidad en el archivo JSON.
Nosotros, en las plantillas, nos podemos meter en un nivel ms profundo para acceder a las
propiedades disponibles en ese contexto.
<ul>
</li>
{{/each}}
</ul>
En ese cdigo usamos siempre el mismo contexto. Para llamar al helper Twitter indicamos el
dato "LastCheckin.Drinker" para movernos entre niveles del JSON.
Ahora veamos este otro cdigo, que hara lo mismo exactamente, pero efectuando un cambio
de contexto.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 19 de 25
Manual de Handlebars
<ul>
{{#with LastCheckin}}
{{/with}}
</li>
{{/each}}
</ul>
Esto se consigue en helper que nos implemente un "contexto de bloque" y lo creamos mediante
la implementacin de un cdigo como este:
return options.fn(context);
});
Usamos tambin "registerHelper" con el nombre de este helper. Todo absolutamente normal,
pero tiene la diferencia que la funcin del helper recibe dos parmetros, el contexto y unas
opciones. El contexto es el objeto general y "options" es el subtemplate. Es un objeto propio de
Handlebars que te expone una funcin "fn" que te permite renderizar ese subtemplate en el
contexto que necesites.
Podemos ver otro template de bloque a continuacin que generamos usando un helper
llamado "list". Este helper, cuyo cdigo encontraremos un poquito ms abajo, ya produce la
estructura de lista HTML UL y realiza la iteracin entre todos los elementos del JSON.
{{#list Beers}}
{{#with LastCheckin}}
{{/with}}
{{/list}}
Para dar soporte a este template en el que usamos el helper "list", tenemos que crear la propia
funcin del helper. Se trata de otro de los denominados "helpers de bloque", que realiza una
lista y que hemos creado a propsito para el ejercicio.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 20 de 25
Manual de Handlebars
});
En el cdigo, vemos que se genera la lista UL usando otro contexto. Es una especie de bucle
"each" de Handlebars, pero creado por nosotros mismos en un helper de bloque que te
muestra el contenido en una lista.
Nota: como puedes haber imaginado, las estructuras que ya vienen de serie en Handlebars
como "each" o "if", internamente estn desarrolladas por medio de helpers, solo que esos
helpers ya los tienes programados en la librera.
Con esto finalizan los ejemplos sobre Handlebars, la librera Javascript para crear plantillas en
Javascript. Si lo deseas, puedes descargar un zip con los ejemplos revisados en estos artculos.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 21 de 25
Manual de Handlebars
Generar salida en HTML no es que sea lo ms normal en las aplicaciones NodeJS, pero
siempre hay momentos en los que necesitas producir un pedazo de cdigo en formato HTML y
para lo cual es suele ser mucho mejor trabajar mediante un sistema de templates.
Los motivos por los que usar un sistema de plantillas son varios. Lo fundamental es separar el
cdigo por responsabilidades, lo que derivar en la produccin de un cdigo ms mantenible.
Tambin es recomendable porque te resultar mucho ms fcil escribir el cdigo de la salida de
tus aplicaciones. Adems, Handlebars no sirve exclusivamente para producir cdigo HTML,
por lo que te valdr para cualquier otra salida de texto en general.
Existen diversos motores de plantillas que podras usar en Node, pero me gusta Handlebars
por su sencillez. No tienes necesidad de usar otro lenguaje, como ocurre con Jade, y eso lo veo
una ventaja, sobre todo cuando quieres hacer un cdigo limpio y de calidad, pero no quieres
invertir tiempo en aprender nada nuevo.
Instalar Handlebars
Como cualquier otra librera Node, comenzaremos instalando Handlebars mediante el
correspondiente comando de npm.
Una vez instalado en el proyecto, podremos hacer el require para traernos la funcionalidad de
la librera.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 22 de 25
Manual de Handlebars
dato2: 'valor2'
});
Ahora en la variable "salida" tendrs la cadena resultante de producir ese template con el juego
de datos que se le ha enviado por parmetro.
Con lo que has aprendido ya puedes producir tus cadenas con cualquier contenido definido en
una plantilla almacenada en un fichero externo. Por lo que respecta a la sintaxis y posiblidades
de Handlebars ya te recomiendo nuestro Manual de Handlebars o la propia documentacin
oficial.
Bsicamente se trata de crear un mdulo que tiene una nica funcin que sirve para obtener
un template y compilarlo. Este mdulo es el nico de mi aplicacin que conoce a Handlebars y
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 23 de 25
Manual de Handlebars
'use strict'
//sistema de archivos
let fs = require('fs');
//handlebars
module.exports = {
getTemplate
function getTemplate(archivo) {
return template;
Como ves, lo nico que exporta hacia afuera es el mtodo getTemplate, que recibe el archivo
que debe compilar para producir la correspondiente plantilla.
Con este mdulo generado, usarlo para producir plantillas en cualquier parte de mi proyecto es
tan sencillo como esto:
Quitando el require, que lo debes hacer una nica vez, la generacin de la plantilla se reduce a
una lnea de cdigo. No es que fuera muy compleja, esa compilacin, pero haba que ir al
sistema de archivos a traerse el cdigo del template, compilarlo, etc. Ahora queda mucho ms
conciso y la complejidad encapsulada en un sencillo mdulo.
Conclusin
Aprender Handlebars no te llevar ms de 10 minutos y usarlo para generar plantillas, con las
que producir salida cmodamente y en cualquier formato, te ahorrar mucho tiempo de
desarrollo, evitando cdigo difcil de mantener, a medio y largo plazo.
Con este artculo ahora lo tienes mucho ms fcil de integrar en NodeJS, por lo que no hay
excusas para comenzar a trabajar con este sencillo pero potente sistema de templates.
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 24 de 25
Manual de Handlebars
http://desarrolloweb.com/manuales/manual-handlebars.html Pgina 25 de 25