Cómo mirar y recargar ts-node cuando cambian los archivos TypeScript

Resuelto Ieltxu Algañarás asked hace 8 años • 23 respuestas

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 .tspero ts-nodetambién quiero verlos .tsy recargar mi aplicación/servidor. Un ejemplo de esto es el comando gulp watch.

Ieltxu Algañarás avatar Jun 23 '16 05:06 Ieltxu Algañarás
Aceptado

Ahora puede simplemente npm install --save-dev ts-node nodemonejecutarlo nodemoncon un .tsarchivo y funcionará:

nodemon app.ts

Versión anterior:

Estaba luchando con lo mismo para mi entorno de desarrollo hasta que noté que nodemonla 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.jsonarchivo 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 nodemonsin argumentos.

Al hacer esto, podrá recargar en vivo un ts-nodeproceso 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.jsonarchivo con el siguiente contenido y luego simplemente ejecute nodemon, como sugirió Sandokan:

{
  "watch": ["src/**/*.ts"],
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./index.ts"
}
HeberLZ avatar Jun 22 '2016 22:06 HeberLZ

Lo dejé nodemony ts-nodeopté 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.

Mikael Couzic avatar May 25 '2018 11:05 Mikael Couzic

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 swcno 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:

  1. Instalar tsx

    npm install --save-dev tsx
    
  2. Actualice su paquete.json, por ejemplo

    "scripts: {
      "dev": "tsx watch src/index.ts",
    
  3. 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.

  1. Instala nodemon o node-dev (lo que prefieras)

    • nodemonio

      npm install --save-dev nodemon 
      
    • desarrollador de nodo

      npm install --save-dev node-dev 
      
  2. Configurar ts-node con integración swc

    https://github.com/TypeStrong/ts-node#swc-1

    1. Instalar los paquetes necesarios

      npm install --save-dev ts-node @swc/core @swc/helpers regenerator-runtime
      
    2. Agregue esto a tsconfig.json

        "ts-node": {
          "swc": true
        }
      
  3. 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).

  1. Instale nodemon/node-dev como se indica arriba

  2. Instalar ts-nodo

    npm install --save-dev ts-node
    
  3. Modifique su tsconfig.json para habilitarlo transpileOnlypara ts-node

      "ts-node": {
        "transpileOnly": true
      }
    
  4. 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 dotenvpara recoger mi .envarchivo para el desarrollo local. Pero dependiendo de cómo tscesté 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:

  1. Instale nodemon como arriba

    (Es posible que esto también funcione con node-dev, pero no vi una execopción para node-dev)

  2. Configure tsconfig.json para transpilar su TypeScript a JavaScript

    En particular, noEmitno debe establecerse entrue

  3. 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 --incrementalpara simplificarlo aún más, pero terminará siendo mucho más lento, comparable a nodemon/node-dev + ts-node.

bmaupin avatar Jan 31 '2022 21:01 bmaupin

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"
  },
  • -eflag establece las extensiones a buscar,
  • -westablece el directorio observado,
  • -xejecuta el script.

--inspecten el watch:servescript hay en realidad un indicador de node.js, solo habilita el protocolo de depuración.

im.pankratov avatar Apr 29 '2017 18:04 im.pankratov

Esto funciona para mí:

nodemon src/index.ts

Aparentemente gracias a esta solicitud de extracción: https://github.com/remy/nodemon/pull/1552

DLight avatar Dec 07 '2019 15:12 DLight