Como assistir e recarregar o ts-node quando os arquivos TypeScript são alterados

192

Estou tentando executar um servidor de desenvolvimento com TypeScript e um aplicativo Angular sem transpilar arquivos ts toda vez. Descobri que posso fazer a execução, ts-nodemas quero também assistir .tsarquivos e recarregar o aplicativo / servidor, como faria com algo como o gulp watch.

Ieltxu Algañarás
fonte

Respostas:

404

Eu estava lutando com a mesma coisa no meu ambiente de desenvolvimento até perceber que nodemona API nos permite alterar seu comportamento padrão para executar um comando personalizado. Por exemplo:

nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts

Ou melhor ainda: externalize a configuração do nodemon em um nodemon.jsonarquivo com o seguinte conteúdo e depois execute nodemon, como sugeriu Sandokan:

{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./index.ts" }

Em virtude disso, você poderá recarregar um ts-nodeprocesso ao vivo sem precisar se preocupar com a implementação subjacente.

Felicidades!

Atualizado para a versão mais recente do nodemon:

Crie um nodemon.jsonarquivo com o seguinte conteúdo.

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"      // or "npx ts-node src/index.ts"
}
HeberLZ
fonte
se index.tsé uma instância expressa, como eu posso matá-lo e reiniciar
Hjl
@elaijuh em teoria, esse mesmo comando deve funcionar, quando o nodemon estiver configurado para executar um comando personalizado (neste caso, ts-node) em vez do comando node padrão, ele encerrará o processo e iniciará um novo sempre que encontra uma mudança na expressão de inspeção menos a expressão ignorar :)
HeberLZ
15
você também pode criar um arquivo nodemon.json com todas as opções mencionadas, desta forma: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }e apenas digitarnodemon
Sandokan El Cojo
3
Eu cometi o erro de adicionar ./antes dos nomes das pastas e elas quebraram. Isso funcionou para mim: { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. E linha de comando:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa
2
Gostaria apenas de mencionar que você também precisa definir o extno arquivo de configuração, para que o seu procure por ts mude. Meu arquivo de configuração fica assim:{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "ext": "ts js json", "_exec": "node dist/startup.js", "exec": "ts-node src/startup.ts" }
Lasse D. Slot
114

Eu tenho jogado nodemone ts-nodeem favor de uma alternativa muito melhor, ts-node-dev https://github.com/whitecolor/ts-node-dev

Apenas corra ts-node-dev src/index.ts

Mikael Couzic
fonte
6
E por que isso é melhor?
Deilan
22
É mais rápido e detecta automaticamente quais arquivos precisam ser assistidos, nenhuma configuração é necessária.
Mikael Couzic
4
Essa é a melhor (se não a única) opção para o nó ts, especialmente para projetos maiores. Ele não recompila todos os arquivos do zero, mas faz uma compilação incremental, como tsc --watch.
Angelos Pikoulas
3
no meu caso, isso é literalmente 10 vezes mais rápido do que nodemoncom ts-node. Obrigado!
Florian
3
Então eu literalmente tenho "start": "ts-node-dev src". Não há necessidade de babel, nodemon ou qualquer uma das configurações que o acompanham. Tudo é tratado para você.
JMadelaine 15/04
53

Aqui está uma alternativa à resposta do HeberLZ , usando scripts npm.

Meu package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flag define as extensões a serem procuradas,
  • -w define o diretório monitorado,
  • -x executa o script.

--inspectno watch:servescript, na verdade, é um sinalizador node.js, apenas habilita o protocolo de depuração.

im.pankratov
fonte
2
Também verifique se o texto datilografado está instalado localmente para o projeto. Caso contrário, o erro que você pode receber não é muito claro.
Aranir
Eu acho que deve ser ts-node --inspect -- src/index.tsagora devido a isso .
bluenote10
1
Essa abordagem parece gerar uma saída supérflua considerável.
Freewalker 28/06/19
-e ts -w ./srcfiz o truque para mim - isso funcionou com um projeto gerado por loopback4 CLI
Jonathan Cardoz 06/01
16

Especificamente para esse problema, criei a tsc-watchbiblioteca. você pode encontrá-lo nas npm .

Caso de uso óbvio seria:

tsc-watch server.ts --outDir ./dist --onSuccess "node ./dist/server.js"

gilamran
fonte
Como isso funcionaria no caso de um servidor expresso ou koa, pois na verdade não mata a instância do nó anterior?
Brianestey
'tsc-watch' mata e reinicia o processo para você.
Gilamran #
Era exatamente isso que eu estava procurando. Não tenho certeza qual é o objetivo do ts-node-dev, mas não consegui reportar erros de digitação. Depois de passar horas tentando fazê-lo funcionar, tentei o tsc-watch, e funcionou como um encanto!
Charles Naccio 16/01
@gilamran na documentação do seu pacote, há um erro de digitação: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus
13

Isso funciona para mim:

nodemon src/index.ts

Aparentemente, graças a essa solicitação de recebimento : https://github.com/remy/nodemon/pull/1552

DLight
fonte
Isso funciona para mim também, mas como? Parece meio mágico. O que está compilando o texto datilografado? Eu não tenho ts-nodeinstalado.
d512 11/11/19
1
@ d512 Tem certeza de que não está no seu node_modules/? Para mim, falha se não a tiver.
DLight
1
Isso realmente precisa ts-nodeser instalado. A execução deste comando sem ts-noderesultará em failed to start process, "ts-node" exec not founderro. Você provavelmente teve isso como um artefato restante node_modules. Dito isto, esta solução é muito melhor, pois não requer configuração adicional.
Brandon Clapp
12

Adicione "watch": "nodemon --exec ts-node -- ./src/index.ts"à scriptsseção do seu package.json.

takasoft
fonte
7

você poderia usar ts-node-dev

Ele reinicia o processo do nó de destino quando qualquer um dos arquivos necessários é alterado (como padrão node-dev), mas compartilha o processo de compilação Typcript entre as reinicializações.

Instalar

yarn add ts-node-dev --dev

e seu package.json pode ser assim

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "tsc": "tsc",
  "dev": "ts-node-dev --respawn --transpileOnly ./src/index.ts",
  "prod": "tsc && node ./build/index.js"
}
jsina
fonte
Obrigado! Essa foi a maneira mais fácil de ativar o recarregamento automático com meu servidor de nó.
Hisham Mubarak
7

eu fiz com

"start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec ts-node src/index.ts"

e início do fio .. ts-node não é como 'ts-node'

wayan wahyu Adi Putra
fonte
1

Eu preferiria não usar o ts-node e sempre executar a partir da pasta dist.

Para fazer isso, basta configurar o seu package.json com a configuração padrão:

....
"main": "dist/server.js",
  "scripts": {
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "dev": "nodemon"
  },
....

e adicione o arquivo de configuração nodemon.json :

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "npm restart"
}

Aqui, eu uso "exec": "npm restart"
para que todo o arquivo ts seja compilado novamente no arquivo js e, em seguida, reinicie o servidor.

Para executar enquanto estiver no ambiente de desenvolvimento,

npm run dev

Usando esta configuração, sempre executarei a partir dos arquivos distribuídos e não haverá necessidade de ts-node.

Raja PB
fonte
0

adicione isso ao seu arquivo package.json

scripts {
"dev": "nodemon --watch '**/*.ts' --exec 'ts-node' index.ts"
}

e para fazer isso funcionar, você também precisa instalar o ts-node como dependência de dev

yarn add ts-node -D

execute yarn devpara iniciar o servidor dev

princebillyGK
fonte