8-Template Engines
¿Qué es un Motor de Plantillas?
tu-proyecto/ ├── public/ # Carpeta para archivos estáticos │ ├── css/ │ │ └── styles.css │ ├── js/ │ │ └── script.js │ └── images/ │ └── logo.png ├── index.ejs # Plantilla EJS (en raíz) ├── app.js # Servidor Express └── package.json # Dependencias
Un motor de plantillas es una herramienta que permite generar contenido HTML (u otros formatos) de manera dinámica, insertando datos en estructuras predefinidas. Esto facilita:
La función app.set() en Express se usa para asignar configuraciones globales a la aplicación. En el caso de view engine, está configurando el sistema de plantillas.
Parámetros:
Primer parámetro (
'view engine'):Es una clave de configuración predefinida por Express.
Su único propósito es indicar a Express qué motor de plantillas usar por defecto cuando se llama a
res.render().No es modificable — siempre debe ser el string
'view engine'.
Segundo parámetro (
'ejs'):Es el nombre del paquete del motor de plantillas instalado (en este caso, el paquete
ejs).Configura Express para usar EJS como motor de plantillas. Esto significa que:
Los archivos con extensión
.ejsse procesarán automáticamente.Podrás usar sintaxis EJS (
<% %>,<%= %>, etc.) en tus plantillas.Cuando llames
res.render('archivo'), Express buscaráarchivo.ejs.
Ejemplo práctico:
res.render('index'); // Buscará "index.ejs" y lo renderizará como HTML
app.set()
Función: Establece configuraciones en Express.
Primer parámetro (
'views'):Es una clave predefinida de Express (como
'view engine').Indica que estás configurando la ruta de la carpeta de plantillas.
¡Debe ser exactamente
'views'! (Express lo espera así).
Segundo parámetro (
path.join(__dirname)):Define la ruta absoluta donde están las plantillas.
Usa
path.join()y__dirnamepara garantizar compatibilidad entre sistemas operativos (Windows/macOS/Linux).
La diferencia clave: 'views' vs. el nombre real de la carpeta
Cuando usas:
app.set('views', path.join(__dirname));'views'es solo el nombre de la configuración en Express (no el nombre de la carpeta).path.join(__dirname)define que las plantillas están directamente en la raíz del proyecto (sin carpetaviews).
Estructura resultante (correcta):
/home/usuario/proyecto/
├── app.js # Archivo principal
├── index.ejs # Plantilla EJS (en raíz)
└── public/ # (Opcional) Carpeta de archivos estáticos
├── css/
└── js/¿Por qué funciona así?
Lógica de Express:
app.set('views', ruta)solo dice "busca plantillas en esta ubicación".No crea automáticamente una carpeta llamada
views.
En tu código:
app.set('views', path.join(__dirname)); // Apunta a /home/usuario/proyecto/ res.render('index'); // Buscará /home/usuario/proyecto/index.ejs
1. Crear una carpeta personalizada para plantillas
Primero, crea una carpeta en tu proyecto (ej: templates, plantillas, pages).
Ejemplo de estructura:
mi-proyecto/
├── app.js
├── templates/ # ← Carpeta personalizada para .ejs
│ ├── index.ejs
│ └── about.ejs
└── package.json🔧 2. Configurar Express para usar esa carpeta
En app.js, usa path.join() para definir la ruta absoluta de tu carpeta:
const express = require('express');
const path = require('path'); // Importar el módulo 'path'
const app = express();
// Configurar EJS y la carpeta personalizada
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'templates')); // ← ¡Apunta a tu carpeta!
// Rutas
app.get('/', (req, res) => {
res.render('index'); // Buscará en templates/index.ejs✅ Separación de lógica y presentación
✅ Reutilización de componentes
✅ Renderizado rápido del lado del servidor
const express = require('express');
const app = express();
const path = require('path');
// Configurar EJS (plantillas en raíz)
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname)); // Busca plantillas en el directorio actual
// Servir archivos estáticos desde /public
app.use(express.static(path.join(__dirname, 'public')));
// Ruta principal
app.get('/', (req, res) => {
res.render('index', { nombreUsuario: 'Juan' });
});
app.listen(3000, () => {
console.log('Servidor en http://localhost:3000');
});Motores de Plantillas Populares en Node.js
1. EJS (Embedded JavaScript)
Uno de los más sencillos y similares a HTML tradicional.
Características:
🔹 Sintaxis familiar con <% %> para código JS.
🔹 Fácil integración con Express.
Ejemplo:
<h1>Hola, <%= nombreUsuario %></h1>Instalación:
npm install ejs2. Pug (antes Jade)
Un motor de plantillas con sintaxis minimalista basada en indentación.
Características:
🔹 Menos código gracias a su sintaxis simplificada.
🔹 Soporta herencia de plantillas.
Ejemplo:
h1 Hola, #{nombreUsuario}Instalación:
npm install pug3. Handlebars
Inspirado en Mustache, con sintaxis limpia y soporte para helpers.
Características:
🔹 Sintaxis {{ }} fácil de leer.
🔹 Soporta bloques parciales y lógica condicional.
Ejemplo:
<h1>Hola, </h1>Instalación:
npm install express-handlebars4. Nunjucks
Desarrollado por Mozilla, potente y altamente configurable.
Características:
🔹 Herencia de plantillas avanzada.
🔹 Filtros y macros para reutilización.
Ejemplo:
<h1>Hola, {{ nombreUsuario }}</h1>Instalación:
npm install nunjucks¿Cómo Usar un Motor de Plantillas con Express?
Aquí un ejemplo básico con EJS:
const express = require('express');
const app = express();
// Configurar EJS como motor de plantillas
app.set('view engine', 'ejs');
// Ruta para renderizar una vista
app.get('/', (req, res) => {
res.render('index', { nombreUsuario: 'Juan' });
});
app.listen(3000, () => {
console.log('Servidor en http://localhost:3000');
});¿Cuál Elegir?
🔸 EJS: Ideal si buscas algo simple y similar a HTML.
🔸 Pug: Perfecto si prefieres sintaxis minimalista.
🔸 Handlebars: Excelente para proyectos con lógica de plantillas modular.
🔸 Nunjucks: Potente y flexible para aplicaciones complejas.
Conclusión
Los motores de plantillas son esenciales para desarrollar aplicaciones web dinámicas en Node.js. Dependiendo de tus necesidades, puedes elegir entre opciones como EJS, Pug, Handlebars o Nunjucks, cada una con sus propias ventajas.
¿Ya has usado alguno? ¡Cuéntanos tu experiencia en los comentarios!
Estructura propuesta (sin carpeta views):
tu-proyecto/
├── public/ # Carpeta para archivos estáticos
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ └── script.js
│ └── images/
│ └── logo.png
├── index.ejs # Plantilla EJS (en raíz)
├── app.js # Servidor Express
└── package.json # Dependencias🔧 Código modificado (app.js):
const express = require('express');
const app = express();
const path = require('path');
// Configurar EJS como motor de plantillas
app.set('view engine', 'ejs');
// Indicar que las plantillas están en el directorio raíz (no en 'views')
app.set('views', path.join(__dirname));
// Ruta para renderizar la vista
app.get('/', (req, res) => {
res.render('index', { nombreUsuario: 'Juan' }); // Buscará index.ejs en la raíz
});
app.listen(3000, () => {
console.log('Servidor en http://localhost:3000');
});📝 Explicación:
app.set('views', path.join(__dirname)):Le dice a Express que busque las plantillas en el directorio actual (en lugar de la carpeta
viewspor defecto).__dirnamees la ruta absoluta del directorio donde estáapp.js.
index.ejsen la raíz:El archivo debe estar al mismo nivel que
app.js.Ejemplo de contenido (
index.ejs):<!DOCTYPE html> <html> <head> <title>Mi App</title> </head> <body> <h1>Bienvenido, <%= nombreUsuario %></h1> </body> </html>
⚠️ Consideraciones:
No es la convención estándar: Express espera por defecto la carpeta
views, pero esto funciona si prefieres evitar carpetas adicionales.Puede volverse desordenado: Si tienes muchas plantillas, es mejor organizarlas en
views/.
🔥 Alternativa recomendada (si cambias de opinión):
Si luego decides usar la carpeta views, solo debes:
Crear la carpeta
viewsy mover ahíindex.ejs.Eliminar la línea
app.set('views', path.join(__dirname))(Express usaráviews/por defecto).
Template Engines en Express: Potencia tus Vistas con EJS
¿Qué son los Template Engines?
Los motores de plantillas (como EJS) te permiten:
Generar HTML dinámico en el servidor
Inyectar datos de JavaScript directamente en tus vistas
Reutilizar componentes (headers, footers, etc.)
Simplificar la creación de interfaces complejas

