En este tutorial vas a aprender a crear una aplicacion de escritorio desde cero usando Electron y Bootstrap. Vamos a construir un login basico paso a paso. Es mas facil de lo que piensas.
Que es Electron?
Electron es un framework que te permite crear aplicaciones de escritorio usando tecnologias web: HTML, CSS y JavaScript. Aplicaciones como Visual Studio Code, Discord y Slack estan hechas con Electron.
La ventaja principal es que si ya sabes hacer paginas web, ya sabes hacer apps de escritorio.
Que necesitas antes de empezar?
- Node.js instalado (version 18 o superior). Descargalo desde nodejs.org
- Un editor de codigo (recomiendo Visual Studio Code)
- Conocimientos basicos de HTML, CSS y JavaScript
Paso 1: Crear la carpeta del proyecto
Abre tu terminal y ejecuta estos comandos para crear la carpeta y entrar en ella:
cd electron-login
Paso 2: Inicializar el proyecto con npm
Dentro de la carpeta, ejecuta:
Esto crea un archivo package.json con la configuracion basica del proyecto.
Ahora abre el archivo package.json y modificalo para que quede asi:
“name”: “electron-login”,
“version”: “1.0.0”,
“description”: “Login basico con Electron y Bootstrap”,
“main”: “main.js”,
“scripts”: {
“start”: “electron .”
},
“author”: “ProgramarEsFacil”,
“license”: “MIT”
}
Paso 3: Instalar Electron
En la terminal, ejecuta:
Esto descarga Electron como dependencia de desarrollo. Puede tardar un poco, es normal.
Paso 4: Crear el archivo principal (main.js)
Este es el cerebro de nuestra aplicacion. Aqui le decimos a Electron que ventana abrir y manejamos la logica del login.
Crea un archivo llamado main.js en la raiz del proyecto:
const path = require(‘path’);
function createWindow() {
const win = new BrowserWindow({
width: 500,
height: 600,
resizable: false,
autoHideMenuBar: true,
webPreferences: {
preload: path.join(__dirname, ‘preload.js’)
}
});
win.loadFile(‘login.html’);
}
// Usuario y contraseña de ejemplo
const USUARIO = ‘admin’;
const PASSWORD = ‘1234’;
ipcMain.handle(‘login’, (event, usuario, password) => {
if (usuario === USUARIO && password === PASSWORD) {
return { exito: true, mensaje: ‘Bienvenido ‘ + usuario };
} else {
return { exito: false, mensaje: ‘Usuario o contraseña incorrectos’ };
}
});
app.whenReady().then(() => {
createWindow();
});
app.on(‘window-all-closed’, () => {
app.quit();
});
Que hace cada parte?
- BrowserWindow: Crea la ventana de nuestra app (como una ventana del navegador pero sin barra de direcciones)
- ipcMain.handle(‘login’): Escucha cuando el formulario envia los datos y los valida
- app.whenReady(): Cuando Electron esta listo, crea la ventana
- webPreferences.preload: Carga un script puente que conecta el HTML con Electron de forma segura
Paso 5: Crear el archivo preload.js (el puente)
Este archivo es el puente entre la interfaz (HTML) y el proceso principal (main.js). Es una buena practica de seguridad en Electron.
contextBridge.exposeInMainWorld(‘api’, {
login: (usuario, password) => ipcRenderer.invoke(‘login’, usuario, password)
});
Que hace?
Expone una funcion window.api.login() que nuestro HTML puede usar para enviar el usuario y contraseña al proceso principal. Asi el HTML no tiene acceso directo a Node.js (esto es por seguridad).
Paso 6: Crear la interfaz del login (login.html)
Aqui es donde usamos Bootstrap para que se vea bonito sin complicarnos con CSS. Crea el archivo login.html:
<html lang=“es”>
<head>
<meta charset=“UTF-8”>
<meta name=“viewport” content=“width=device-width, initial-scale=1.0”>
<title>Login – Electron</title>
<link href=“https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css”
rel=“stylesheet”>
<style>
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.card {
border: none;
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
}
</style>
</head>
<body>
<div class=“card p-4” style=“width: 380px;”>
<div class=“card-body”>
<h3 class=“text-center mb-4”>Iniciar Sesion</h3>
<div id=“alerta” class=“alert d-none”></div>
<form id=“formLogin”>
<div class=“mb-3”>
<label for=“usuario” class=“form-label”>Usuario</label>
<input type=“text” class=“form-control” id=“usuario”
placeholder=“Escribe tu usuario” required>
</div>
<div class=“mb-3”>
<label for=“password” class=“form-label”>Contraseña</label>
<input type=“password” class=“form-control” id=“password”
placeholder=“Escribe tu contraseña” required>
</div>
<button type=“submit” class=“btn btn-primary w-100 mt-2”>
Entrar
</button>
</form>
</div>
</div>
<script>
const form = document.getElementById(‘formLogin’);
const alerta = document.getElementById(‘alerta’);
form.addEventListener(‘submit’, async (e) => {
e.preventDefault();
const usuario = document.getElementById(‘usuario’).value;
const password = document.getElementById(‘password’).value;
const resultado = await window.api.login(usuario, password);
alerta.classList.remove(‘d-none’, ‘alert-success’, ‘alert-danger’);
if (resultado.exito) {
alerta.classList.add(‘alert-success’);
} else {
alerta.classList.add(‘alert-danger’);
}
alerta.textContent = resultado.mensaje;
});
</script>
</body>
</html>
Estructura final del proyecto
Tu proyecto deberia verse asi:
├── node_modules/
├── login.html
├── main.js
├── preload.js
├── package.json
└── package-lock.json
Solo 4 archivos creados por ti. Asi de simple.
Paso 7: Ejecutar la aplicacion
En la terminal, dentro de la carpeta del proyecto, ejecuta:
Se abrira una ventana con tu formulario de login. Prueba con:
- Usuario: admin
- Contraseña: 1234
Si pones los datos correctos, veras un mensaje verde de bienvenida. Si te equivocas, veras un mensaje rojo de error.
Como funciona todo junto?
Vamos a entender el flujo completo:
- El usuario escribe su usuario y contraseña en el formulario (login.html)
- Al hacer clic en “Entrar”, el JavaScript del HTML llama a window.api.login()
- El preload.js recibe esa llamada y la envia al proceso principal usando ipcRenderer.invoke
- El main.js recibe los datos, los compara con el usuario y contraseña guardados
- Devuelve un resultado (exito o error) que el HTML muestra como alerta
Conceptos clave que aprendiste
- Proceso principal (main process): Es el archivo main.js. Controla la ventana y tiene acceso completo a Node.js
- Proceso de renderizado (renderer): Es el HTML que se muestra en la ventana. Solo puede usar JavaScript del navegador
- Preload: Es el puente seguro entre ambos procesos
- IPC (Inter-Process Communication): El sistema de mensajes que usa Electron para que ambos procesos se comuniquen
Conclusion
Acabas de crear tu primera aplicacion de escritorio con Electron. Con solo 4 archivos tienes un login funcional con una interfaz bonita gracias a Bootstrap.
A partir de aqui puedes mejorar el proyecto:
- Conectar el login a una base de datos real
- Agregar una pantalla de bienvenida despues del login
- Guardar sesiones con localStorage
- Empaquetar la app como un .exe con electron-builder
Recuerda: programar es facil si lo haces paso a paso.

