我正在寻找一种使用 npm 脚本同时运行tsc --watch && nodemon --watch
的方法。我可以独立运行这些命令,但是当我想同时运行它们时,只执行第一个。例如:
"scripts": {
"runDeb": "set NODE_ENV=development&& tsc --watch && nodemon --watch"
}
tsc --watch
被执行但从nodemon
未被调用,反之亦然。
我正在寻找一种使用 npm 脚本同时运行tsc --watch && nodemon --watch
的方法。我可以独立运行这些命令,但是当我想同时运行它们时,只执行第一个。例如:
"scripts": {
"runDeb": "set NODE_ENV=development&& tsc --watch && nodemon --watch"
}
tsc --watch
被执行但从nodemon
未被调用,反之亦然。
我认为您想要的是这样的(我当前的设置):
"scripts": {
"compile": "tsc && node app.js",
"dev": "./node_modules/nodemon/bin/nodemon.js -e ts --exec \"npm run compile\""
}
我创建了两个脚本“编译”和“开发”。要开始开发,您只需运行npm run dev
which 启动 nodemon 并使其监视 .ts 文件(使用-e
标志)。然后,每次 .ts 文件更改时,nodemon 都会exec
执行编译任务,该任务基本上编译并运行节点应用程序。
虽然并发使用是一个不错的选择,但我的设置保证tsc
在尝试执行生成的 .js 文件之前完成工作。
我已经使用 AlterX 的解决方案一段时间了,它运行良好,但我发现它相当慢。相反,我现在使用tsc-watch。它使 tsc 使用类似于-w
标志的增量编译,使应用程序的重启速度更快。
就像在你的 package.json 中加入类似的东西一样简单:
"scripts": {
"start": "tsc-watch --onSuccess \"node .\""
}
尝试将此添加到您的 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",
}
问题是所有文件都有两个观察者。一个是tsc -w
,一个是nodemon
。
.ts
对文件进行更改时,tsc
会检测到该文件并对其进行编译,然后.js
在目标文件夹中创建版本。
现在从 Nodemon 的角度来看,它(至少)检测到两个变化——一个 for.ts
和一个 for .js
。在第一次更改时,它会自行重新启动,但在第二次更改时,它不知道另一个“开始”已经在进行,因此它尝试再次重新启动并且失败。对我来说,这是一个 nodemon 错误——参见https://github.com/remy/nodemon/issues/763。
tsc-watch --onSuccess
tsc-watch有--onSuccess
你可以放在node
那里的。这样,您将只有一个观察者。
您可以轻松延迟 nodemon 重新启动(请参阅--delay)。它需要最少的设置更改。
我无法设置它,但这种方式nodemon
希望只能检测到一个变化。它可能会在将来或 tsc 生成多个文件时导致问题。
我在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:ts
或yarn dev:ts
应该运行并观察您的打字稿服务器代码。
有关Jest
单元测试等更多配置...您可以查看本文
速度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.bold
concurrently -c
所以,我可以很容易地识别每个进程的消息。
这是另一种方式,在开始之前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 项目都在每次更改时都进行了完全重新编译。
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
您可以.ts
使用ts-node
. 只需全局安装即可自动nodemon
使用ts-node
。
正常编译是:如果文件名是main.ts
第 1 步: tsc main.ts
第 2 步: 节点 main.js
简单的一次性(循环)编译:
tsc 主要 --watch