TypeScriptファイルが変更されたときにts-nodeを監視して再ロードする方法


192

TypeScriptとAngularアプリケーションを使用して、毎回tsファイルをトランスパイルせずに開発サーバーを実行しようとしています。で実行できることがわかりましたが、gulp ts-nodewatchの.ts場合と同じように、ファイルを監視してアプリ/サーバーをリロードしたいと思います。

回答:


404

nodemonカスタムコマンドを実行するためにAPIでデフォルトの動作を変更できることに気づくまで、私は開発環境で同じことに苦労していました。例えば:

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

またはさらに良い:Sandokanが示唆nodemon.jsonしたように、nodemonの設定を次の内容のファイルに外部化し、を実行しますnodemon

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

これによりts-node、基盤となる実装を気にすることなく、プロセスをライブでリロードできます。

乾杯!

nodemonの最新バージョン用に更新:

nodemon.json次の内容のファイルを作成します。

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

場合index.ts急行インスタンスで、どのように私はそれと再起動を殺すことができる
HJL

@elaijuh理論的にはこの同じコマンドでうまくいくはずです。nodemonがデフォルトのノードコマンドではなくカスタムコマンド(この場合はts-node)を実行するように構成されている場合、プロセスをシャットダウンし、毎回新しいコマンドを開始しますウォッチ式から無視式を引いた変更を検出します:)
HeberLZ

15
:あなたもnodemon.jsonのこのようなその中のすべての言及のオプションを使用してファイルを作成することができ{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }、ちょうどタイプnodemon
SandokanエルCojo

3
./フォルダ名の前に追加するのを間違えてしまい、壊れてしまいました。これは私のために働きました:{ "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }。コマンドライン:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa

2
またext、設定ファイルにもを設定する必要があるので、tsの変更を検索するように言っておきます。:このような私の設定ファイルを見て{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "ext": "ts js json", "_exec": "node dist/startup.js", "exec": "ts-node src/startup.ts" }
ラッセD.スロット

114

私はダンプnodemonts-node、より良い代替案を支持しました、ts-node-dev https://github.com/whitecolor/ts-node-dev

とにかく走れ ts-node-dev src/index.ts


6
そして、なぜこれが良いのですか?
デイラン

22
それはより速く、どのファイルを監視する必要があるかを自動的に検出します。設定は必要ありません。
Mikael Couzic

4
これは、特に大規模なプロジェクトの場合、ts-nodeに最適な(唯一ではないにしても)オプションです。すべてのファイルを最初から再コンパイルするのではなく、などの増分コンパイルを行いtsc --watchます。
Angelos Pikoulas

3
私の場合は、この文字通り10倍の速さよりもnodemon持ちますts-node。ありがとうございました!
フロリアン

3
だから私は文字通り持ってい"start": "ts-node-dev src"ます。babel、nodemon、またはそれに付属する構成は必要ありません。すべてはあなたのために処理されます。
JMadelaine

53

npmスクリプトを使用したHeberLZの回答の代替案を次に示します。

package.json

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e フラグは検索する拡張を設定し、
  • -w 監視ディレクトリを設定します、
  • -x スクリプトを実行します。

--inspectwatch:serveスクリプトが実際のNode.jsフラグであり、それだけで、プロトコルのデバッグを可能にします。


2
また、プロジェクトのtypescriptがローカルにインストールされていることも確認してください。そうでなければ、あなたが得るかもしれないエラーは非常に明確ではありません。
Aranir 2017

これts-node --inspect -- src/index.ts今のせいだと思います。
bluenote10 2018

1
このアプローチは、かなり余分な出力を生成するようです。
Freewalker

-e ts -w ./src私のためにトリックを行いました-これはloopback4 CLIで生成されたプロジェクトで動作しました
Jonathan Cardoz

16

特にこの問題のために、tsc-watchライブラリを作成しました。あなたはそれをnpmで見つけることができます

明らかな使用例は次のとおりです。

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


これは、前のノードインスタンスを実際に強制終了しないため、高速サーバーまたはコアサーバーの場合、どのように機能しますか?
brianestey

'tsc-watch'はプロセスを強制終了して再起動します。
ギラムラン2018年

これはまさに私が探していたものです。ts-node-devの目的が何であるかはわかりませんが、typescriptエラーを報告することができませんでした。それを動作させるために何時間も費やした後、私はtsc-watchを試しました、そしてそれは魅力のように機能しました!
Charles Naccio、

@gilamranあなたのパッケージのドキュメントにタイプミスがあります:"[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus

13

これは私にとってはうまくいきます:

nodemon src/index.ts

どうやらこのプルリクエスト以来のおかげで:https//github.com/remy/nodemon/pull/1552


これも私にとってはうまくいきますが、どうやって?一種の魔法のようです。タイプスクリプトをコンパイルしているものは何ですか?ts-nodeインストールしていません。
d512

1
@ d512あなたはそれがあなたの中にないことを確信していますnode_modules/か?私にとってそれがなければ失敗します。
DLight 2019

1
これは確かts-nodeにインストールする必要があります。このコマンドを実行せずに実行ts-nodeすると、failed to start process, "ts-node" exec not foundエラーが発生します。あなたはおそらくこれを残りのアーティファクトとして持っていましたnode_modules。そうは言っても、追加の構成を必要としないため、このソリューションははるかに優れています。
ブランドンクラップ

12

のセクションに追加"watch": "nodemon --exec ts-node -- ./src/index.ts"scriptsますpackage.json


7

あなたはts-node-devを使うことができます

必要なファイルのいずれかが変更されると(標準のnode-devとして)、ターゲットノードプロセスを再起動しますが、再起動間でTypescriptコンパイルプロセスを共有します。

インストール

yarn add ts-node-dev --dev

そしてあなたのpackage.jsonはこのようになる可能性があります

"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"
}

ありがとうございました!これは、ノードサーバーで自動リロードを有効にする最も簡単な方法でした。
Hisham Mubarak

7

私はした

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

そして糸の開始.. ts-nodeは 'ts-node'とは異なります


1

私はts-nodeを使用せず、常にdistフォルダーから実行したいと思います。

これを行うには、package.jsonをデフォルトの構成でセットアップします。

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

次に、nodemon.json構成ファイルを追加します。

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

ここでは、「exec」を使用します。「npm restart」
使用しているため、すべてのtsファイルがjsファイルに再コンパイルされ、サーバーが再起動されます。

開発環境で実行するには、

npm run dev

この設定を使用すると、常に分散ファイルから実行され、ts-nodeは必要ありません。


0

これをpackage.jsonファイルに追加してください

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

これを機能させるには、ts-nodeをdev-dependencyとしてインストールする必要もあります

yarn add ts-node -D

yarn dev開発サーバーを起動するために実行します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.