Cách xem và tải lại nút ts khi tệp TypeScript thay đổi


189

Tôi đang cố gắng chạy một máy chủ dev với TypeScript và một ứng dụng Angular mà không cần dịch các tệp ts mỗi lần. Tôi thấy rằng tôi có thể thực hiện việc chạy với ts-nodenhưng tôi cũng muốn xem .tscác tệp và tải lại ứng dụng / máy chủ như tôi sẽ làm với một cái gì đó như đồng hồ gulp.

Câu trả lời:


399

Tôi đã vật lộn với điều tương tự cho môi trường phát triển của mình cho đến khi tôi nhận thấy nodemonAPI đó cho phép chúng tôi thay đổi hành vi mặc định của nó để thực thi lệnh tùy chỉnh. Ví dụ:

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

Hoặc thậm chí tốt hơn: bên ngoài cấu hình của gật đầu vào một nodemon.jsontệp có nội dung sau, và sau đó chỉ cần chạy nodemon, như Sandokan đề xuất:

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

Nhờ vào việc này, bạn sẽ có thể tải lại một ts-nodequy trình mà không phải lo lắng về việc triển khai cơ bản.

Chúc mừng!

Cập nhật cho phiên bản mới nhất của gật đầu:

Tạo một nodemon.jsontập tin với nội dung sau đây.

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

nếu index.tslà một thể hiện rõ ràng, làm thế nào tôi có thể giết nó và khởi động lại
hjl

Về lý thuyết, @elaijuh, lệnh tương tự này sẽ thực hiện thủ thuật, khi nút được cấu hình để thực thi lệnh tùy chỉnh (trong trường hợp này là nút ts) thay vì lệnh nút mặc định, nó sẽ tắt quy trình và bắt đầu một lệnh mới mỗi lần tìm thấy sự thay đổi trên biểu thức đồng hồ trừ biểu thức bỏ qua :)
HeberLZ

15
bạn cũng có thể tạo một tập tin gật đầu với tất cả các tùy chọn được đề cập trong đó như thế này: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }và chỉ cần gõnodemon
Sandokan El Cojo

