目前我们有客户端服务器应用程序(用于竞争编码目的),客户端点击编译并运行并将 ts 代码发送到服务器,其中 ts 代码存储在文件中并在服务器上使用测试用例在本地运行,输出通过测试用例返回给客户端/失败的结果。但是运行 ts 文件非常慢,这需要很长时间。
我在 transpileonly 模式下使用 ts-node 在服务器本地编译和运行文件。
例如。npx ts-node -T tsFileName.ts
我们的要求是固定在 ts 代码的编译和运行时。
目前我们有客户端服务器应用程序(用于竞争编码目的),客户端点击编译并运行并将 ts 代码发送到服务器,其中 ts 代码存储在文件中并在服务器上使用测试用例在本地运行,输出通过测试用例返回给客户端/失败的结果。但是运行 ts 文件非常慢,这需要很长时间。
我在 transpileonly 模式下使用 ts-node 在服务器本地编译和运行文件。
例如。npx ts-node -T tsFileName.ts
我们的要求是固定在 ts 代码的编译和运行时。
我添加了这些环境变量,启动时间从几秒变为毫秒:
TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true ts-node ./script.ts
考虑ts-node
通过安装[sudo] npm install -g typescript ts-node
,然后您就避免了npx
确保ts-node
每次都安装的额外步骤。
您可以使用esbuild-runner
它看起来要快得多。
npm install -g esbuild-runner
npm install -g esbuild
并运行代码
esr src/index.ts
如果有人在 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
官方 TS-Node 文档概述了一些性能建议,其中一些其他人已经发表了评论。
https://typestrong.org/ts-node/docs/performance/
但是,我很惊讶没有人提到 SWC 集成!从文档:
使用我们的
swc
集成。 这是迄今为止最快的选择
SWC,或 Speedy Web Compiler,是一个完全用 Rust 编写的 JavaScript/TypeScript 转译器。因此,它比您从 tsc 或 babel 等替代方案中获得的任何东西都要快得多。
根据 SWC 网站 ( https://swc.rs/ ):
SWC 在单线程上比 Babel 快 20 倍,在四核上快 70 倍。
将 SWC 核心库添加到您的项目中:
npm i -D @swc/core
并将以下内容添加到您的 tsconfig.json 中:
{
"ts-node": {
"swc": true
}
}
你很高兴去!享受极快的转译。
一种使用 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",
选项 A
选项 B
尝试使用一些编译器选项
一些有趣的:incremental:true, noEmit: true, strict:false, skipLibCheck:true