如何在TypeScript文件更改时观察和重新加载ts节点

Iel*_*rás 132 development-environment typescript nodemon gulp angular

我正在尝试使用TypeScript和Angular应用程序运行dev服务器,而不是每次都转换ts文件.我发现我可以运行,ts-node但我也想观看.ts文件并重新加载应用程序/服务器,就像我用gulp watch这样的东西.

Heb*_*rLZ 296

我一直在为我的开发环境做同样的事情,直到我注意到nodemon的api允许我们改变它的默认行为才能执行自定义命令.这方面的一个例子如下:

nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts
Run Code Online (Sandbox Code Playgroud)

或者甚至更好地外化nodemon的配置,因为Sandokan使用以下内容提取到nodemon.json文件,然后运行nodemon:

{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./index.ts" }
Run Code Online (Sandbox Code Playgroud)

通过这样做,您将能够实时重新加载ts节点进程,而无需担心底层实现.

干杯!

更新了最新版本的nodemon:

创建nodemon.json包含以下内容的文件.

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以创建一个nodemon.json文件,其中包含所有提到的选项,如:`{"watch":["src/**/*.ts"],"ignore":["src/**/*.spec.ts"],"exec":"ts-node ./app-server.ts"}`并输入`nodemon` (13认同)
  • 我错误地在文件夹名称之前添加了`./`并且它破了.这对我有用:`{"verbose":true,"watch":["server/**/*.ts"],"ext":"ts js json","ignore":["server/**/*.spec.ts"],"exec":"ts-node index.ts"}`.和命令行:`nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts` (3认同)
  • 我只想提一下,您还必须在配置文件中设置 `ext`,以便查找 ts 更改。我的配置文件如下所示:`{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "ext": " ts js json", "_exec": "node dist/startup.js", "exec": "ts-node src/startup.ts" }` (3认同)
  • 如果“index.ts”是一个快速实例,我如何杀死它并重新启动 (2认同)
  • 在 Windows 计算机上,请勿在 package.json 中使用单引号。将这些替换为 `\"` 可使脚本正常运行: `"nodemon --watch \"./src/**/*.ts\" -r dotenv/config --exec \"ts-node\" src/索引.ts"` (2认同)

bma*_*pin 93

其他答案的选项摘要

\n\n

请注意tsx它在底层使用 ESBuild)并且swc不进行类型检查;这应该是可以接受的,因为大多数编辑器都内置了类型检查,并且类型检查仍然应该是构建过程的一部分。您还可以在测试的同时单独进行类型检查,或者通过tsc --noEmit.

\n

(推荐)tsx

\n
\n

\xe2\x93\x98 TL;DR:以最少的配置最快

\n
\n

截至 2023 年 2 月 1 日,tsx似乎是速度和最小配置的最佳组合:

\n
    \n
  1. 安装 tsx

    \n
    npm install --save-dev tsx\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 更新你的 package.json,例如

    \n
    npm install --save-dev tsx\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 运行

    \n
    npm run dev\n
    Run Code Online (Sandbox Code Playgroud)\n

    (如果只想全局安装tsx并直接运行,请调整这些步骤)

    \n
  6. \n
\n

替代方案 1:nodemon/node-dev + ts-node + SWC

\n
\n

\xe2\x93\x98 TL;DR:与 tsx 一样快,但配置更多

\n
\n

将 nodemon/node-dev 的可靠性与 ts-node-dev 的速度相结合的另一种选择是将 ts-node 与 一起使用swc,这是一个用 Rust 实现的 TypeScript 兼容转译器,它比 TypeScript 快“数量级”转译器。

\n
    \n
  1. 安装nodemon或node-dev(无论您喜欢哪个)

    \n\n
  2. \n
  3. 通过 SWC 集成设置 ts-node

    \n

    https://github.com/TypeStrong/ts-node#swc-1

    \n
      \n
    1. 安装必要的包

      \n
      npm install --save-dev ts-node @swc/core @swc/helpers regenerator-runtime\n
      Run Code Online (Sandbox Code Playgroud)\n
    2. \n
    3. 将其添加到 tsconfig.json

      \n
      "scripts: {\n  "dev": "tsx watch src/index.ts",\n
      Run Code Online (Sandbox Code Playgroud)\n
    4. \n
    \n
  4. \n
  5. 运行nodemon或node-dev,例如

    \n
    nodemon --watch src src/index.ts\n
    Run Code Online (Sandbox Code Playgroud)\n

    或者:

    \n
    node-dev src/index.ts\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n

替代方案 2:nodemon/node-dev + ts-node transpileOnly

\n
\n

\xe2\x93\x98 TL;DR:快速、可靠

\n
\n

这是一个比前一个选项慢的替代方案,因为它使用标准 TypeScript 转译器,但在我的测试中它仍然比 nodemon/node-dev + ts-node 更快。

\n

基本上它与之前的选项相同,但没有swc. 通过禁用类型检查,它比开箱即用的 ts-node 更快(请参阅上面关于为什么这是可以接受的注释)。

