我正在尝试用TypeScript和Angular应用程序运行一个开发服务器,而不是每次都转译ts文件。
我发现我可以用ts-node运行.ts文件,但我也想观看.ts文件并重新加载我的应用程序/服务器。这方面的一个例子是命令gulp watch。
我正在尝试用TypeScript和Angular应用程序运行一个开发服务器,而不是每次都转译ts文件。
我发现我可以用ts-node运行.ts文件,但我也想观看.ts文件并重新加载我的应用程序/服务器。这方面的一个例子是命令gulp watch。
当前回答
如果你在package中使用"type": "module"时有问题。json(描述在https://github.com/TypeStrong/ts-node/issues/1007)使用以下配置:
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "node --loader ts-node/esm --experimental-specifier-resolution ./src/index.ts"
}
或者在命令行中
nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "node --loader ts-node/esm --experimental-specifier-resolution src/index.ts"
其他回答
另一种方法是先在监视模式下使用tsc -w编译代码,然后在javascript上使用nodemon。这种方法在速度上与ts-node-dev相似,并且具有更类似于生产的优点。
"scripts": {
"watch": "tsc -w",
"dev": "nodemon dist/index.js"
},
从其他答案中总结选项
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.
nodemon和ts-node:
nodemon --watch source --ext ts,json --exec "node --loader ts-node/esm ./source/index.ts"
特别针对这个问题,我创建了tsc-watch库。你可以在npm上找到它。
显而易见的用例是:
tsc-watch服务器。ts——outDir ./dist——onSuccess "node ./dist/server.js"
你现在可以简单地用npm install——save-dev ts-node nodemon,然后用.ts文件运行nodemon,它就可以工作了:
nodemon app.ts
以前的版本:
我在开发环境中也遇到了同样的问题,直到我注意到没有一个demon的API允许我们为了执行自定义命令而改变它的默认行为。
例如,对于nodemon的最新版本:
nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "ts-node src/index.ts"
或者创造一个无恶魔。Json文件,内容如下:
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node ./src/index.ts" // or "npx ts-node src/index.ts"
}
然后无参数地运行。
通过这样做,您将能够实时重新加载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"
}