如何使用 nodejs 和 typescript 自动重启节点应用程序?

Posted

技术标签:

【中文标题】如何使用 nodejs 和 typescript 自动重启节点应用程序?【英文标题】:How to automatic restart node application with nodejs and typescript? 【发布时间】:2021-08-28 14:54:07 【问题描述】:

我正在使用 nodejs、express、typescript 和 babel 建立一个新项目。所以我使用 babel 来更快地转译 typescript 代码,使用etsc 来检查类型

当我编写代码时,我希望应用程序自动应用更改,而无需我手动重新启动应用程序。我的解决方案是运行babel cli 以使用nodemon 转译代码。 我的脚本是这样的

  "scripts": 
    "ts-check": "tsc --noemit",
    "build-ts": "etsc",
    "build": "rm -rf dist && yarn run build-ts",
    "dev": "nodemon --exec babel src --out-dir dist --extensions \".ts\"  --source-maps inline",
    "start": "node ./dist/src/index.js"
  ,

但问题是即使我没有对代码进行任何更改,应用程序也会不断重启。那我该如何解决呢?

是否有更好的解决方案自动应用更改?

这是我得到的

【问题讨论】:

【参考方案1】:

第一个问题是nodemon 只运行babel 命令而不是你的./dist/src/index.js。第二个问题是正在运行的babel 将您的.ts 文件转换为.js,然后nodemon 通知.js 文件已更改并重新运行您的命令(babel),该命令再次将您的.ts 文件转换为@ 987654331@ 带有新时间戳的。我相信你已经明白了。 所以实际上你需要两个独立但依赖的东西:将你的 .ts 文件重新编译成 .js 文件,并且仅在 .js 文件更改时重新启动节点。 您可以通过以下方式实现:

    "scripts": 
        ...
        "dev": "babel src --watch --out-dir dist --extensions .ts --source-maps inline & nodemon"
        ...

所以你在watch 模式下同时启动babelnodemon。当.ts 文件发生变化时,babel 会将它们重新编译成.js,当.js 文件发生变化时,nodemon 将重新启动node

但是有一个小缺点。第一次运行时没有./dist/src/index.js 文件nodemon 会抛出错误。这并不重要,nodemon 将继续运行。在babel 完成代码转换后,nodemon 将接受更改并继续进行而不会出现问题。 虽然如果您不想在控制台中看到该错误,您可能会在 nodemon 启动之前包含延迟。足够长的时间让babel 完成它的第一次运行。

    "scripts": 
        ...
        "dev": "babel src --watch --out-dir dist --extensions .ts --source-maps inline & sleep 5 && nodemon"
        ...

【讨论】:

以上是关于如何使用 nodejs 和 typescript 自动重启节点应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NodeJS 13 和 Typescript 3.8 导入 esm 模块?

NodeJS/Typescript 导出/导入的正确解释?

如何将 Typescript、NodeJS 和 Express 应用程序部署到 Heroku

如何将 webassembly 包含在 typescript 中(没有 nodejs)

无法在 NodeJS 中使用 Mongoose 和 Typescript 扩展基类

Typescript + webpack(带热重载)+ NodeJS