【问题标题】:Is there a way to use npm scripts to run tsc -watch && nodemon --watch?有没有办法使用 npm 脚本运行 tsc -watch && nodemon --watch?
【发布时间】:2016-11-11 15:00:04
【问题描述】:

我正在寻找一种使用 npm 脚本同时运行 tsc --watch && nodemon --watch 的方法。我可以独立运行这些命令,但是当我想同时运行它们时,只执行第一个。 例如:

"scripts": {    
    "runDeb": "set NODE_ENV=development&& tsc --watch && nodemon --watch"
  }

tsc --watch 被执行但nodemon 从未被调用,反之亦然。

【问题讨论】:

标签: typescript npm nodemon tsc ts-node


【解决方案1】:

尝试将其添加到您的 package.json 中:

"scripts": {
  "start": "concurrently --kill-others \"tsc -w\" \"nodemon dist/app.js\"",
}

并将这个 npm 包(同时,nodemon,typescript)添加到你的 package.json:

"devDependencies": {
  "concurrently": "^2.2.0",
  "typescript": "^1.8.10",
  "nodemon": "^1.9.2",
}

【讨论】:

  • 唯一的问题是 nodemon 在 typescript 完成其工作之前就开始了,一种 hack 解决方案可能会像 nodemon --delay x 这样对 nodemon 设置延迟,它会给 tsc 一些时间。
  • @NicolasDominguez,请参阅我的回复以确保在执行应用程序之前完成 tsc 的更改。
  • @AlterX 是的,但tsc --watch 不是更有效率吗?
  • @AlterX 我的解决方案是使用tsc-watch:tsc-watch --onSuccess \"node ./bin\"。你怎么看?
  • tsc-watch 效果很好;在我的 package.json dev 脚本中:"tsc-watch --onSuccess \"nodemon\""
【解决方案2】:

我认为你想要的是这样的(我目前的设置):

"scripts": {
    "compile": "tsc && node app.js",
    "dev": "./node_modules/nodemon/bin/nodemon.js -e ts  --exec \"npm run compile\""
}

我创建了两个脚本“编译”和“开发”。要开始开发,您只需运行 npm run dev 即可启动 nodemon 并使其监视 .ts 文件(使用 -e 标志)。然后,每次 .ts 文件更改时,nodemon 都会exec 编译任务,它基本上编译并运行节点应用程序。

虽然并发使用是一个不错的选择,但我的设置保证 tsc 的工作在尝试执行生成的 .js 文件之前完成。

【讨论】:

  • 确保在您的tsconfig.json 文件中设置"watch": false。否则node app.js 将永远不会运行。
  • 是的,但 tsc 不会观看文件,除非您使用 -w/--watch 或正如您在 tsconfig.json 中提到的 "watch": true 告诉它这样做,所以它应该使用这种技术就好了
  • tsc -w 对已解析的文件使用增量编译和缓存,因此编译速度必须更快,这就是为什么我更喜欢同时运行 tsc -w 和 nodemon
  • 如果您同时使用,它会同时运行两个任务,如另一个响应中所述,问题在于 nodemon 在 tsc 完成编译之前启动,因此它不提供最新的更改。请参阅 Nicolas Dominguez 的评论。
  • 绝招!谢谢@AlterX。对于所有读者,如果您的 TypeScript 文件位于子文件夹中(例如“src”),那么您需要运行以下命令:nodemon --watch src/ --exec \"npm run compile\" --verbose -e ts
【解决方案3】:

我使用 AlterX 的解决方案已经有一段时间了,它运行良好,但我发现它相当慢。相反,我现在使用tsc-watch。它使 tsc 使用类似于-w 标志的增量编译,使应用程序的重启速度更快。

就像在你的 package.json 中加入类似的东西一样简单:

"scripts": {
  "start": "tsc-watch --onSuccess \"node .\""
}

【讨论】:

  • 这是一个很好的解决方案!我能够像这样在回调中链接多个命令:--onSuccess "sh -c 'babel && uglifyjs'"
  • 安装 tsc-watch 后,运行脚本时出现此错误:“sh: tsc-watch: command not found”。
  • 你确定你已经在你的项目中安装了 tsc-watch 吗?您可以尝试使用./node_modules/.bin/tsc-watch 而不是tsc-watch
  • 比公认的答案更好(如果速度很重要)
  • 最佳答案,P.S.您不需要在 npm 脚本中指定模块路径,这可以正常工作 - "tsc-watch --onSuccess \"node dist/index.js\""
【解决方案4】:

我在 2018 年 10 月使用 nodemon 的最新版本的解决方案。

第一:
安装nodemon(npm install nodemon --save-dev) 和ts-node(npm install ts-node --save-dev)

第二:
创建一个 nodemon.json 。我喜欢将我的 nodemon 配置保存在单独的 nodemon.json 中,以使 npm 脚本更易于阅读。所以在项目根目录下创建nodemon.json,内容如下:

{
    "ignore": ["**/*.test.ts", "**/*.spec.ts", ".git", "node_modules"],
    "watch": ["src"], // your .ts src folder
    "exec": "npm start", // your npm script created in package.json
    "ext": "ts"
}

然后创建您的 npm start 脚本,例如:

"scripts": {
    ...
    "start": "ts-node src/server.ts",
    "dev:ts": "nodemon",
    ...
  }

然后运行npm run dev:tsyarn dev:ts 应该运行并观察您的打字稿服务器代码。

如需更多配置,如Jest 单元测试等...您可以查看this 文章