🔧 Configuración Express + EJS (Paso a Paso)
1. Instalación
npm install ejs2. Configuración básica en Express
const express = require('express');
const app = express();
// Configurar EJS como motor de plantillas
app.set('view engine', 'ejs');
app.set('views', './views'); // Carpeta donde estarán las plantillas
// Ruta para renderizar una vista
app.get('/', (req, res) => {
res.render('index', {
title: 'Mi Sitio Web',
user: { name: 'Ana' }
});
});🧩 Sintaxis EJS Esencial
Insertar valores
<!-- views/index.ejs -->
<h1>Bienvenido a <%= title %></h1>
<p>Usuario: <%= user.name %></p>Condicionales
<% if (user) { %>
<p>Bienvenido de vuelta, <%= user.name %>!</p>
<% } else { %>
<a href="/login">Iniciar sesión</a>
<% } %>Bucles
<ul>
<% products.forEach(product => { %>
<li><%= product.name %> - $<%= product.price %></li>
<% }); %>
</ul>🏗️ Estructura de archivos recomendada
project/
├── views/
│ ├── partials/
│ │ ├── header.ejs
│ │ └── footer.ejs
│ ├── pages/
│ │ ├── index.ejs
│ │ └── about.ejs
│ └── layouts/
│ └── main.ejs
└── app.js🧠 Conceptos Avanzados
1. Layouts (Plantillas base)
layouts/main.ejs
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<%- include('../partials/header') %>
<main>
<%- body %> <!-- Aquí se inyecta el contenido específico -->
</main>
<%- include('../partials/footer') %>
</body>
</html>Uso en rutas:
app.get('/', (req, res) => {
res.render('pages/index', {
title: 'Inicio',
body: 'Contenido principal aquí'
});
});2. Includes (Componentes reutilizables)
partials/header.ejs
<header>
<nav>
<a href="/">Inicio</a>
<a href="/about">Acerca de</a>
</nav>
</header>Inclusión en otras vistas:
<%- include('partials/header') %>💡 Mejores Prácticas
Mantén la lógica mínima en las vistas
Preprocesa datos en el controlador antes de pasarlos a la vista
Usa partials para elementos repetitivos
Organiza tus vistas en subcarpetas lógicas
Escapa datos dinámicos con
<%= %>para seguridad XSS
🚀 Ejemplo Completo: Blog Simple
// app.js
app.get('/posts', (req, res) => {
const posts = [
{ id: 1, title: 'Primer post', content: 'Contenido...' },
{ id: 2, title: 'Segundo post', content: 'Más contenido...' }
];
res.render('posts/list', { posts });
});views/posts/list.ejs
<%- include('../layouts/main') %>
<% content_for('body') { %>
<h1>Últimos Posts</h1>
<% posts.forEach(post => { %>
<article>
<h2><%= post.title %></h2>
<p><%= post.content %></p>
</article>
<% }); %>
<% } %>📌 Conclusión
EJS es perfecto para:
✅ Proyectos que necesitan SSR (Server-Side Rendering)
✅ Desarrolladores que ya conocen HTML/JS
✅ Aplicaciones medianas donde React/Vue serían excesivo
Tip Extra: Combínalo con express-ejs-layouts para un sistema de layouts más robusto:
npm install express-ejs-layouts¿Quieres profundizar? Prueba estos temas avanzados:
Filtros personalizados
Helpers globales
Internacionalización
Caché de plantillas
¡Ahora tienes todo para crear vistas dinámicas profesionales con Express y EJS! 🚀
Comentarios
Publicar un comentario