\n
    \n
  1. 如上安装nodemon/node-dev

    \n
  2. \n
  3. 安装 ts-node

    \n
    npm install --save-dev ts-node\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 修改 tsconfig.json 以启用transpileOnlyts-node

    \n
    npm run dev\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
  7. 如上调用nodemon/node-dev

    \n
  8. \n
\n

替代方案 3:nodemon + tsc --incremental

\n
\n

\xe2\x93\x98 TL;DR:快速、可靠、类型检查、更挑剔

\n
\n

这与之前的替代方案几乎相同的速度。与其他选项相比,它的唯一真正优势是它进行类型检查。

\n

就缺点而言,它可能有点挑剔;在我的测试中,我正在使用dotenv选取.env文件进行本地开发。但取决于你的tsctsconfig.json 中构建的配置方式,您可能需要执行一些操作才能使其正常工作。

\n

但有选择是件好事,所以这里是:

\n
    \n
  1. 如上安装nodemon

    \n

    (这可能也适用于node-dev,但我没有看到execnode-dev的选项)

    \n
  2. \n
  3. 配置 tsconfig.json 将 TypeScript 转换为 JavaScript

    \n

    特别是,noEmit不应设置为true

    \n
  4. \n
  5. 配置nodemon以运行TypeScript编译器,以便在TypeScript文件发生更改时进行增量转译,例如

    \n
    npm install --save-dev nodemon \n
    Run Code Online (Sandbox Code Playgroud)\n

    您甚至可以删除--incremental它以进一步简化它,但与 nodemon/node-dev + ts-node 相比,它最终会慢得多。

    \n
  6. \n
\n

  • 您仍然可以在不全局安装它的情况下运行它(例如`node_modules/.bin/nodemon`),但考虑到我几乎总是需要向nodemon提供标志,所以在package.json中添加运行nodemon的脚本要方便得多带有我需要的所有标志(如 *替代方案 3* 中的示例)。这也使得处理多个项目时更加方便;您可以只调用“npm run dev”,而不必记住每个项目需要如何配置。当然,如果您喜欢的话,我们非常欢迎您在全球范围内安装它。 (6认同)

Mik*_*zic 60

我倾倒nodemonts-node支持更好的替代方案,ts-node-dev https://github.com/whitecolor/ts-node-dev

赶紧跑 ts-node-dev src/index.ts

  • `ts-node-dev` 是一个好主意,但它有很多问题。对于现实世界的使用来说,它确实不够可靠。不幸的是,维护者似乎没有能力处理这些问题。回到“nodemon”我去...... (14认同)
  • 它速度更快,并且可以自动检测需要监视哪些文件,而无需进行配置。 (7认同)
  • 我使用了这个,但最终我意识到它在拾取更改的文件时存在重大问题。保存文件,进程重新启动,但不知何故旧文件仍在使用。超级烦人。接受答案不是问题。‍♂️ (7认同)
  • 为什么这样更好? (4认同)
  • 就我而言,这实际上比带有“ts-node”的“nodemon”快 10 倍。谢谢你! (3认同)
  • 所以我实际上只有 `"start": "ts-node-dev src"`。不需要 babel、nodemon 或任何附带的配置。一切都为您处理。 (3认同)
  • 这是ts-node的最佳(如果不是唯一的)选项,尤其是对于较大的项目。它不会从头开始重新编译所有文件,而是进行增量编译,例如`tsc --watch`。 (2认同)
  • 不幸的是,不再维护并停止为我工作。不得不恢复到“nodemon”。 (2认同)
  • 它非常快。我只是添加如下: "start": "ts-node-dev --respawn --transpileOnly src/index.ts" (2认同)

im.*_*tov 47

这是使用npm脚本替代HeberLZ的答案.

我的package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
Run Code Online (Sandbox Code Playgroud)
  • -e flag设置要查找的扩展名,
  • -w 设置观察目录,
  • -x 执行脚本.

--inspectwatch:serve脚本中实际上是一个node.js标志,它只是启用调试协议.

  • 还要确保为项目本地安装了打字稿.否则你可能得到的错误不是很清楚. (2认同)
  • 这种方法似乎会产生大量多余的输出。 (2认同)

DLi*_*ght 43

这对我有用:

nodemon src/index.ts
Run Code Online (Sandbox Code Playgroud)

显然感谢因为这个拉取请求:https : //github.com/remy/nodemon/pull/1552

  • 这确实需要安装“ts-node”。在没有“ts-node”的情况下运行此命令将导致“无法启动进程,找不到“ts-node”exec”错误。您可能将其作为“node_modules”中的剩余工件。话虽这么说,这个解决方案要好得多,因为它不需要额外的配置。 (3认同)
  • 这对我也有效,但是如何呢?看起来有点神奇。什么正在编译打字稿?我没有安装“ts-node”。 (2认同)
  • @d512你确定它不在你的`node_modules/`中吗?对我来说,如果我没有它,它就会失败。 (2认同)

jsi*_*ina 16

