是否有任何选项可以使用 tsc 或 ts-node 或其他任何东西更快地编译和运行 ts 代码?

Posted

技术标签:

【中文标题】是否有任何选项可以使用 tsc 或 ts-node 或其他任何东西更快地编译和运行 ts 代码?【英文标题】:Is there any option to compile and run a ts code faster using tsc or ts-node or anything else? 【发布时间】:2020-02-20 23:55:44 【问题描述】:

目前我们有客户端服务器应用程序(用于竞争性编码目的),客户端点击编译并运行并将 ts 代码发送到服务器,其中 ts 代码存储在文件中并在服务器上使用测试用例在本地运行,输出通过测试返回给客户端案例通过/失败结果。 但是运行 ts 文件很慢,而且要花很多时间。

我在 transpileonly 模式下使用 ts-node 在服务器本地编译和运行文件。

例如。 npx ts-node -T tsFileName.ts

我们的要求是固定在ts代码的编译和运行时间上。

【问题讨论】:

您使用的是哪个版本的ts-node? 8.x 版本存在一些已知的编译性能问题。他们已经在这里讨论过:github.com/TypeStrong/ts-node/issues/754 我使用的是 8.4.1 版本的 ts-node 但我认为问题是由于 npx 它总是安装 ts-node 包。 如果你缓存了已安装的 npm 包,请尝试使用--no-install 标志运行npx,这样可以避免重复安装,可能会帮助你发现问题 【参考方案1】:

选项 A

    尝试在不同的文件中生成 TS 代码,例如:在单独的文件中动态拆分每个函数,或者要求用户“上传”不同的 ts 文件,每个文件的代码更少,也可以动态检查和限制每个函数或文件的行数 只需转换已更改的文件(这部分可以使用 watch 编译器选项轻松完成)

选项 B

试着玩一些compiler options

一些有趣的: 增量:true,noEmit:true,strict:false,skipLibCheck:true

【讨论】:

选项 A 怎么做?【参考方案2】:

我添加了这些环境变量,启动时间从几秒变为毫秒:

TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true ts-node ./script.ts

考虑通过[sudo] npm install -g typescript ts-node 安装ts-node,然后避免npx 为确保每次都安装ts-node 而采取的额外步骤。

【讨论】:

根据您的建议,我从 5 秒切换到 2 秒,非常感谢! 这应该是公认的答案。超级简单,而且很有魅力!您还可以将其保存为 package.json 中的 npm 脚本。对于在项目中运行小工具非常有用。 如果您使用 TS_NODE_TRANSPILE_ONLY,您如何/何时进行类型检查? 我有一个 start 运行脚本,它添加了环境变量以加快迭代时间。我有 VSCode 可以在我写作时实时进行类型检查。我有一个build 运行脚本,它没有添加这些环境变量,并且在推动之前我运行它以进行良好的测量。当然,它也在 CI 中运行。【参考方案3】:

一种使用 nodemon 快速编译的方法

    安装 Nodemon:npm i -g nodemon

    创建文件nodemon.json

    
     "watch": ["src"],
     "ext": ".ts,.js",
     "ignore": [],
     "exec": "ts-node ./src/server.ts"
    
    

    package.json中添加命令

    "start:dev": "nodemon",
    

【讨论】:

【参考方案4】:

您可以使用esbuild-runner,这似乎要快得多。

npm install -g esbuild-runner

npm install -g esbuild

然后运行代码 esr src/index.ts

【讨论】:

光年快谢谢:)【参考方案5】:

如果有人在 2021/22 年仍在寻找更好的方法来做到这一点,那么有一种更简单的方法可以实现这一目标。步骤如下:

将以下 docker-compose 文件添加到您的项目中:

version: '3'

services:
  #this will watch typescript files and keep building them
  #replace typescript version in command with the one you need
  tsc:
    image: 'node:14-alpine'
    volumes:
      - ./:/myapp
    working_dir: /myapp
    command: >
      sh -c "npm install typescript@^3.9.3 -g && tsc --watch"

  #this will watch build files and restart your app if any changes
  #replace folders according to your dir structure
  #replace app.js in command with appropriate filname like index.js
  nodemon:
    image: 'node:14-alpine'
    volumes:
      - ./:/myapp
      - ./.env:/myapp/build/.env 
    working_dir: /myapp/build
    network_mode: host
    command: >
      sh -c "npm install nodemon -g && nodemon app.js"

它的作用是,它将并行运行 typescript watcher 和 nodemon,并在几毫秒内持续构建您的代码。

将上述文件添加到项目后,只需运行

docker-compose up

【讨论】:

以上是关于是否有任何选项可以使用 tsc 或 ts-node 或其他任何东西更快地编译和运行 ts 代码?的主要内容,如果未能解决你的问题,请参考以下文章

在文件保存时自动编译 TypeScript 文件

使用 ts-node 时通过 fork() 调用子进程

为啥我使用 nodemon 和 ts-node 时节点检查器不启动?

ts-node 将选项传递给节点

ts-node 找不到我的类型定义文件

TSC如何设置打印标签的距离?急???