• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
      • Ajuste de Curvas
      • Calculadora de Matrices
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Calculadora XIRR con Flujos Irregulares
      • Simulador FIRE (Financial Independence, Retire Early)
    • Negocios
      • CLV
      • Scoring
    • Herramientas
      • Formateador / Minificador de JSON
      • Conversor CSV ↔ JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Actualizar expresslanets a ES Modules con tsx y Vitest

TypeScript

septiembre 24, 2026 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 4 minutos

expresslanets es la plantilla de API REST con Express y TypeScript que empezó como una serie de diez entradas en 2022 y que desde entonces ha ido incorporando mejoras, como la documentación con OpenAPI/Swagger. En esta entrada aplico el razonamiento de la entrada anterior de esta serie a este proyecto en concreto: paso la plantilla a ES Modules, sustituyo ts-node/Nodemon por tsx, y añado Vitest para poder validar tipos y comportamiento en desarrollo sin depender solo de Sonar.

Al ser una aplicación, no una librería que otros instalan, no hay consumidores externos a los que romper. Eso simplifica mucho la decisión: no necesitamos un paquete dual, solo migrar limpiamente a ESM.

Tabla de contenidos

  • 1. Punto de partida
  • 2. Sustituir ts-node y Nodemon por tsx
  • 3. Activar ES Modules en package.json
  • 4. Actualizar tsconfig.json
  • 5. No perder el chequeo de tipos en desarrollo
  • 6. Añadir Vitest
  • 7. Verificar la compatibilidad con TypeORM
  • 8. Conclusiones

Punto de partida

La configuración actual de expresslanets es esta:

// tsconfig.json (antes)
{
  "compilerOptions": {
    "target": "es2016",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "module": "commonjs",
    "rootDir": "./src",
    "resolveJsonModule": true,
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "strictPropertyInitialization": false,
    "skipLibCheck": true
  }
}
// package.json (antes, extracto)
"scripts": {
  "build": "npx tsc",
  "dev": "npx nodemon",
  "format": "npx prettier --parser typescript --write ./src",
  "lint": "npx eslint ./src --ext .ts"
},
"devDependencies": {
  "nodemon": "^3.1.10",
  "ts-node": "^10.9.2",
  "typescript": "^5.9.3"
  // ...
}

Dos detalles importantes de este proyecto: usa TypeORM, que depende de decoradores (experimentalDecorators + emitDecoratorMetadata), y no tenía ningún test runner configurado, ni Jest ni Vitest, solo Sonar para análisis estático. Eso significa que este cambio, además de la migración a ESM, es también la primera vez que el proyecto tiene tests de verdad.

Desbalanceo de Clases en Credit Scoring: Por Qué Usamos Ponderación en lugar de Undersampling
En Analytics Lane
Desbalanceo de Clases en Credit Scoring: Por Qué Usamos Ponderación en lugar de Undersampling

Sustituir ts-node y Nodemon por tsx

npm uninstall ts-node nodemon
npm install --save-dev tsx

tsx incluye su propio modo watch, así que no hace falta Nodemon por separado:

"scripts": {
  "dev": "tsx watch src/index.ts"
}

Publicidad


Activar ES Modules en package.json

{
  "type": "module"
}

Actualizar tsconfig.json

Con "type": "module" activo, tsc debe generar salida ESM y resolver los módulos con las reglas de Node para ESM (NodeNext). Mantenemos los ajustes de decoradores que necesita TypeORM:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "rootDir": "./src",
    "resolveJsonModule": true,
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "strictPropertyInitialization": false,
    "skipLibCheck": true
  }
}

Un detalle que suele pillar a contrapié la primera vez: bajo moduleResolution: "NodeNext", las importaciones relativas entre tus propios archivos .ts necesitan la extensión .js explícita ,aunque el archivo origen sea .ts, porque así es como Node resuelve módulos ESM en tiempo de ejecución:

// antes
import { UserController } from './controllers/user';

// después
import { UserController } from './controllers/user.js';

No perder el chequeo de tipos en desarrollo

Como comentamos al principio de esta serie, tsx no valida tipos ,solo transpila, y Sonar tampoco sustituye a tsc en eso. La solución es correr el chequeo de tipos como proceso aparte, en paralelo:

npm install --save-dev concurrently
"scripts": {
  "dev": "concurrently \"tsx watch src/index.ts\" \"tsc --noEmit --watch\"",
  "typecheck": "tsc --noEmit"
}