你可以使用ts-node-dev

当任何必需的文件发生更改(作为标准 node-dev)时,它会重新启动目标节点进程,但在重新启动之间共享 Typescript 编译过程。

安装

yarn add ts-node-dev --dev
Run Code Online (Sandbox Code Playgroud)

你的 package.json 可能是这样的

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "tsc": "tsc",
  "dev": "ts-node-dev --respawn --transpileOnly ./src/index.ts",
  "prod": "tsc && node ./build/index.js"
}
Run Code Online (Sandbox Code Playgroud)


gil*_*ran 9

特别针对这个问题,我创建了这个tsc-watch库.你可以在npm找到它.

明显的用例是:

tsc-watch server.ts --outDir ./dist --onSuccess "node ./dist/server.js"


Tak*_*oft 8

添加"watch": "nodemon --exec ts-node -- ./src/index.ts"scripts您的部分package.json


way*_*tra 8

我做了

"start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec ts-node src/index.ts"
Run Code Online (Sandbox Code Playgroud)

和纱线开始.. ts-node 不像'ts-node'


Mig*_*res 6

另一种方法可能是首先在监视模式下编译代码tsc -w,然后在 javascript 上使用 nodemon。此方法的速度与 ts-node-dev 相似,并且具有更像生产的优点。

 "scripts": {
    "watch": "tsc -w",
    "dev": "nodemon dist/index.js"
  },
Run Code Online (Sandbox Code Playgroud)

  • 或者只是 `"dev": "( tsc -w & ) && nodemon dist/index.js"`。 (5认同)

RS *_*joy 6

第一步 - 在 deDependencies 中安装以下软件包

npm i -D @types/express @types/node nodemon ts-node tsc typescript
Run Code Online (Sandbox Code Playgroud)

或使用纱线

yarn add -D @types/express @types/node nodemon ts-node tsc typescript
Run Code Online (Sandbox Code Playgroud)

第二步 - 在 tsconfig.json 文件中使用此配置

{
  "compilerOptions": {
    "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */,
    "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
    "lib": [
      "DOM",
      "ES2017"
    ] /* Specify library files to be included in the compilation. */,
    "sourceMap": true /* Generates corresponding '.map' file. */,
    "outDir": "./dist" /* Redirect output structure to the directory. */,
    "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,

    "strict": true /* Enable all strict type-checking options. */,
    "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
    "skipLibCheck": true /* Skip type checking of declaration files. */,
    "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
  },
  "exclude": ["node_modules"],
  "include": ["./src"]
}
Run Code Online (Sandbox Code Playgroud)

第三步 - 在 package.json 文件中使用这些脚本

"scripts": {
    "start": "node ./dist/server.js",
    "dev": "nodemon -L ./src/server.ts && tsc -w"
},
Run Code Online (Sandbox Code Playgroud)


Fil*_*man 6

标准方法

从 Node.js 版本开始v16.19.0CLI API 引入了该 选项,消除了对Nodemon--watch等额外依赖项的需要 。

对于 TypeScript 执行,请使用成熟的包 ts-node。这是配置示例:

// package.json
{
    "scripts": {
        "dev": "node --watch --loader=ts-node/esm ./src/app.ts"
    },
    "devDependencies": {
        "ts-node": "~10.9.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

非标准方法

或者,您可以考虑tsx,尽管它不如 ts-node 那么成熟。

请记住,tsx 目前缺乏对emitDecoratorMetadata许多需要装饰器的项目的关键功能的支持。尽管存在这个缺点,tsx 提供了更快的编译(esbuild 后端):

// package.json
{
    "scripts": {
        "dev": "tsx watch ./src/app.ts"
    },
    "devDependencies": {
        "tsx": "~4.6.0"
    }
}
Run Code Online (Sandbox Code Playgroud)


pri*_*yGK 5

将此添加到您的 package.json 文件中

scripts {
"dev": "nodemon --watch '**/*.ts' --exec 'ts-node' index.ts"
}
Run Code Online (Sandbox Code Playgroud)

并且要完成这项工作,您还需要将 ts-node 安装为 dev-dependency

scripts {
"dev": "nodemon --watch '**/*.ts' --exec 'ts-node' index.ts"
}
Run Code Online (Sandbox Code Playgroud)

运行yarn dev以启动开发服务器


小智 5

我宁愿不使用 ts-node 并始终从 dist 文件夹运行。

为此,只需使用默认配置设置您的 package.json:

....
"main": "dist/server.js",
  "scripts": {
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "dev": "nodemon"
  },
....
Run Code Online (Sandbox Code Playgroud)

然后添加nodemon.json配置文件:

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "npm restart"
}
Run Code Online (Sandbox Code Playgroud)

在这里,我使用"exec": "npm restart"
这样所有的 ts 文件都将重新编译为 js 文件,然后重新启动服务器。

要在开发环境中运行,

npm run dev
Run Code Online (Sandbox Code Playgroud)

使用此设置,我将始终从分布式文件运行,不需要 ts-node。