Dividir el código en módulos
Una aplicación real no cabe en un archivo. Node permite separar el código en módulos (archivos) que exportan e importan funcionalidad. Existen dos sistemas que convivirán mucho tiempo.
CommonJS (el clásico de Node)
Usa require para importar y module.exports para exportar:
// matematicas.js
function sumar(a, b) { return a + b; }
module.exports = { sumar };
// app.js
const { sumar } = require("./matematicas");
console.log(sumar(2, 3)); // 5
ES Modules (el estándar moderno)
Es la sintaxis estándar del lenguaje, la misma que en el navegador. Usa
import / export:
// matematicas.js
export function sumar(a, b) { return a + b; }
// app.js
import { sumar } from "./matematicas.js";
Para usar ESM en Node se pone "type": "module" en el package.json (o se usa
la extensión .mjs). Diferencias clave: require es síncrono y dinámico
(puedes llamarlo dentro de un if); import es estático (se resuelve antes
de ejecutar) y permite optimizaciones.
package.json y npm
El package.json es la ficha del proyecto: nombre, versión, scripts y
dependencias. Con npm (el gestor de paquetes de Node) instalas librerías:
{
"name": "mi-app",
"type": "module",
"scripts": { "start": "node app.js" },
"dependencies": { "express": "^4.18.0" }
}
npm install express descarga el paquete a node_modules y lo anota en
dependencies. Luego lo importas por su nombre: import express from "express".
La librería estándar
Node trae módulos integrados (no hay que instalarlos):
fs: leer y escribir archivos (file system).path: construir rutas de forma portable entre sistemas operativos.os: información del sistema (CPUs, memoria...).http: crear servidores y clientes HTTP.process.env: leer variables de entorno (configuración y secretos).
Ejemplos
Importar un módulo de la librería estándar (CommonJS)
const path = require("path");
console.log(path.join("carpeta", "archivo.txt")); // "carpeta/archivo.txt"
console.log(path.extname("foto.png")); // ".png"