如何让 ts-node 在文件更改时重新加载:解析真实陷阱
想象一下:您正在用 TypeScript 编写服务器,启动 ts-node,进行修改——但什么也没发生。您不得不手动停止进程,按 Ctrl+C,然后重新启动。熟悉吗?这个问题在 Stack Overflow 上获得了数千次浏览,这并非没有原因:配置 ts-node 的监控和重新加载 确实是一个难题。
在本文中,我不仅会给出现成的解决方案。我们将分析即使是经验丰富的开发人员也常犯的 主要错误,并且我将展示如何避免它们。您将了解为什么 ts-node --watch 无法“开箱即用”,ts-node-dev 相比传统方法有何优势,以及如何在此过程中不降低服务器性能。
为什么 ts-node 本身不会自动重新加载?
让我们立即澄清一点。ts-node 不是开发服务器。它是一个将 TypeScript 转译为 JavaScript 并在 Node.js 运行时中执行代码的转译器。它没有内置的文件更改监控机制(file watcher)。当您运行 ts-node app.ts 时,它只是执行文件然后退出。
要实现 文件更改时自动重新加载,您需要使用外部工具。而有趣的部分就在这里开始。
配置 ts-node 监控和重新加载时的五大错误
我收集了开发人员最常踩的陷阱。我们将逐一分析,并提供示例和解决方案。
错误 #1:在没有正确工具的情况下使用 --watch 标志
许多人在终端中输入:
ts-node --watch app.ts然后惊讶地发现什么也没发生。原因是 ts-node 的标准版本中没有 --watch 标志。这个命令要么被忽略,要么会报错。
解决方案: 将 nodemon 与 ts-node 结合使用。以下是正确的命令:
npx nodemon --exec ts-node app.ts或者,如果您想将其保存在 package.json 中:
{ "scripts": { "dev": "nodemon --exec ts-node src/index.ts" }}这将使 nodemon 监控文件更改,并在每次保存时重新启动 ts-node。
错误 #2:nodemon 无法检测到 .ts 文件的更改
您配置了 nodemon,保存了文件,但它没有反应。为什么?默认情况下,nodemon 只监控 .js、.json 和一些其他扩展名。列表中不包含 .ts。
解决方案: 显式指定扩展名:
nodemon --watch src --ext ts --exec ts-node src/index.ts--watch src 标志将监控范围限制在 src 文件夹(以避免监控 node_modules)。而 --ext ts 将 TypeScript 文件添加到受监控的扩展名列表中。
您也可以创建一个 nodemon.json:
{ "watch": ["src"], "ext": "ts", "exec": "ts-node src/index.ts"}错误 #3:与 tsconfig.json 冲突——错误的模块解析
典型情况:您将 ts-node 与 nodemon 一起使用,但在启动时遇到类似 Cannot find module 或 Unknown file extension ".ts" 的错误。问题通常出在 tsconfig.json 的配置上。
有问题的 tsconfig.json 示例:
{ "compilerOptions": { "module": "ESNext", "moduleResolution": "bundler", "target": "ES2020" }}问题:ts-node 在 Node.js 环境中运行,而 module: "ESNext" 配合 moduleResolution: "bundler" 是为像 Webpack 这样的打包工具设计的。