86

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

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

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

4

10 回答 10

156

我认为您想要的是这样的(我当前的设置):

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

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

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

于 2016-10-17T18:26:06.143 回答
92

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

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

"scripts": {
  "start": "tsc-watch --onSuccess \"node .\""
}
于 2017-11-15T10:43:15.457 回答
29

尝试将此添加到您的 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",
}
于 2016-08-01T09:57:09.153 回答
16

这是怎么回事

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

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

现在从 Nodemon 的角度来看,它(至少)检测到两个变化——一个 for.ts和一个 for .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 生成多个文件时导致问题。

于 2019-06-13T00:50:40.057 回答
9

我在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单元测试等更多配置...您可以查看本文

于 2018-10-07T22:00:47.837 回答
7

速度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添加颜色。yellow.boldconcurrently -c

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

于 2019-05-19T23:53:42.787 回答
1

这是另一种方式,在开始之前sleep在您的concurrently命令中使用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 在我执行时实际启动 3 次npm run dev。但是如果我在启动nodemon进程之前休眠了5秒,那么两个tsc进程都已经完成了,然后继续看。

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

警告,如果你的服务器很慢,你可能需要增加超过 5 的睡眠延迟。

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

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

于 2020-06-12T06:28:20.623 回答
0

TL;博士; 注意输出nodemon变化(即文件)tsc.js

您希望nodemon设置监视何时tsc --watch完成,正如一些人在其他评论中所暗示的那样,因此只需要求它监视目标目录中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

于 2021-12-08T22:15:06.470 回答
0

您可以.ts使用ts-node. 只需全局安装即可自动nodemon使用ts-node

于 2022-01-19T18:53:23.137 回答
-4

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

第 1 步: tsc main.ts

第 2 步: 节点 main.js

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

tsc 主要 --watch

于 2019-01-07T13:53:53.823 回答