Cara menonton dan memuat ulang ts-node ketika file TypeScript berubah

192

Saya mencoba untuk menjalankan server dev dengan TypeScript dan aplikasi Angular tanpa mengubah file ts setiap waktu. Saya menemukan bahwa saya dapat menjalankannya dengan ts-nodetetapi saya juga ingin menonton .tsfile dan memuat ulang aplikasi / server seperti yang akan saya lakukan dengan sesuatu seperti gulp watch.

Ieltxu Algañarás
sumber

Jawaban:

404

Saya sedang berjuang dengan hal yang sama untuk lingkungan pengembangan saya sampai saya perhatikan bahwa nodemonAPI memungkinkan kami untuk mengubah perilaku default untuk menjalankan perintah kustom. Sebagai contoh:

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

Atau bahkan lebih baik: externalize config nodemon ke nodemon.jsonfile dengan konten berikut, dan kemudian jalankan nodemon, seperti yang disarankan Sandokan:

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

Dengan melakukan ini, Anda akan dapat memuat ulang suatu ts-nodeproses tanpa harus khawatir tentang implementasi yang mendasarinya.

Bersulang!

Diperbarui untuk versi nodemon terbaru:

Buat nodemon.jsonfile dengan konten berikut.

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"      // or "npx ts-node src/index.ts"
}
HeberLZ
sumber
jika index.tsadalah contoh kilat, bagaimana saya bisa membunuhnya dan memulai kembali
hjl
@elaijuh secara teori perintah yang sama ini harus melakukan trik, ketika nodemon dikonfigurasikan untuk mengeksekusi perintah kustom (dalam hal ini ts-simpul) alih-alih perintah simpul default, ini akan mematikan proses dan memulai yang baru setiap kali menemukan perubahan pada ekspresi arloji minus ekspresi abaikan :)
HeberLZ
15
Anda juga dapat membuat file nodemon.json dengan semua opsi yang disebutkan di dalamnya seperti ini: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }dan cukup ketiknodemon
Sandokan El Cojo
3
Saya membuat kesalahan dengan menambahkan ./sebelum nama folder dan itu rusak. Ini bekerja untuk saya: { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. Dan baris perintah:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa
2
Saya hanya ingin menyebutkan, bahwa Anda juga harus mengatur extdi file konfigurasi, jadi ini mencari perubahan ts. File konfigurasi saya terlihat seperti ini:{ "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

Saya sudah membuang nodemondan ts-nodemendukung alternatif yang jauh lebih baik,ts-node-dev https://github.com/whitecolor/ts-node-dev

Lari saja ts-node-dev src/index.ts

Mikael Couzic
sumber
6
Dan mengapa ini lebih baik?
Deilan
22
Ini lebih cepat, dan secara otomatis mendeteksi file mana yang perlu ditonton, tidak perlu konfigurasi.
Mikael Couzic
4
Ini adalah pilihan terbaik (jika bukan satu-satunya) untuk ts-node, terutama untuk proyek yang lebih besar. Itu tidak mengkompilasi ulang semua file dari awal, tetapi melakukan kompilasi tambahan, seperti tsc --watch.
Angelos Pikoulas
3
dalam kasus saya, ini benar-benar 10 kali lebih cepat daripada nodemondengan ts-node. Terima kasih!
Florian
3
Jadi saya benar-benar hanya punya "start": "ts-node-dev src". Tidak perlu untuk babel, nodemon, atau konfigurasi apa pun yang menyertainya. Semuanya ditangani untuk Anda.
JMadelaine
53

Berikut alternatif jawaban HeberLZ HeberLZ, menggunakan skrip npm.

Saya package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flag mengatur ekstensi untuk dicari,
  • -w mengatur direktori yang ditonton,
  • -x mengeksekusi skrip.

--inspectdalam watch:serveskrip sebenarnya adalah flag node.js, itu hanya memungkinkan protokol debugging.

im.pankratov
sumber
2
Pastikan juga naskah yang diinstal secara lokal untuk proyek. Kalau tidak, kesalahan yang Anda dapatkan tidak terlalu jelas.
Aranir
Saya pikir seharusnya ts-node --inspect -- src/index.tssekarang karena ini .
bluenote10
1
Pendekatan ini tampaknya menghasilkan keluaran yang berlebihan.
Freewalker
-e ts -w ./srcmelakukan trik untuk saya - ini bekerja dengan proyek yang dihasilkan loopback4 CLI
Jonathan Cardoz
16

Khusus untuk masalah ini saya telah membuat tsc-watchperpustakaan. Anda dapat menemukannya di npm .

Kasus penggunaan yang jelas adalah:

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

gilamran
sumber
Bagaimana ini bekerja dalam kasus server express atau koa karena tidak benar-benar membunuh instance node sebelumnya?
brianestey
'tsc-watch' membunuh dan memulai kembali prosesnya untuk Anda.
gilamran
Ini persis apa yang saya cari. Tidak yakin apa tujuan dari ts-node-dev, tapi saya tidak bisa melaporkan kesalahan penulisan naskah. Setelah menghabiskan berjam-jam mencoba membuatnya bekerja, saya mencoba tsc-watch, dan itu bekerja seperti pesona!
Charles Naccio
@gilamran dalam dokumentasi paket Anda ada salah ketik: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus
13

Ini bekerja untuk saya:

nodemon src/index.ts

Rupanya terima kasih karena permintaan penarikan ini: https://github.com/remy/nodemon/pull/1552

DLight
sumber
Ini bekerja untuk saya juga tetapi bagaimana caranya? Tampaknya agak ajaib. Apa yang menyusun naskah naskah? Saya belum ts-nodemenginstal.
d512
1
@ d512 Apakah Anda yakin itu tidak ada dalam diri Anda node_modules/? Bagi saya itu gagal jika saya tidak memilikinya.
DLight
1
Ini memang perlu ts-nodediinstal. Menjalankan perintah ini tanpa ts-nodeakan menghasilkan failed to start process, "ts-node" exec not foundkesalahan. Anda mungkin memiliki ini sebagai artefak sisa di node_modules. Yang sedang berkata, solusi ini jauh lebih baik karena tidak memerlukan konfigurasi tambahan.
Brandon Clapp
12

Tambahkan "watch": "nodemon --exec ts-node -- ./src/index.ts"ke scriptsbagian Anda package.json.

takasoft
sumber
7

Anda bisa menggunakan ts-node-dev

Ini me-restart proses simpul target ketika ada file yang diperlukan berubah (sebagai simpul-dev standar) tetapi berbagi proses kompilasi Script antara restart.

Install

yarn add ts-node-dev --dev

dan package.json Anda bisa seperti ini

"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
sumber
Terima kasih! Ini adalah cara termudah yang saya temukan untuk mengaktifkan isi ulang otomatis dengan server simpul saya.
Hisham Mubarak
7

saya lakukan dengan

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

dan benang mulai .. ts-node tidak suka 'ts-node'

wayan wahyu Adi Putra
sumber
1

Saya lebih suka untuk tidak menggunakan ts-node dan selalu dijalankan dari folder dist.

Untuk melakukannya, cukup atur package.json Anda dengan konfigurasi default:

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

dan kemudian tambahkan file konfigurasi nodemon.json :

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

Di sini, saya menggunakan "exec": "npm restart"
sehingga semua file ts akan mengkompilasi ulang ke file js dan kemudian restart server.

Untuk menjalankan sementara di lingkungan dev,

npm run dev

Dengan menggunakan pengaturan ini, saya akan selalu menjalankan dari file yang didistribusikan dan tidak perlu untuk ts-node.

Raja PB
sumber
0

tambahkan ini ke file package.json Anda

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

dan untuk membuatnya bekerja, Anda juga perlu menginstal ts-node sebagai dev-dependency

yarn add ts-node -D

jalankan yarn devuntuk memulai server dev

princebillyGK
sumber