2: Motor de plantillas EJS
馃幆 Objetivo de esta parte
Aprender a usar EJS como motor de plantillas para renderizar vistas HTML din谩micas, en lugar de enviar texto plano con res.send().
1️⃣ Recordatorio: ¿D贸nde est谩bamos?
En la parte 1 ten铆amos un servidor que respond铆a "hola mundo" como texto plano:
app.get('/', (req, res) => {
res.send('hola mundo');
});Ahora vamos a cambiar eso para que renderice un archivo HTML con EJS.
2️⃣ Cambiar res.send por res.render
Modifica la ruta principal en tu app.js:
// ANTES
app.get('/', (req, res) => {
res.send('hola mundo');
});
// AHORA
app.get('/', (req, res) => {
res.render('index');
});馃摉 Explicaci贸n:
res.render('index')le dice a Express: "busca un archivo llamadoindex.ejsdentro de la carpetaviewsy mu茅stralo".Express ya sabe que debe buscar
.ejsporque lo configuramos conapp.set('view engine', 'ejs').
3️⃣ Crear el archivo index.ejs
Dentro de la carpeta views, crea un archivo llamado index.ejs con el siguiente contenido:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mi App con EJS</title>
</head>
<body>
<h1>Bienvenido a EJS</h1>
<p>Esto es un archivo de plantilla EJS</p>
</body>
</html>Tu estructura de archivos deber铆a verse as铆:
ejs-node/
├── node_modules/
├── views/
│ └── index.ejs
├── app.js
├── package.json
└── package-lock.json4️⃣ Ejecutar y ver el resultado
En la terminal:
node app.jsO si configuraste el script start:
npm startAbre http://localhost:3000 y ver谩s:
Bienvenido a EJS
Esto es un archivo de plantilla EJS馃帀 Felicidades: Ya est谩s usando un motor de plantillas.
5️⃣ Pasar datos desde el servidor a la vista
Lo interesante de EJS es que puedes inyectar datos din谩micos. Modifica app.js:
app.get('/', (req, res) => {
const nombre = 'Juan';
const tareas = ['Estudiar Node', 'Hacer ejercicio', 'Leer un libro'];
res.render('index', {
titulo: 'Mi App de Tareas',
usuario: nombre,
listaTareas: tareas
});
});Y modifica index.ejs:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><%= titulo %></title>
</head>
<body>
<h1>Hola <%= usuario %></h1>
<h2>Tareas pendientes:</h2>
<ul>
<% for(let i = 0; i < listaTareas.length; i++) { %>
<li><%= listaTareas[i] %></li>
<% } %>
</ul>
</body>
</html>馃摉 Sintaxis EJS b谩sica:
| Sintaxis | Funci贸n |
|---|---|
<%= variable %> | Muestra el valor escapado (seguro para HTML) |
<%- variable %> | Muestra el valor sin escapar (peligroso si es HTML del usuario) |
<% codigo %> | Ejecuta c贸digo JavaScript sin mostrar nada |
6️⃣ ⚠️ El problema: reiniciar el servidor manualmente
Cada vez que hagas un cambio en app.js o en index.ejs, tienes que reiniciar el servidor manualmente (Ctrl+C y node app.js de nuevo).
Esto es tedioso y ralentiza el desarrollo.
7️⃣ Soluci贸n: Nodemon (desarrollo m谩s 谩gil)
Nodemon es una herramienta que reinicia autom谩ticamente el servidor cuando detecta cambios.
Instalar nodemon como dependencia de desarrollo:
npm install nodemon --save-devModificar el script start en package.json:
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}Ejecutar en modo desarrollo:
npm run devAhora Nodemon vigilar谩 los cambios y reiniciar谩 el servidor autom谩ticamente. Ver谩s en consola:
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
servidor en puerto 3000馃挕 Nota: Guarda
nodemoncomo dependencia de desarrollo (--save-dev) porque solo lo usamos durante la programaci贸n, no en producci贸n.
8️⃣ Tu c贸digo final en app.js (con body-parser incluido)
Seg煤n tus im谩genes, tu app.js actual incluye body-parser. Aunque no lo usamos a煤n, lo dejamos preparado para la Parte 3:
const express = require('express');
const morgan = require('morgan');
const path = require('path');
const bodyParser = require('body-parser');
const app = express();
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.get('/', (req, res) => {
res.render('index');
});
app.listen(app.get('port'), () => {
console.log(`servidor en puerto ${app.get('port')}`);
});馃摑 Resumen de esta parte
| Concepto | Aprendizaje |
|---|---|
res.render() | Renderiza una plantilla EJS |
Carpeta views | Lugar donde van los archivos .ejs |
Sintaxis <%= %> | Mostrar variables en la vista |
Sintaxis <% %> | Ejecutar l贸gica JavaScript en la plantilla |
| Nodemon | Herramienta para reinicio autom谩tico |
馃殌 Pr贸xima parte: App de tareas con POST y listado din谩mico
En la Parte 3 vamos a:
Crear un formulario para agregar tareas
Usar
body-parser(oexpress.urlencoded()) para recibir datos del formularioAlmacenar tareas temporalmente en un arreglo
Mostrar la lista actualizada de tareas
馃攣 Nota final sobre body-parser (como lo pediste)
馃搶 Nota: En las im谩genes que compartiste se usa
body-parsercomo dependencia externa. En versiones actuales de Express (4.16+), no es necesario instalarlo. Puedes reemplazarlo por:app.use(express.json()); app.use(express.urlencoded({ extended: false }));Lo mantendremos como est谩 en el c贸digo por fidelidad a tus im谩genes, pero ten en cuenta que es un paquete obsoleto para versiones recientes de Express.
¿Quieres que contin煤e con la Parte 3 donde haremos el CRUD b谩sico de tareas con formularios y listado din谩mico?
Comentarios
Publicar un comentario