【讨论】:

  • 如果nodemon.jsonpackage.json不在同一个目录怎么办?
  • 同时使用 nodemon 和 ts-node 也有一些严重的问题。见github.com/remy/nodemon/issues/1025
  • 是的,你是对的。但最多的问题是 Unix 和 OSX 相关的操作系统。在 windows 下使用 vscode 和 powershell/git bash 我从来没有遇到过这个问题。我会在其他系统上检查这个。
  • 第一个问题。您还可以使用nodemonConfig 键在package.json 中使用nodemon 配置。这是alligator.io/workflow/nodemon 的工作流程
【解决方案5】:

正常编译是: 如果文件名为 main.ts

第 1 步: tsc main.ts

第 2 步: node main.js

简单的一次性(循环)编译:

tsc main --watch

【讨论】:

  • 这并不能真正回答问题,因为 OP 专门询问 nodemon
【解决方案6】:

TypeScript-Node-Starter 很快

https://github.com/microsoft/TypeScript-Node-Starter/blob/master/package.json

"dev": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch-ts\" \"nodemon ./dist/app.js\"",
"watch-ts": "tsc -w"

在这里,我们为npm run watch-ts 提供TypeScript 名称(使用concurrently -n)并使用concurrently -c 添加颜色yellow.bold

所以,我可以很容易地识别每个进程的消息。

【讨论】:

    【解决方案7】:

    发生了什么

    问题是所有文件都有两个观察者。一个是tsc -w,一个是nodemon

    当对 .ts 文件进行更改时,tsc 会检测到并对其进行编译,并在您的目标文件夹中创建 .js 版本。

    现在从 Nodemon 的角度来看,它检测到(至少)两项更改——一项针对.ts,一项针对.js。在第一次更改时,它会自行重新启动,但在第二次更改时,它不知道另一个“开始”已经在进行,因此它尝试再次重新启动并且失败。对我来说,这是一个 nodemon 错误——见https://github.com/remy/nodemon/issues/763

    解决方案

    1) 使用tsc-watch --onSuccess

    tsc-watch--onSuccess,你可以把node 放在那里。这样,您将只有 一个观察者。

    2) 延迟nodemon

    您可以轻松延迟 nodemon 重新启动(请参阅 --delay)。它需要最少的设置更改。

    3) 让 nodemon 只监控 TSC 的目标文件夹

    我无法设置它,但这样nodemon 将有望只检测到一个变化。这可能会在将来或 tsc 生成多个文件时导致问题。

    【讨论】:

    • 谢谢,使用 tsc-watch 并且运行良好,刚刚将 "start": "node_modules/.bin/tsc-watch --onSuccess 'node ./src/app.js'" 添加到 package.json,现在可以正常使用 npm start :)
    • tsc-watch 非常适合我的用例。
    【解决方案8】:

    这是另一种方式,在您的concurrently 命令中使用sleep,然后再启动nodemon

    例如,

    "scripts": {
        "dev": "concurrently -k \"tsc -p ./src/server -w\" \"tsc -p ./src/client -w\" \"sleep 5 && nodemon ./dist/server/server.js\"",
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "node ./dist/server/server.js"
      },
    

    在我的情况下,我同时生成客户端和服务器打字稿项目,这导致 nodemon 在我执行npm run dev 时实际上启动了 3 次。但是如果我在启动nodemon进程之前休眠5秒,那么两个tsc进程都已经完成了,然后继续看。

    你也可以使用nodemon的延迟选项,但我只需要在我第一次执行npm run dev时延迟它。之后,每个项目中的每个文件的每个单独重新编译都只会正确重新启动 nodemon 一次。

    警告,如果您的服务器速度较慢,您可能需要将睡眠延迟时间增加到 5 以上。

    此外,我确实尝试了接受的答案,但我的解决方案在 nodemon 和 tsc 监视进程继续运行时后续重新编译的速度更快。

    我的解决方案需要 1 秒,而接受的解决方案需要 5 秒。在监视模式下实际运行 tsc 时我无法得到公认的答案,所以这就是它变慢的原因,因为两个 TypeScript 项目都会在每次更改时都进行完全重新编译。

    【讨论】:

      【解决方案9】:

      TL;DR;nodemon 观察tsc输出(即.js 文件)的变化

      您希望将nodemon 设置为监视tsc --watch 何时完成,正如一些在其他cmets 中所暗示的那样,因此只需要求它监视tsc 的目标目录以查看.js 文件的更改。

      例如在package.json:

      "scripts": {
        ...
        "watch": "tsc --build src/tsconfig.json --watch",
        "watch-tests": "nodemon --watch dist -e js --exec \"yarn run tests\"",
        "tests": "some script to run my tests",
        ...
      }
      

      src/tsconfig.json:

      {
      ...
        "compilerOptions": {
          "outDir": "../dist",
          ...
        },
      ...
      }
      

      在哪里

      • --watch <folder> 将指向您在 tsconfig.json 文件中的 compilerOptions->outDir 中定义的相同位置,
      • -e js 只会监视 javascript 文件的变化,并且
      • --exec <some arbitrary thing to run> 让 nodemon 运行的不仅仅是 node.js 脚本。

      如果你想让 nodemon 运行的是节点脚本,可以进一步简化为 nodemon --watch dist -e js my-node-script.js

      注意:如果您发现nodemon 过早启动它的脚本,您可以使用--delay 增加油门延迟以检查更改

      【讨论】:

        【解决方案10】:

        您可以使用ts-node 直接运行.ts 文件。只需全局安装它,nodemon 将自动使用ts-node

        【讨论】:

          猜你喜欢
          • 2019-10-12
          • 2020-09-16
          • 1970-01-01
          • 2015-10-10
          • 2014-02-24
          • 2023-03-10
          • 1970-01-01
          • 2018-02-17
          • 2019-07-01
          相关资源
          最近更新 更多