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:

javascript
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:

javascript
// 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 llamado index.ejs dentro de la carpeta views y mu茅stralo".

  • Express ya sabe que debe buscar .ejs porque lo configuramos con app.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:

html
<!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铆:

text
ejs-node/
├── node_modules/
├── views/
│   └── index.ejs
├── app.js
├── package.json
└── package-lock.json

4️⃣ Ejecutar y ver el resultado

En la terminal:

bash
node app.js

O si configuraste el script start:

bash
npm start

Abre http://localhost:3000 y ver谩s:

text
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:

javascript
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:

html
<!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:

SintaxisFunci贸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.ejstienes 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:

bash
npm install nodemon --save-dev

Modificar el script start en package.json:

json
"scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
}

Ejecutar en modo desarrollo:

bash
npm run dev

Ahora Nodemon vigilar谩 los cambios y reiniciar谩 el servidor autom谩ticamente. Ver谩s en consola:

text
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
servidor en puerto 3000

馃挕 Nota: Guarda nodemon como 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:

javascript
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

ConceptoAprendizaje
res.render()Renderiza una plantilla EJS
Carpeta viewsLugar donde van los archivos .ejs
Sintaxis <%= %>Mostrar variables en la vista
Sintaxis <% %>Ejecutar l贸gica JavaScript en la plantilla
NodemonHerramienta 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 (o express.urlencoded()) para recibir datos del formulario

  • Almacenar 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-parser como dependencia externa. En versiones actuales de Express (4.16+), no es necesario instalarlo. Puedes reemplazarlo por:

javascript
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

Entradas m谩s populares de este blog

C贸mo Iniciar un Proyecto Node.js

9-Nuestra Primera Plantilla con EJS

Lista de tareas-routing y plantillas