Así tienes errores de tipos en tiempo real en una terminal mientras tsx se encarga de ejecutar rápido en la otra, y typecheck queda disponible como paso de verificación en CI o en un hook de pre-commit.

Publicidad


Añadir Vitest

npm install --save-dev vitest @vitest/coverage-v8
// vitest.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    include: ['src/**/*.test.ts'],
    coverage: {
      provider: 'v8',
      reporter: ['text', 'html', 'lcov'],
    },
  },
});
"scripts": {
  "test": "vitest run",
  "test:watch": "vitest",
  "coverage": "vitest run --coverage"
}

Un primer test sencillo, por ejemplo sobre un controlador o una utilidad del proyecto, ya te sirve para comprobar que Vitest arranca correctamente sobre ESM + TypeORM sin configuración adicional, algo que con Jest habría exigido activar flags experimentales de Node.

Verificar la compatibilidad con TypeORM

Tanto tsx como Vitest usan esbuild por debajo, y esbuild soporta los decoradores “legacy” (experimentalDecorators + emitDecoratorMetadata) que usa TypeORM. Aun así, conviene comprobarlo con una entidad real antes de dar la migración por cerrada: crea o edita una entidad con un par de columnas y una relación, y confirma que las metadatas de tipos se generan correctamente al arrancar con npm run dev y al ejecutar sus tests con Vitest.

Conclusiones

Con estos cambios, expresslanets pasa a ser ES Modules sin ningún consumidor externo al que romper, gana un ciclo de desarrollo más rápido con tsx, mantiene el chequeo de tipos gracias a tsc --noEmit --watch en paralelo, y estrena su primera suite de tests con Vitest. En la siguiente entrada de la serie aplico el mismo razonamiento, pero con un resultado bastante distinto, a tslane, donde al ser una librería la solución pasa por un paquete dual CommonJS/ESM en lugar de una migración directa.

Nota: La imagen de este artículo fue generada utilizando un modelo de inteligencia artificial.

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicidad


Publicaciones relacionadas

  • Desbalanceo de Clases en Credit Scoring: Por Qué Usamos Ponderación en lugar de Undersampling
  • Por qué migrar tus proyectos TypeScript a ES Modules en 2026
  • Curiosidad: El “bug”, la polilla y la leyenda de Grace Hopper
  • Curiosidad: Por qué la criptografía habla siempre de Alice y Bob
  • BG/BB: el modelo de CLV para compras en períodos discretos
  • Errores comunes al interpretar resultados estadísticos
  • Método del codo: interpretación correcta y limitaciones
  • Dashboard CLV: cuatro modelos, un mismo dataset, conclusiones muy distintas
  • Pareto/NBD: cuando el abandono silencioso cambia el CLV

Publicado en: JavaScript Etiquetado como: TypeScript

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Actualizar expresslanets a ES Modules con tsx y Vitest

septiembre 24, 2026 Por Daniel Rodríguez

Pareto/NBD: cuando el abandono silencioso cambia el CLV

septiembre 22, 2026 Por Daniel Rodríguez

Por qué migrar tus proyectos TypeScript a ES Modules en 2026

septiembre 17, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Creación de gráficos de barras y gráficos de columnas con Seaborn publicado el julio 18, 2023 | en Python
  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python
  • Formatear automáticamente código Python publicado el junio 6, 2022 | en Python
  • Solución a ‘IndentationError: unexpected indent’ en Python paso a paso publicado el marzo 24, 2025 | en Python
  • Aprendizaje Automático ¿Qué es el Aprendizaje Automático? publicado el agosto 22, 2018 | en Ciencia de datos

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.1 (11)

Aplicar el método D’Hondt en Excel

Comentarios recientes

  • Daniel Rodríguez en Curiosidad: La Paradoja de Simpson, o por qué no siempre debes fiarte de los promedios
  • Hatepi en Curiosidad: La Paradoja de Simpson, o por qué no siempre debes fiarte de los promedios
  • Daniel Rodríguez en Los récords con asterisco, o la épica del titular sin contexto – El bestiario de los indicadores económicos absurdos (parte 8 y final)
  • Juan en Los récords con asterisco, o la épica del titular sin contexto – El bestiario de los indicadores económicos absurdos (parte 8 y final)
  • bif en JSON en bases de datos: cuándo es buena idea y cuándo no

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto