我正在尝试用TypeScript和Angular应用程序运行一个开发服务器,而不是每次都转译ts文件。

我发现我可以用ts-node运行.ts文件,但我也想观看.ts文件并重新加载我的应用程序/服务器。这方面的一个例子是命令gulp watch。


当前回答

我宁愿不使用ts-node,总是从dist文件夹运行。 要做到这一点,只需设置您的包。Json默认配置:

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

然后不加恶魔。Json配置文件:

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

这里,我使用"exec": "npm restart" 所以所有ts文件将重新编译为js文件,然后重新启动服务器。

要在开发环境中运行,

npm run dev

使用这个设置,我将始终从分布式文件运行,而不需要ts-node。

其他回答

我已经抛弃了nodemon和ts-node,取而代之的是一个更好的选择,ts-node-dev https://github.com/whitecolor/ts-node-dev

只需运行ts-node-dev src/index.ts

(编辑) 自从我写了这个答案,nodemon已经改进了很多,现在所需的配置更轻了,性能也更好了。我目前使用这两种方法(显然是在不同的项目中),并且都很满意。

从其他答案中总结选项

Nodemon + ts-node非常稳定,但需要显式配置,并且有点慢 Node-dev + ts-node需要的配置比nodemon少得多,但仍然很慢 Ts-node-dev速度很快,但不可靠

注意tsx(在底层使用ESBuild)和swc不做类型检查;这应该是可以接受的,因为大多数编辑器都内置了类型检查,并且类型检查仍然应该是构建过程的一部分。您还可以在测试的同时单独执行类型检查,或者通过tsc——noEmit作为预推送钩子。

(推荐)tsx

TL;DR:最小配置的最快速度

截至2023-02-01,tsx似乎是速度和最小配置的最佳组合:

安装tsx NPM install——save-dev TSX 更新您的包。json。 “脚本:{ "dev": "tsx watch src/index.ts", 运行它 运行开发 (如果您只想全局安装tsx并直接运行,请调整这些步骤)

方案1:nodemon/node-dev + ts-node + swc

TL;DR:与tsx一样快,但具有更多配置

将nodemon/node-dev的可靠性与ts-node-dev的速度相结合的另一种选择是使用ts-node和swc, swc是Rust中实现的与TypeScript兼容的转译器,比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”:真的 } 运行nodemon或node-dev,例如 Nodemon——查看SRC SRC /index.ts 或者: node-dev src / index.ts

方案2:nodemon/node-dev + ts-node transpileOnly

TL;DR:快速、可靠

这里有一个替代方案,它比前一个选项要慢,因为它使用了标准的TypeScript转译器,但在我的测试中,它仍然比nodemon/node-dev + ts-node快。

基本上,它与前面的选项相同,但没有swc。通过禁用类型检查,它比开箱即用的ts-node更快(关于为什么这应该是可接受的,请参阅上面的说明)。

如上所述安装nodemon/node-dev 安装ts-node NPM install——save-dev ts-node 修改您的tsconfig。为ts-node启用transpileOnly " ts-node ": { “transpileOnly”:真的 } 如上所述调用nodemon/node-dev

方案3:nodemon + tsc—增量

TL;DR:快速,可靠,类型检查,更挑剔

这几乎与前一种选择的速度相同。与其他选项相比,这个选项的唯一真正优势是它可以进行类型检查。

在缺点方面,它可能会更挑剔;在我的测试中,我使用dotenv来获取我的.env文件进行本地开发。但这取决于tsc构建在tsconfig中的配置方式。Json,你可能需要做一些杂耍才能让它工作。

但有选择是件好事,所以就是这样:

Install nodemon as above (It's possible that this may work with node-dev as well, but I didn't see an exec option for node-dev) Configure tsconfig.json to transpile your TypeScript to JavaScript In particular, noEmit should not be set to true Configure nodemon to run the TypeScript compiler to do an incremental transpilation any time a TypeScript file is changed, e.g. "dev": "nodemon -e ts --watch src .env --exec \"tsc --incremental && node src/index.js\"", You can even remove --incremental to further simplify it, but it will end up being much slower, comparable to nodemon/node-dev + ts-node.

特别针对这个问题,我创建了tsc-watch库。你可以在npm上找到它。

显而易见的用例是:

tsc-watch服务器。ts——outDir ./dist——onSuccess "node ./dist/server.js"

这对我来说很管用:

nodemon src/index.ts

显然,由于这个拉请求:https://github.com/remy/nodemon/pull/1552

我宁愿不使用ts-node,总是从dist文件夹运行。 要做到这一点,只需设置您的包。Json默认配置:

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

然后不加恶魔。Json配置文件:

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

这里,我使用"exec": "npm restart" 所以所有ts文件将重新编译为js文件,然后重新启动服务器。

要在开发环境中运行,

npm run dev

使用这个设置,我将始终从分布式文件运行,而不需要ts-node。