Cómo Instalar y Configurar Node.js y NPM en Windows
Node.js es un entorno de ejecución de JavaScript de código abierto y multiplataforma construido sobre el motor V8 de Chrome que ejecuta código JavaScript fuera de un navegador. NPM (Node Package Manager) es el gestor de paquetes predeterminado incluido con Node.js, que proporciona acceso a más de dos millones de paquetes reutilizables. Juntos, forman la cadena de herramientas fundamental para crear aplicaciones del lado del servidor, herramientas CLI, REST APIs y proyectos JavaScript full-stack en Windows.
Esta guía cubre el flujo de trabajo completo de instalación, verificación, configuración y primera aplicación para Node.js y NPM en Windows — incluyendo gestión de versiones, solución de problemas de PATH, alcance de paquetes globales vs. locales, y consideraciones de nivel de producción que la mayoría de los tutoriales omiten.
Elegir la versión correcta de Node.js antes de instalar
El calendario de lanzamientos de Node.js sigue una cadencia predecible que afecta directamente a tu elección:
| Tipo de lanzamiento | Estabilidad | Caso de uso | Ventana de soporte |
|---|---|---|---|
| — | — | — | — |
| **LTS (Soporte a largo plazo)** | Alta | Cargas de trabajo en producción, entornos de equipo | 30 meses |
| **Current** | Moderada | Acceso a las últimas características del motor V8 | 6 meses |
| **Nightly / RC** | Experimental | Colaboradores del núcleo, pruebas de vanguardia | Sin garantía |
Las versiones LTS llevan números de versión principal pares (p. ej., 20.x, 22.x) y reciben parches de seguridad críticos durante 30 meses. Las versiones Current llevan números de versión principal impares y pasan al estado LTS después de seis meses si cumplen los criterios de estabilidad.
Para la mayoría de los desarrolladores y despliegues en servidor — incluyendo aplicaciones alojadas en VPS Hosting — LTS es la elección correcta. La rama Current solo es apropiada cuando necesitas específicamente una característica de V8 o una API de Node.js que aún no ha llegado a la línea LTS activa.
NVM para Windows: la alternativa profesional a la instalación directa
Antes de continuar con el instalador MSI, considera si necesitas nvm-for-windows (Node Version Manager para Windows). El instalador directo vincula tu sistema a una única versión de Node.js. NVM te permite instalar múltiples versiones en paralelo y cambiar entre ellas por proyecto — algo crítico cuando se mantienen bases de código heredadas junto a las modernas.
Instala nvm-for-windows desde su página oficial de lanzamientos en GitHub, luego usa:
“`
nvm install 20.14.0
nvm use 20.14.0
nvm list
“`
Si estás gestionando un único proyecto o aprendiendo Node.js por primera vez, el instalador MSI es suficiente. Para entornos profesionales, se recomienda encarecidamente NVM.
Paso 1: Descargar el instalador de Node.js
- Navega al sitio web oficial de Node.js en nodejs.org.
- Selecciona la pestaña LTS y descarga el instalador de Windows (`.msi`) para tu arquitectura. Casi todas las máquinas Windows modernas son de 64 bits (`node-v20.x.x-x64.msi`). Las compilaciones ARM64 están disponibles para dispositivos Windows on ARM.
- Verifica el checksum SHA-256 del archivo descargado comparándolo con los valores publicados en la página de descargas de Node.js antes de ejecutar el instalador. Este paso es innegociable en cualquier entorno con conciencia de seguridad.
Para verificar el checksum en PowerShell:
“`powershell
Get-FileHash .node-v20.14.0-x64.msi -Algorithm SHA256
“`
Compara la salida con el hash publicado. Una discrepancia indica una descarga corrupta o manipulada.
Paso 2: Instalar Node.js y NPM
- Haz doble clic en el archivo `.msi` descargado para iniciar el Asistente de instalación.
- Haz clic en Siguiente en la pantalla de bienvenida.
- Acepta el Contrato de licencia de usuario final y haz clic en Siguiente.
- La ruta de instalación predeterminada es `C:Program Filesnodejs`. A menos que tengas una razón específica para cambiarla (p. ej., una unidad que no sea del sistema para gestión del espacio en disco), déjala como está.
- En la pantalla de Configuración personalizada, confirma que el gestor de paquetes npm está seleccionado. Está habilitado de forma predeterminada.
- En la pantalla de Herramientas para módulos nativos, verás una opción para instalar automáticamente Chocolatey, Python y Visual Studio Build Tools. Marca esta casilla si prevés instalar paquetes NPM que incluyan complementos nativos de C++ (p. ej., paquetes dependientes de `bcrypt`, `sharp`, `node-gyp`). Este paso instala varios gigabytes de herramientas — omítelo si solo necesitas paquetes JavaScript puros.
- Haz clic en Instalar y luego en Finalizar.
El instalador registra automáticamente `node.exe` y `npm.cmd` en la variable de entorno `PATH` de tu sistema bajo `C:Program Filesnodejs`.
Lo que el instalador realmente hace en tu sistema
Entender los efectos secundarios evita futuros dolores de cabeza al depurar:
- Añade `C:Program Filesnodejs` al PATH del sistema (disponible para todos los usuarios).
- Crea `C:Users<username>AppDataRoamingnpm` como prefijo de paquete global predeterminado.
- Registra Node.js en el registro de Windows bajo `HKLMSOFTWARENode.js`.
- Instala `npx` (el ejecutor de paquetes NPM) junto con `npm`.
Paso 3: Verificar la instalación
Abre una ventana nueva de Símbolo del sistema o PowerShell. El calificador “nueva” importa — las sesiones de terminal existentes almacenan en caché el PATH antiguo y no reflejarán los cambios del instalador.
“`
node -v
“`
Salida esperada: `v20.14.0` (o tu versión instalada)
“`
npm -v
“`
Salida esperada: `10.x.x`
“`
npx -v
“`
Salida esperada: coincide o es cercana a la versión de npm
Si `node` no es reconocido, el PATH no se actualizó correctamente. Corrígelo manualmente:
- Abre Propiedades del sistema > Opciones avanzadas > Variables de entorno.
- En Variables del sistema, busca `Path` y haz clic en Editar.
- Añade `C:Program Filesnodejs` si está ausente.
- Haz clic en Aceptar, cierra todas las ventanas de terminal y vuelve a abrirlas.
Diagnóstico de problemas comunes tras la instalación
Problema: `npm` es reconocido pero `node` no lo es (o viceversa).
Causa: Una entrada de PATH parcial o una instalación en conflicto de Chocolatey o una configuración anterior de NVM.
Solución: Ejecuta `where node` y `where npm` para identificar qué binarios se están resolviendo. Elimina las entradas obsoletas.
Problema: Errores de permisos `EACCES` al ejecutar `npm install -g`.
Causa: El directorio de prefijo global carece de permisos de escritura para el usuario actual.
Solución: Cambia el prefijo global a un directorio propiedad del usuario (cubierto en el Paso 5).
Problema: `node` abre la Microsoft Store en lugar de ejecutar Node.js.
Causa: Windows 10/11 incluye un Alias de ejecución de aplicaciones para `node` que redirige a la Store.
Solución: Ve a Configuración > Aplicaciones > Alias de ejecución de aplicaciones y deshabilita los alias para `python.exe` y `node.exe` (si están presentes).
Paso 4: Actualizar NPM a la última versión
La versión de NPM incluida con un instalador de Node.js suele estar una o dos versiones menores por detrás de la versión actual. Actualízala inmediatamente después de la instalación:
“`
npm install -g npm@latest
“`
El indicador `-g` instala el paquete en el directorio de prefijo global, haciéndolo disponible en todo el sistema. Después de la actualización, vuelve a verificar:
“`
npm -v
“`
Caso límite importante: En Windows, actualizar NPM globalmente puede ocasionalmente dejar un `npm.cmd` obsoleto en `C:Program Filesnodejs` apuntando a la versión antigua mientras la nueva versión está instalada en `C:Users<username>AppDataRoamingnpm`. Si `npm -v` sigue mostrando la versión antigua después de actualizar, comprueba qué binario aparece primero en PATH:
“`
where npm
“`
La ruta bajo `AppDataRoamingnpm` debería aparecer antes que `C:Program Filesnodejs` en la salida. Si no es así, reordena las entradas de PATH en consecuencia.
Paso 5: Configurar NPM para tu entorno
La configuración de NPM se almacena en un archivo `.npmrc`, que puede existir en tres niveles: por proyecto, por usuario (`C:Users<username>.npmrc`) y global (`C:Program Filesnodejsnode_modulesnpmnpmrc`). La configuración por proyecto anula la configuración por usuario, que anula la configuración global.
Cambiar el prefijo de paquete global
El prefijo global predeterminado (`AppDataRoamingnpm`) funciona para la mayoría de los usuarios, pero en servidores compartidos o cuando se aplican cuotas de disco, puede que quieras redirigirlo:
“`
npm config set prefix "D:NodeGlobal"
“`
Después de cambiar el prefijo, añade el nuevo subdirectorio `bin` a tu PATH:
“`
setx PATH "%PATH%;D:NodeGlobal"
“`
Configurar un registro privado o espejo
Los entornos corporativos y los servidores sin acceso a internet frecuentemente utilizan un registro NPM privado (Verdaccio, Nexus, Artifactory):
“`
npm config set registry "https://your-private-registry.example.com/"
“`
Para autenticarse contra un registro privado:
“`
npm login –registry=https://your-private-registry.example.com/
“`
Solo para paquetes con alcance (p. ej., `@mycompany/*`), puedes enrutar únicamente ese alcance a un registro privado mientras dejas intacto el registro público:
“`
npm config set @mycompany:registry "https://your-private-registry.example.com/"
“`
Configurar un proxy HTTP
Si tu máquina Windows está detrás de un proxy corporativo:
“`
npm config set proxy "http://proxy.company.com:8080"
npm config set https-proxy "http://proxy.company.com:8080"
“`
Auditar toda la configuración actual
“`
npm config list
npm config list –json
“`
El indicador `–json` genera una configuración legible por máquina, útil para scripts y diagnósticos de pipelines CI/CD.
Referencia de configuración útil de NPM
| Clave de configuración | Valor predeterminado | Propósito |
|---|---|---|
| — | — | — |
| `prefix` | `%APPDATA%npm` | Ubicación de instalación de paquetes globales |
| `registry` | `https://registry.npmjs.org/` | Registro de origen de paquetes |
| `cache` | `%APPDATA%npm-cache` | Directorio de caché de paquetes locales |
| `save-exact` | `false` | Fijar versiones exactas en `package.json` |
| `fund` | `true` | Mostrar mensajes de financiación tras la instalación |
| `audit` | `true` | Ejecutar auditoría de seguridad al instalar |
Paso 6: Crear y ejecutar una aplicación Node.js
Inicializar el proyecto
“`
mkdir my-node-app
cd my-node-app
npm init -y
“`
`npm init -y` genera un `package.json` con valores predeterminados derivados del nombre del directorio y tu configuración de usuario de NPM. El archivo `package.json` es el manifiesto de tu aplicación — define el punto de entrada, scripts, dependencias y metadatos.
Crear un servidor HTTP básico
Crea `app.js` en el directorio del proyecto:
“`javascript
// app.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
“`
Ejecútalo:
“`
node app.js
“`
Navega a `http://127.0.0.1:3000/` en tu navegador. Deberías ver `Hello, World!`.
Nota técnica: Node.js utiliza un bucle de eventos de un solo hilo respaldado por libuv para operaciones de I/O. El callback `http.createServer` se activa en cada solicitud entrante sin bloquear el bucle. Esta arquitectura hace que Node.js sea muy eficiente para cargas de trabajo con uso intensivo de I/O, pero no es adecuado para tareas con uso intensivo de CPU sin hilos de trabajo o procesos secundarios.
Añadir el framework Express
Express es el framework HTTP estándar de facto para Node.js, que proporciona enrutamiento, soporte de middleware y una abstracción limpia de solicitud/respuesta:
“`
npm install express
“`
Esto instala Express localmente (en `node_modules/`) y lo registra como dependencia en `package.json`. Actualiza `app.js`:
“`javascript
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello from Express!');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
“`
“`
node app.js
“`
Visita `http://localhost:3000/` para confirmar la respuesta.
Entender `node_modules` y `.gitignore`
El directorio `node_modules` puede contener cientos de megabytes de archivos. Nunca lo incluyas en el control de versiones. Crea un archivo `.gitignore`:
“`
node_modules/
.env
“`
Los colaboradores y los pipelines de despliegue restauran las dependencias ejecutando `npm install`, que lee `package.json` y `package-lock.json` para reproducir el árbol de dependencias exacto.
Paso 7: Gestión de paquetes — local vs. global
Entender la distinción entre la instalación de paquetes local y global es una de las fuentes de confusión más comunes para los recién llegados a Node.js.
| Alcance | Comando de instalación | Ubicación | Caso de uso |
|---|---|---|---|
| — | — | — | — |
| **Local** | `npm install <pkg>` | `./node_modules/` | Dependencias de la aplicación |
| **Local Dev** | `npm install –save-dev <pkg>` | `./node_modules/` | Herramientas de compilación, ejecutores de pruebas |
| **Global** | `npm install -g <pkg>` | `%APPDATA%npm` | Herramientas CLI (p. ej., `nodemon`, `pm2`) |
Regla clave: Si un paquete proporciona una herramienta de línea de comandos que quieres disponible en todas partes (p. ej., `nodemon`, `eslint`, `typescript`), instálalo globalmente. Si es una biblioteca que tu aplicación importa con `require()` o `import`, instálala localmente.
Ejecutar aplicaciones en producción con PM2
Para cualquier aplicación Node.js desplegada en un servidor — ya sea en una instancia de VPS Hosting o en un Servidor Dedicado — ejecutar `node app.js` directamente es insuficiente. El proceso terminará si se cierra el terminal o se produce una excepción no controlada.
PM2 es el gestor de procesos estándar para Node.js en producción:
“`
npm install -g pm2
pm2 start app.js –name "my-app"
pm2 startup
pm2 save
“`
`pm2 startup` genera un comando para configurar PM2 para reiniciar tu aplicación automáticamente al reiniciar el sistema. `pm2 save` persiste la lista de procesos actual.
Paso 8: Refuerzo de seguridad y auditoría
Ejecutar una auditoría de dependencias
“`
npm audit
“`
NPM cruza tus paquetes instalados con la Base de datos de avisos de GitHub. Cualquier vulnerabilidad conocida se reporta con niveles de gravedad (baja, moderada, alta, crítica) y rutas de corrección.
“`
npm audit fix
“`
Esto actualiza automáticamente los paquetes vulnerables a la versión parcheada más cercana sin cambios disruptivos. Para cambios disruptivos, revisa la salida y actualiza manualmente.
Fijar versiones de dependencias
En `package.json`, NPM utiliza rangos de versionado semántico de forma predeterminada (`^1.2.3` permite actualizaciones menores y de parche). En producción, fija versiones exactas para evitar sorpresas en la cadena de suministro:
“`
npm config set save-exact true
“`
O reemplaza manualmente los prefijos `^` con cadenas de versión exactas en `package.json` y confirma el archivo `package-lock.json`.
Evitar ejecutar NPM como administrador
Ejecutar `npm install -g` con privilegios elevados escribe archivos propiedad de la cuenta de Administrador, lo que puede causar errores de permisos para operaciones posteriores sin elevación. Configura un prefijo global propiedad del usuario (ver Paso 5) para eliminar completamente la necesidad de privilegios elevados.
Desplegar aplicaciones Node.js en un servidor
El desarrollo local es solo la primera etapa. El despliegue en producción introduce requisitos adicionales: gestión de procesos, proxy inverso, terminación TLS y gestión de variables de entorno.
Una pila de producción típica en un VPS Hosting Linux combina Node.js con Nginx como proxy inverso. Nginx gestiona la terminación TLS (usando certificados de un proveedor como Certificados SSL) y reenvía las solicitudes al proceso Node.js que escucha en un puerto local.
Para equipos que prefieren un entorno de panel de control gestionado, VPS con cPanel proporciona gestión de aplicaciones Node.js a través de la interfaz de cPanel, simplificando el despliegue sin requerir configuración directa por SSH.
La configuración específica del entorno (credenciales de base de datos, claves API, números de puerto) nunca debe estar codificada de forma fija. Usa un archivo `.env` con el paquete `dotenv`:
“`
npm install dotenv
“`
“`javascript
require('dotenv').config();
const port = process.env.PORT || 3000;
“`
Matriz de decisión: cuándo usar cada método de instalación
| Escenario | Enfoque recomendado |
|---|---|
| — | — |
| Proyecto único, aprendiendo Node.js | Instalador MSI, versión LTS |
| Múltiples proyectos con diferentes versiones de Node.js | nvm-for-windows |
| Pipeline CI/CD en Windows Server | Instalador MSI o Chocolatey (`choco install nodejs-lts`) |
| Servidor Linux de producción | Gestor de paquetes (apt/yum) o nvm |
| Aplicación en contenedor | Imagen Docker oficial `node` |
| Entorno corporativo sin acceso a internet | MSI sin conexión + registro NPM privado (Verdaccio) |
Conclusiones técnicas clave
- Instala siempre la versión LTS para entornos de producción y de equipo. Usa la versión Current solo cuando se requiera una característica específica de V8 o de la API de Node.js.
- Usa nvm-for-windows en cualquier entorno donde deban coexistir múltiples versiones de Node.js.
- Verifica el checksum SHA-256 del instalador antes de ejecutarlo.
- Cambia el prefijo global de NPM a un directorio propiedad del usuario para evitar errores de permisos y eliminar la necesidad de privilegios elevados.
- Nunca incluyas `node_modules/` en el control de versiones. Incluye siempre `package-lock.json`.
- Ejecuta `npm audit` después de cada `npm install` en los pipelines de producción.
- Usa PM2 para la gestión de procesos en cualquier despliegue en servidor — nunca ejecutes `node app.js` directamente en producción.
- Termina TLS en la capa de proxy inverso (Nginx, Caddy) en lugar de dentro del proceso Node.js para un mejor rendimiento y gestión de certificados.
- Almacena los secretos en variables de entorno cargadas mediante `dotenv`, nunca en el código fuente.
Preguntas frecuentes
¿Cuál es la diferencia entre Node.js LTS y Current en Windows?
Las versiones LTS reciben parches de seguridad y estabilidad durante 30 meses y llevan números de versión principal pares (18, 20, 22). Las versiones Current incluyen las últimas características del lenguaje y del entorno de ejecución, pero solo tienen soporte durante seis meses antes de pasar a LTS o ser descartadas. Para despliegues de producción en Windows, usa siempre LTS.
¿Por qué `npm install -g` falla con un error de permisos en Windows?
El prefijo global predeterminado (`C:Users<username>AppDataRoamingnpm`) ocasionalmente carece de permisos de escritura debido a políticas UAC o instalaciones anteriores ejecutadas como Administrador. La solución es ejecutar el terminal como Administrador (no recomendado a largo plazo) o reconfigurar el prefijo global a un directorio propiedad de tu cuenta de usuario con `npm config set prefix "C:yourpath"`.
¿Puedo ejecutar múltiples versiones de Node.js simultáneamente en Windows?
Sí, usando nvm-for-windows. Instálalo y luego usa `nvm install <version>` y `nvm use <version>` para cambiar el entorno de ejecución activo. Cada versión mantiene su propio directorio de paquetes globales, evitando conflictos entre versiones.
¿Qué es `package-lock.json` y debo incluirlo en el control de versiones?
`package-lock.json` es un registro exacto y determinista de todo el árbol de dependencias resuelto durante `npm install`. Garantiza que cada desarrollador y cada ejecución de CI/CD instale versiones de paquetes idénticas. Inclúyelo siempre en el control de versiones y nunca lo edites manualmente.
¿Cómo ejecuto una aplicación Node.js automáticamente al iniciar Windows sin un servidor?
Para máquinas de desarrollo, usa PM2 con `pm2 startup` y `pm2 save`. Para la integración con el Servicio de Windows, herramientas como `node-windows` envuelven un proceso Node.js como un Servicio nativo de Windows, permitiendo su gestión a través del complemento MMC de Servicios y el reinicio automático en caso de fallo o reinicio.
