TypeScript文件更改时如何监视和重新加载ts节点


Answers:


401

在开发环境中,我一直在做同样的事情,直到我注意到nodemon的API允许我们更改其默认行为以执行自定义命令。例如:

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

甚至更好:将nodemon的配置外部化为nodemon.json具有以下内容的文件,然后nodemon按照Sandokan的建议运行:

{ "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)而不是默认的node命令时,它将关闭进程并每次启动一个新命令在监视表达式减去忽略表达式上找到一个变化:)
HeberLZ '16

15
您还可以使用以下所有选项创建一个nodemon.json文件:{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }只需键入nodemon
Sandokan El Cojo,2016年

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
阿德里安·莫伊萨

2
我只想提一下,您还必须ext在配置文件中设置,因此其外观会有所变化。我的配置文件如下所示:{ "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

113

我已经放弃了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

2
就我而言,这实际上比nodemon使用快10倍ts-node。谢谢!
弗洛里安

3
所以我从字面上就是"start": "ts-node-dev src"。不需要babel,nodemon或它随附的任何配置。一切都为您处理。
JMadelaine

52

这是使用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
另外,请确保为项目在本地安装了打字稿。否则,您可能会得到的错误不是很清楚。
Aranir

我认为现在应该是ts-node --inspect -- src/index.ts由于这个原因
bluenote10'4

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"


在Express或Koa服务器的情况下,由于它实际上并没有杀死先前的节点实例,这将如何工作?
brianestey

'tsc-watch'会杀死您并重新启动该过程。
gilamran

这正是我想要的。不确定ts-node-dev的用途是什么,但是我无法报告打字错误。在花了几个小时尝试使其工作之后,我尝试了tsc-watch,它的运行就像一个魅力!
Charles Naccio

@gilamran在您的包装文件中有一个错字:"[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus

12

添加"watch": "nodemon --exec ts-node -- ./src/index.ts"scripts您的部分package.json


12

这对我有用:

nodemon src/index.ts

显然要感谢自从这个拉取请求以来:https : //github.com/remy/nodemon/pull/1552


这也对我有效,但是如何?似乎有点神奇。什么是打字稿?我没有ts-node安装。
d512

1
@ d512您确定它不在您的目录中node_modules/吗?对我来说,如果没有它,它将失败。
DLight

1
确实确实需要ts-node安装。运行不带此命令ts-node将导致failed to start process, "ts-node" exec not found错误。您可能将此作为的剩余工件node_modules。话虽如此,该解决方案更好,因为它不需要其他配置。
布兰登·克拉普

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节点不像'ts节点'


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以启动开发服务器

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.