3
Tôi đã phạm sai lầm ./khi thêm trước tên thư mục và nó đã bị hỏng. Điều này làm việc cho tôi : { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. Và dòng lệnh:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa

2
Tôi chỉ muốn đề cập rằng bạn cũng phải đặt exttệp cấu hình, vì vậy giao diện của nó thay đổi ts. Tệp cấu hình của tôi trông như thế này:{ "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

112

Tôi đã từ bỏ nodemonts-nodeủng hộ một giải pháp thay thế tốt hơn nhiều, ts-node-dev https://github.com/whitecolor/ts-node-dev

Chỉ cần chạy ts-node-dev src/index.ts


6
Và tại sao điều này tốt hơn?
Deilan

21
Nó nhanh hơn và tự động phát hiện những tập tin nào cần xem, không cần cấu hình.
Mikael Couzic

4
Đây là tùy chọn tốt nhất (nếu không phải là duy nhất) cho nút ts, đặc biệt đối với các dự án lớn hơn. Nó không biên dịch lại tất cả các tệp từ đầu, nhưng thực hiện biên dịch gia tăng, như thế tsc --watch.
Angelos Pikoulas

2
trong trường hợp của tôi, điều này nhanh hơn 10 lần so nodemonvới ts-node. Cảm ơn bạn!
Florian

3
Vì vậy, tôi thực sự chỉ có "start": "ts-node-dev src". Không cần babel, gật đầu, hoặc bất kỳ cấu hình đi kèm với nó. Tất cả mọi thứ được xử lý cho bạn.
JMadelaine

51

Đây là một thay thế cho câu trả lời của HeberLZ , sử dụng các tập lệnh npm.

My package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e cờ thiết lập các phần mở rộng để tìm kiếm,
  • -w đặt thư mục đã xem,
  • -x thực thi kịch bản.

--inspecttrong watch:servetập lệnh thực sự là một cờ node.js, nó chỉ cho phép gỡ lỗi giao thức.


2
Ngoài ra hãy chắc chắn để có bản in được cài đặt cục bộ cho dự án. Nếu không, lỗi bạn có thể nhận được là không rõ ràng.
Aranir

Tôi nghĩ rằng nó nên được ts-node --inspect -- src/index.tsbây giờ do điều này .
bluenote10

1
Cách tiếp cận này dường như tạo ra sản lượng không đáng kể.
Freewalker

-e ts -w ./srcđã lừa tôi - điều này đã làm việc với một dự án loopback4 CLI tạo ra
Jonathan Cardoz

16

Cụ thể cho vấn đề này tôi đã tạo tsc-watchthư viện. bạn có thể tìm thấy nó vào npm .

Trường hợp sử dụng rõ ràng sẽ là:

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


Làm thế nào điều này sẽ hoạt động trong trường hợp của một máy chủ express hoặc koa vì nó không thực sự giết chết thể hiện nút trước đó?
brianestey

'tsc-watch' giết chết và khởi động lại quá trình cho bạn.
gilamran

Điều này thật đúng với gì mà tôi đã tìm kiếm. Không chắc mục đích của ts-node-dev là gì, nhưng tôi không thể lấy nó để báo cáo lỗi bản thảo. Sau khi dành hàng giờ cố gắng để làm cho nó hoạt động, tôi đã thử tsc-watch, và nó hoạt động như một cơ duyên!
Charles Naccio

@gilamran trong tài liệu về gói hàng của bạn có một lỗi đánh máy: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus

12

Thêm "watch": "nodemon --exec ts-node -- ./src/index.ts"vào scriptsphần của bạn package.json.


12

Điều này làm việc cho tôi:

nodemon src/index.ts

Rõ ràng là nhờ yêu cầu kéo này: https://github.com/remy/nodemon/pull/1552


Điều này làm việc cho tôi quá nhưng làm thế nào? Có vẻ loại phép thuật. Biên dịch bản thảo là gì? Tôi chưa ts-nodecài đặt.
d512

1
@ d512 Bạn có chắc là nó không có trong bạn node_modules/? Đối với tôi nó thất bại nếu tôi không có nó.
DLight

1
Điều này thực sự không cần ts-nodephải được cài đặt. Chạy lệnh này mà không có ts-nodekết quả sẽ failed to start process, "ts-node" exec not foundxảy ra lỗi. Bạn có thể có cái này như một vật phẩm còn sót lại trong node_modules. Điều đó đang được nói, giải pháp này đẹp hơn nhiều vì nó không yêu cầu cấu hình bổ sung.
Brandon Clapp

7

bạn có thể sử dụng ts-node-dev

Nó khởi động lại quá trình nút đích khi bất kỳ tệp yêu cầu nào thay đổi (dưới dạng nút tiêu chuẩn) nhưng chia sẻ quá trình biên dịch Bản mô tả giữa các lần khởi động lại.

Tải về

yarn add ts-node-dev --dev

và gói.json của bạn có thể như thế này

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

Cảm ơn bạn! Đây là cách dễ nhất tôi tìm thấy để cho phép tự động tải lại với máy chủ nút của mình.
Hisham Mubarak

7

tôi đã làm với

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

và sợi bắt đầu .. nút ts không giống như 'nút ts'


1

Tôi không muốn sử dụng nút ts và luôn luôn chạy từ thư mục dist.

Để làm điều đó, chỉ cần thiết lập gói.json của bạn với cấu hình mặc định:

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

và sau đó thêm tập tin cấu hình gật đầu.json :

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

Ở đây, tôi sử dụng "exec": "npm restart"
để tất cả tệp ts sẽ biên dịch lại thành tệp js và sau đó khởi động lại máy chủ.

Để chạy trong môi trường dev,

npm run dev

Sử dụng thiết lập này, tôi sẽ luôn chạy từ các tệp được phân phối và không cần nút ts.


0

thêm phần này vào tệp pack.json của bạn

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

và để làm việc này, bạn cũng cần cài đặt ts-node làm phụ thuộc dev

yarn add ts-node -D

chạy yarn devđể khởi động máy chủ dev

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.