Cómo mirar y recargar ts-node cuando cambian los archivos TypeScript
Estoy intentando ejecutar un servidor de desarrollo con TypeScript y una aplicación Angular sin transpilar archivos ts cada vez.
Lo que encontré es que puedo ejecutar archivos .ts
pero ts-node
también quiero verlos .ts
y recargar mi aplicación/servidor. Un ejemplo de esto es el comando gulp watch
.
Ahora puede simplemente npm install --save-dev ts-node nodemon
ejecutarlo nodemon
con un .ts
archivo y funcionará:
nodemon app.ts
Versión anterior:
Estaba luchando con lo mismo para mi entorno de desarrollo hasta que noté que nodemon
la API nos permite cambiar su comportamiento predeterminado para ejecutar un comando personalizado.
Por ejemplo, para la versión más reciente de nodemon
:
nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "ts-node src/index.ts"
O cree un nodemon.json
archivo con el siguiente contenido:
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node ./src/index.ts" // or "npx ts-node src/index.ts"
}
y luego ejecutar nodemon
sin argumentos.
Al hacer esto, podrá recargar en vivo un ts-node
proceso sin tener que preocuparse por la implementación subyacente.
Y con versiones aún más antiguas de nodemon
:
nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts
O incluso mejor: externalice la configuración de nodemon a un nodemon.json
archivo con el siguiente contenido y luego simplemente ejecute nodemon
, como sugirió Sandokan:
{
"watch": ["src/**/*.ts"],
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node ./index.ts"
}
Lo dejé nodemon
y ts-node
opté por una alternativa mucho mejor, ts-node-dev
https://github.com/whitecolor/ts-node-dev
Solo correts-node-dev src/index.ts
[EDITAR] Desde que escribí esta respuesta, nodemon ha mejorado mucho, la configuración requerida es mucho más ligera ahora y el rendimiento es mucho mejor. Actualmente uso ambos (en diferentes proyectos, obviamente) y estoy satisfecho con ambos.
Resumen de opciones de otras respuestas.
- nodemon plus ts-node es bastante estable pero necesita ser configurado explícitamente y es algo lento
- node-dev plus ts-node requiere mucha menos configuración que nodemon pero sigue siendo lento
- ts-node-dev es rápido pero poco confiable
Tenga en cuenta que tsx
(que usa ESBuild bajo el capó) y swc
no realice verificación de tipos; esto debería ser aceptable ya que la mayoría de los editores tienen la verificación de tipos incorporada, y la verificación de tipos aún debería ser parte de su proceso de compilación. También puede realizar la verificación de tipos por separado junto con sus pruebas o como un enlace previo al envío a través de tsc --noEmit
.
(Recomendado) tsx
ⓘ TL;DR: más rápido con una configuración mínima
A partir del 1 de febrero de 2023, tsx parece ser la mejor combinación de velocidad y configuración mínima:
Instalar tsx
npm install --save-dev tsx
Actualice su paquete.json, por ejemplo
"scripts: { "dev": "tsx watch src/index.ts",
Ejecutarlo
npm run dev
(Ajuste estos pasos si solo desea instalar tsx globalmente y ejecutarlo directamente)
Alternativa 1: nodemon/node-dev + ts-node + swc
ⓘ TL;DR: tan rápido como tsx pero con más configuración
Una opción alternativa que combina la confiabilidad de nodemon/node-dev con la velocidad de ts-node-dev es usar ts-node with swc
, un transpilador compatible con TypeScript implementado en Rust que es un "orden de magnitud más rápido" que TypeScript. transpilador.
Instala nodemon o node-dev (lo que prefieras)
nodemonio
npm install --save-dev nodemon
desarrollador de nodo
npm install --save-dev node-dev
Configurar ts-node con integración swc
https://github.com/TypeStrong/ts-node#swc-1
Instalar los paquetes necesarios
npm install --save-dev ts-node @swc/core @swc/helpers regenerator-runtime
Agregue esto a tsconfig.json
"ts-node": { "swc": true }
Ejecute nodemon o node-dev, por ejemplo
nodemon --watch src src/index.ts
o:
node-dev src/index.ts
Alternativa 2: nodemon/node-dev + ts-node transpileOnly
ⓘ TL;DR: rápido, confiable
Aquí hay una alternativa que es más lenta que la opción anterior porque usa el transpilador estándar de TypeScript, pero en mis pruebas sigue siendo más rápida que nodemon/node-dev + ts-node.
Básicamente es lo mismo que la opción anterior pero sin swc
. Es más rápido que ts-node listo para usar al deshabilitar la verificación de tipos (consulte las notas anteriores sobre por qué esto debería ser aceptable).
Instale nodemon/node-dev como se indica arriba
Instalar ts-nodo
npm install --save-dev ts-node
Modifique su tsconfig.json para habilitarlo
transpileOnly
para ts-node"ts-node": { "transpileOnly": true }
Llame a nodemon/node-dev como se indica arriba
Alternativa 3: nodemon + tsc --incremental
ⓘ TL;DR: rápido, confiable, verificación de tipos, más delicado
Esta es casi la misma velocidad que la alternativa anterior. La única ventaja real de esto sobre las otras opciones es que realiza verificación de tipos.
En términos de desventajas, puede ser un poco más complicado; En mis pruebas, lo estoy usando dotenv
para recoger mi .env
archivo para el desarrollo local. Pero dependiendo de cómo tsc
esté configurada tu compilación en tsconfig.json, es posible que tengas que hacer algunas acrobacias para que funcione.
Pero es bueno tener opciones, así que aquí las tienes:
Instale nodemon como arriba
(Es posible que esto también funcione con node-dev, pero no vi una
exec
opción para node-dev)Configure tsconfig.json para transpilar su TypeScript a JavaScript
En particular,
noEmit
no debe establecerse entrue
Configure nodemon para ejecutar el compilador TypeScript para realizar una transpilación incremental cada vez que se cambia un archivo TypeScript, por ejemplo
"dev": "nodemon -e ts --watch src .env --exec \"tsc --incremental && node src/index.js\"",
Incluso puedes eliminarlo
--incremental
para simplificarlo aún más, pero terminará siendo mucho más lento, comparable a nodemon/node-dev + ts-node.
Aquí hay una alternativa a la respuesta de HeberLZ , usando scripts npm.
Mi package.json
:
"scripts": {
"watch": "nodemon -e ts -w ./src -x npm run watch:serve",
"watch:serve": "ts-node --inspect src/index.ts"
},
-e
flag establece las extensiones a buscar,-w
establece el directorio observado,-x
ejecuta el script.
--inspect
en el watch:serve
script hay en realidad un indicador de node.js, solo habilita el protocolo de depuración.
Esto funciona para mí:
nodemon src/index.ts
Aparentemente gracias a esta solicitud de extracción: https://github.com/remy/nodemon/pull/1552