我想在不每次编译Typescript文件的情况下,运行一个带有TypeScript和Angular应用的开发服务器。
我发现可以使用ts-node
来运行.ts
文件,但我也想观察.ts
文件并重新加载我的应用/服务器。一个例子是命令gulp watch
。
我想在不每次编译Typescript文件的情况下,运行一个带有TypeScript和Angular应用的开发服务器。
我发现可以使用ts-node
来运行.ts
文件,但我也想观察.ts
文件并重新加载我的应用/服务器。一个例子是命令gulp watch
。
现在你可以简单地通过 npm install --save-dev ts-node nodemon
命令安装这两个包,然后使用一个 .ts
文件来运行 nodemon
就能正常工作了:
nodemon app.ts
以前的版本:
我在我的开发环境中遇到了同样的问题,直到我发现 nodemon
的 API 允许我们更改其默认行为以执行自定义命令。
例如,对于最新版本的 nodemon
:
nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "ts-node src/index.ts"
或者创建一个 nodemon.json
文件,内容如下:
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node ./src/index.ts" // or "npx ts-node src/index.ts"
}
然后不带参数运行nodemon
。
通过这样做,您将能够实现ts-node
进程的实时重新加载,而不必担心底层实现。
即使是更早版本的nodemon
也可以实现:
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"
}
为了寻求更好的替代方案,我已经抛弃了 nodemon
和 ts-node
,选择了一个更好的选择,ts-node-dev
。
https://github.com/whitecolor/ts-node-dev
只需运行 ts-node-dev src/index.ts
[编辑] 自从我写这篇答案以来,nodemon 得到了很大改善,所需配置更轻便,性能也更好。我目前同时使用两者(在不同的项目中),并对它们都感到满意。
ts-node-dev
这个工具的想法很好,但是它有很多问题。它对于真实世界的使用来说可靠性不够。遗憾的是,维护者似乎没有足够的能力来处理这些问题。我只能回归 nodemon
了... - forresthopkinsa注意,tsx
(其底层使用 ESBuild)和 swc
不进行类型检查;这应该是可以接受的,因为大多数编辑器都内置了类型检查,并且类型检查仍应作为构建过程的一部分。您也可以通过tsc --noEmit
单独进行类型检查,与测试一起进行或作为预推钩子。
ⓘ TL;DR:速度最快,配置最小
截至2023-02-01,tsx似乎是速度和最小配置的最佳组合:
安装 tsx
npm install --save-dev tsx
更新您的package.json文件,例如:
"scripts: {
"dev": "tsx watch src/index.ts",
运行它
npm run dev
如果您仅想全局安装 tsx 并直接运行它,请调整以下步骤:
ⓘ TL;DR: 与 tsx 一样快,但具有更多配置
另一个选择是将 nodemon/node-dev 的可靠性与 ts-node-dev 的速度相结合,使用支持 TypeScript 的 Rust 实现的转译器 swc
。 swc 比 TypeScript 转译器 “快一个数量级”。
安装 nodemon 或 node-dev(根据您的喜好)
nodemon
npm install --save-dev nodemon
node-dev
npm install --save-dev node-dev
使用 swc 集成设置 ts-node
https://github.com/TypeStrong/ts-node#swc-1
安装必要的包
npm install --save-dev ts-node @swc/core @swc/helpers regenerator-runtime
将此添加到tsconfig.json中
"ts-node": {
"swc": true
}
运行nodemon或node-dev,例如:
nodemon --watch src src/index.ts
或者:node-dev src/index.ts
ⓘ TL;DR: 快速、可靠
这里提供了另一种方案,它比前一个选项慢,因为它使用标准的TypeScript转换器,但在我的测试中,它仍然比nodemon/node-dev + ts-node更快。
基本上,它与上一个选项相同,但没有swc
。通过禁用类型检查,它比开箱即用的ts-node更快(请参阅上面有关为什么应该接受此做法的说明)。
按照上述步骤安装nodemon/node-dev
安装ts-node
npm install --save-dev ts-node
修改您的 tsconfig.json 以启用 transpileOnly
选项,以便在使用 ts-node 时进行转译。
"ts-node": {
"transpileOnly": true
}
按照上述方式调用 nodemon/node-dev
ⓘ TL;DR:快速、可靠、类型检查、稍微有些挑剔
这个方案的速度几乎与前一种方案相同。与其他选项相比,唯一的优势在于它可以进行类型检查。
就缺点而言,它可能会更加挑剔;在我的测试中,我使用dotenv
来获取本地开发的.env
文件。但是,根据您在tsconfig.json中配置的tsc
构建方式,您可能需要进行一些特殊的工作才能使其正常工作。
但是有多重选择总是好的,所以在这里介绍一下:
按照上述方式安装 nodemon
(node-dev也可能适用,但我没有看到node-dev的exec
选项)
将tsconfig.json配置为将TypeScript转换为JavaScript
特别是,noEmit
不应设置为true
将nodemon配置为运行TypeScript编译器,在任何时候更改TypeScript文件时进行增量转换,例如:
"dev": "nodemon -e ts --watch src .env --exec \"tsc --incremental && node src/index.js\"",
您甚至可以删除--incremental
以进一步简化它,但这将使其变得更慢,与nodemon/node-dev + ts-node相当。
nodemon
,则无法在 cmd 上运行 nodemon
。相反,使用 -g
全局安装它。 - Timonode_modules/.bin/nodemon
),但是考虑到我几乎总是需要为 nodemon 提供标志,将它添加到 package.json 中作为脚本更加方便,以便使用所有所需的标志运行 nodemon(参见替代方案3中的示例)。这也在处理多个项目时更加方便;你只需要调用npm run dev
,而不必记住每个项目需要如何配置。当然,如果你想的话,也可以全局安装。 - bmaupintsc
),它默认进行类型检查(实际上我认为没有关闭它的方法)。由于您可能不想等到构建时才发现是否存在任何类型错误,因此您还可以使用tsc
作为测试过程或预推钩子的一部分来进行类型检查。 - bmaupintsx
不支持 emitDecoratorMetadata
。 - Filip Seman这里提供了一个替代 HeberLZ 的答案,使用 npm 脚本。
我的 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
执行脚本。--inspect
在watch:serve
脚本中实际上是一个Node.js标志,它只是启用调试协议。
--inspect
),您需要将 ts-node 作为 node -r ts-node/register
命令运行。 - im.pankratov--legacy-watch
标志才能实现自动重载。有什么想法为什么要这样做? - Timots-node
。 - d512node_modules/
目录下吗?如果没有,对我来说会失败。 - DLightts-node
才能运行此命令。如果没有安装ts-node
,运行此命令将导致出现“无法启动进程,“ts-node”执行文件未找到”的错误。你可能在node_modules
中留下了这个文件。话虽如此,这个解决方案更好,因为它不需要额外的配置。 - Brandon Clappnpm install -g ts-node
- Rafael Pizao你可以使用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"
}
针对这个问题,我创建了tsc-watch
库。您可以在npm上找到它。
显而易见的用例是:
tsc-watch server.ts --outDir ./dist --onSuccess "node ./dist/server.js"
"[...] 类似于 nodemon,但用于TypeCcript。"
:) - Massimiliano Kraus"watch": "nodemon --exec ts-node -- ./src/index.ts"
添加到package.json
文件中的scripts
部分。我用的是
"start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec ts-node src/index.ts"
并且运行yarn start时,ts-node不像'ts-node'
我希望不使用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。
index.ts
是一个 express 实例,我该如何终止它并重新启动? - hjl{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }
,然后只需键入nodemon
即可。 - Sandokan El Cojo./
,导致程序出现问题。以下这段代码可以解决问题:{ "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 Moisaext
,以便它能够查找.ts
文件的更改。我的配置文件如下所示:{ "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\"
替换它们可以使脚本正常运行:"nodemon --watch \"./src/**/*.ts\" -r dotenv/config --exec \"ts-node\" src/index.ts"
- TJBlackman