Conceptos básicos de los módulos
8 ejemplos para empezar con los módulos: 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con los módulos: 6 básicos y 2 intermedios.
"type": "module" en package.json para los ejemplos de ESM.Las exportaciones con nombre son analizables estáticamente, el valor predeterminado preferido en 2026.
// user.ts
export interface User { id: string; name: string }
export function formatUser(u: User): string {
return `${u.name} (${u.id})`;
}// main.ts
import { formatUser, type User } from './user.js';
const user: User = { id: '1', name: 'Ada' };
console.log(formatUser(user));.js en los especificadores de importación al compilar TypeScript a ESM.import type se borra en tiempo de compilación, sin costo en tiempo de ejecución.Relacionado: Módulos ES (import) - importación dinámica y TLA
Una exportación predeterminada por módulo: úsala para puntos de entrada de un solo propósito.
// logger.ts
export default function createLogger(prefix: string) {
return (msg: string) => console.log(`[${prefix}]`, msg);
}import createLogger from './logger.js';
const log = createLogger('api');
log('started');El código brownfield todavía usa require: conócelo para el mantenimiento.
// legacy.cjs
const path = require('node:path');
module.exports = {
basename: (p) => path.basename(p),
};const { basename } = require('./legacy.cjs');.cjs fuerza CommonJS incluso cuando "type": "module".require es síncrono: no hay await de nivel superior en los módulos CJS.Relacionado: CommonJS (require) - patrones de module.exports
Establece ESM como predeterminado para los archivos .js en el paquete.
{
"name": "billing-api",
"type": "module",
"exports": {
".": "./dist/index.js"
}
}"type": "module", los archivos .js se tratan como CommonJS."type": "commonjs" es el modo heredado explícito."exports" para los puntos de entrada públicos.Relacionado: package.json type y exports - exportaciones condicionales
Aclara las importaciones incorporadas y evita el sombreado de paquetes de usuario.
import { readFile } from 'node:fs/promises';
import { createServer } from 'node:http';node: es opcional pero recomendado en el código de la aplicación.fs local secuestre las importaciones.require('node:fs')).Carga módulos condicionalmente o en tiempo de ejecución: devuelve una Promesa.
async function loadPlugin(name: string) {
const mod = await import(`./plugins/${name}.js`);
return mod.default();
}
await loadPlugin('metrics');Relacionado: Módulos ES (import) - await de nivel superior con importación dinámica
Reexporta una superficie curada desde index.ts.
// src/services/index.ts
export { UserService } from './user-service.js';
export type { User } from './user-service.js';import { UserService, type User } from './services/index.js';Relacionado: Algoritmo de resolución de módulos - cómo se resuelve el índice
Módulos mixtos durante la migración: extensiones explícitas y createRequire.
// bridge.mjs
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const legacy = require('./legacy-config.cjs');
console.log(legacy.apiUrl);createRequire carga CJS desde el contexto ESM durante la migración brownfield.import y require en CI durante la transición.Relacionado: Interoperabilidad CJS ↔ ESM - paquetes duales y .mjs/.cjs
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 19 jul 2026