ts-node-dev 不应用自动重新加载的更改

Posted

技术标签:

【中文标题】ts-node-dev 不应用自动重新加载的更改【英文标题】:ts-node-dev doesn't apply changes in auto reload 【发布时间】:2020-09-17 10:12:10 【问题描述】:

我已经在 Typescript 中使用 FeathersJS 构建了一个应用程序,但是尽管 typescript 的 nodemon (ts-node-dev) 说当 typescript 文件更改时服务器已重新启动,但未应用更改。 我总是需要终止应用程序并重新启动才能看到更改。

这是日志:

[INFO] 15:43:51 Restarting: C:\api\src\models\favorites.model.ts has been modified
Using ts-node version 7.0.1, typescript version 3.9.3
info: Feathers application started on http://localhost:3030

这是 package.json 上的 dev 脚本:

ts-node-dev --no-notify src/

这里是 tsconfig.json:


  "compilerOptions": 
    "target": "es2018",
    "module": "commonjs",
    "outDir": "./lib",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true
  ,
  "exclude": [
    "test"
  ]

这是 package.json:


  "homepage": "",
  "private": true,
  "main": "src",
  "keywords": [
    "feathers"
  ],
  "contributors": [],
  "bugs": ,
  "directories": 
    "lib": "src",
    "test": "test/",
    "config": "config/"
  ,
  "engines": 
    "node": "^12.0.0",
    "npm": ">= 3.0.0"
  ,
  "scripts": 
    "test": "npm run compile && npm run mocha",
    "dev": "ts-node-dev --no-notify src/",
    "start": "npm run compile && node lib/",
    "mocha": "ts-mocha \"test/**/*.ts\" --recursive --exit",
    "compile": "shx rm -rf lib/ && tsc"
  ,
  "prettier":
    "singleQuote": true
  ,
  "standard": 
    "env": [
      "mocha"
    ],
    "ignore": []
  ,
  "types": "lib/",
  "dependencies": 
    "@feathersjs/authentication": "^4.5.3",
    "@feathersjs/authentication-local": "^4.5.4",
    "@feathersjs/authentication-oauth": "^4.5.4",
    "@feathersjs/configuration": "^4.5.3",
    "@feathersjs/errors": "^4.5.3",
    "@feathersjs/express": "^4.5.4",
    "@feathersjs/feathers": "^4.5.3",
    "@feathersjs/transport-commons": "^4.5.3",
    "compression": "^1.7.4",
    "cors": "^2.8.5",
    "feathers-mongoose": "^8.3.0",
    "helmet": "^3.22.0",
    "mongodb-core": "^3.2.7",
    "mongoose": "^5.9.16",
    "serve-favicon": "^2.5.0",
    "winston": "^3.2.1"
  ,
  "devDependencies": 
    "@types/compression": "^1.7.0",
    "@types/cors": "^2.8.6",
    "@types/helmet": "0.0.47",
    "@types/jsonwebtoken": "^8.5.0",
    "@types/mocha": "^7.0.2",
    "@types/mongoose": "^5.7.21",
    "@types/serve-favicon": "^2.5.0",
    "axios": "^0.19.2",
    "mocha": "^7.2.0",
    "nodemon": "^2.0.4",
    "shx": "^0.3.2",
    "ts-mocha": "^7.0.0",
    "ts-node-dev": "^1.0.0-pre.44",
    "tslint": "^6.1.2",
    "typescript": "^3.9.3"
  

【问题讨论】:

TypeScript 编译器正在观察变化? @ionut-t 我相信 分享你的 package.json 文件 @ionut-t 在编辑中添加,现在我认为它没有编译的代码但我知道如何修复 【参考方案1】:

在 npm 开发脚本中添加 --exit-child 似乎对我有用。

"dev": "ts-node-dev --no-notify --exit-child src/",

https://***.com/a/62447944/541281

【讨论】:

【参考方案2】:

您需要告诉编译器注意更改。添加以下脚本或使用监视标志调整您的 compile 脚本:

"watch-ts": "tsc -w"

"compile": "shx rm -rf lib/ && tsc -w"

我仔细查看了您的脚本,在我看来,您应该从已编译的文件(我猜它们位于 lib 文件夹中)启动您的服务器。如果是这样,您运行服务器的脚本应该是例如:

"dev": "ts-node-dev --no-notify lib/server.js"

而且你需要在两个单独的终端标签中运行:

npm run compile

npm run dev

【讨论】:

有没有办法像传统的nodemon一样只在一个终端上运行? @GuilhermeZamberlamPomini 不!您有两个单独的任务。 Node 本身不支持 TypeScript。我猜当您说traditional nodemon 时,您指的是使用javascript 工作。在这种情况下,您需要在运行服务器之前编译代码。我从来没有用过 ts-node-dev 包(不知道它是做什么的,如果它类似于 ts-node 或类似于 nodemon),但是你为什么不直接使用 nodemon 呢? 好吧,ts-node-dev 它是 Feathers 自带的,所以我试了一下,但我想毕竟我会回到 nodemon,谢谢你的帮助和知识!跨度> @GuilhermeZamberlamPomini 不客气!编码愉快!【参考方案3】:

ionut-t 的答案是一种可行的解决方法,但是这个问题是一个很好的问题并且没有回答它。该解决方案实质上绕过了ts-node-devts-node 方面,只是将其用于重新加载,这错过了ts-node-dev 的全部好处。恕我直言,ts-node-dev 有问题,或者是 feathersjs 如何对其进行开箱即用的配置,我猜它很快就会以一种或另一种方式得到解决(如果还没有的话)。

更新:

我是对的...在升级 ts-node-dev 之后,它现在可以在单个终端中完美运行。

升级: npm i --save-dev ts-node-dev

损坏的版本是 1.0.0-pre.44 我使用的固定版本是1.0.0-pre.50

【讨论】:

以上是关于ts-node-dev 不应用自动重新加载的更改的主要内容,如果未能解决你的问题,请参考以下文章

文件更改时如何自动重新加载Django?

使 elixir 应用程序在源代码更改时重新编译和重新加载

Flask SocketIO 自动重新加载不起作用(在代码更改/开发中)

在 playframework 中重新加载自定义文件更改的应用程序

为联合服务 apollo GraphQL 中的架构更改自动重新加载网关

springaop动态加载不同类