# 1. 编写 TS 代码
# index.ts
const a: number = 10
console.log(a + 5)
# 2. 手动编译
tsc index.ts
# 3. 执行编译后的 JS 文件
node index.js痛点:
# 1. 初始化配置
tsc --init
# 2. 配置 tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "ES2020"
}
}
# 3. 执行 TS 文件
ts-node index.ts痛点:
# 直接执行,无需配置
tsx index.ts
# 输出:15优势:
排名 运行时 下载量趋势 主要应用场景
1⃣ ts-node ████████████████ TypeScript 官方生态
2⃣ esbuild ████████████ Vite 依赖预构建引擎
3⃣ JITI ████████ Nuxt 3/Unbuild
4⃣ SWC ██████ Next.js/Turbopack
5⃣ TSX ███ 新兴零配置工具| 工具 | Star 数量 | 发布时间 | 语言 | 状态 |
|---|---|---|---|---|
| ts-node | 12k+ | 2015年 | TypeScript | 稳定 |
| esbuild | 37k+ | 2020年 | Go | 活跃 |
| JITI | 1k+ | 2021年 | TypeScript | 活跃 |
| SWC | 30k+ | 2019年 | Rust | 活跃 |
| TSX | 4k+ | 2021年 | TypeScript | 活跃 |
基本信息:
核心特性:
// 直接执行 TypeScript 代码
ts-node script.ts
// REPL 交互模式
ts-node
> const a: number = 10
> console.log(a + 5)
15优势:
劣势:
适用场景:
基本信息:
技术架构:
Go 语言编写
↓
极快的编译速度(比 tsc 快 10-100 倍)
↓
Vite 的依赖预构建与转译引擎核心优势:
局限性:
适用场景:
基本信息:
关键应用场景:
Nuxt 3 SSR 框架
↓
服务端 TypeScript 编译
↓
使用 JITI 运行时为什么 Nuxt 3 选择 JITI?
// Nuxt 3 架构
├─ 开发模式:Vite(esbuild)
├─ 服务端渲染:JITI
└─ 模块处理:JITI + esbuild优势:
应用工具:
基本信息:
技术优势:
Rust 语言编写
↓
单线程性能极强
↓
Next.js / Turbopack 底层引擎应用场景:
性能对比:
编译速度:SWC > esbuild > ts-node
功能完整度:ts-node > esbuild > SWC局限性:
注意: 这里的 TSX 指 TypeScript eXecute,不是 JSX 语法!
基本信息:
核心特性:
# 零配置执行
tsx index.ts
# Watch 模式
tsx watch index.ts
# REPL 模式
tsx为什么一直不温不火?
开发体验优势:
| 特性 | ts-node | esbuild | JITI | SWC | TSX |
|---|---|---|---|---|---|
| CommonJS Scope | ✅ | — | — | ⚠️ 部分 | ✅ |
| ESM 转换 | ✅ | ✅ | ✅ | ⚠️ 有限 | ✅ |
| Resolution(解析能力排名) | 2 | 4 | 3 | 5 | 1 |
| Import 支持 | ⚠️ 有限 | ⚠️ 有限 | ⚠️ 有限 | ⚠️ 有限 | ✅ 完整 |
| Interoperability(CJS 中 require ESM) | ❌ | ✅ | ✅ | ❌ | ✅ |
| 缓存机制 | ✅(可启用) | ✅ | ❌ | ✅ | ✅ |
| Watch 模式 | — | — | — | — | ✅ |
| REPL 模式 | ✅ | — | — | — | ✅ |
注:表中"—"为原笔记未注明的项,不表示不支持,选型时以各工具官方文档为准。Import 支持一行中 ts-node/SWC 不能在 CJS 环境中 require ESM 文件,详见下文 Interoperability 说明。
定义: 在模块作用域中可使用的内置变量
// CommonJS 模块作用域变量
module.exports // 导出对象
exports // 导出对象别名
require // 引入函数
__filename // 当前文件绝对路径
__dirname // 当前文件所在目录支持对比:
TSX、ts-node:完整支持
SWC:部分支持 (某些语法不支持)定义: 判断 require/import 能否解析给定的规范
测试场景:
// 场景 1:在 TS 文件中导入 JS 文件
import { foo } from './bar.js'
// 场景 2:在 .cjs 文件中导入 TS 文件
const ts = require('./typescript.ts')
// 场景 3:导入 .cts/.mts 文件(TS 新后缀)
import { util } from './utils.mts'支持度排名:
TSX > ts-node > JITI > esbuild > SWC定义: 能否交互性地加载不同格式的文件
测试代码:
// 可以 require 哪些文件?
require('./file.js') // JS 文件
require('./file.ts') // TS 文件
require('./file.cjs') // CJS 文件
require('./file.mjs') // ESM 文件(关键!)支持对比:
| 运行时 | .js | .ts | .cjs | .mjs |
|---|---|---|---|---|
| TSX | ||||
| esbuild | ||||
| JITI | ||||
| ts-node | ||||
| SWC |
关键发现:
TSX、esbuild、JITI 可以在 CommonJS 环境中
requireESM 文件,这在跨模块系统开发时非常重要!
新后缀说明:
.ts → 普通 TypeScript 文件
.cts → CommonJS 规范的 TypeScript 文件
.mts → ES Module 规范的 TypeScript 文件使用示例:
// utils.mts
export function add(a: number, b: number): number {
return a + b
}
// main.ts
import { add } from './utils.mts' // TSX 完美支持| 运行时 | 编译器 | 语言 | 速度 | 缓存 |
|---|---|---|---|---|
| ts-node | tsc | TypeScript | 慢 | ✅(可启用) |
| esbuild | esbuild | Go | 极快 | ✅ |
| JITI | Babel | TypeScript | 快 | ❌ |
| SWC | SWC | Rust | 极快 | ✅ |
| TSX | esbuild | TypeScript | 快 | ✅ |
启动速度:SWC ≈ esbuild > TSX > JITI > ts-node
执行速度:SWC ≈ esbuild > TSX > JITI > ts-node
缓存效率:TSX > SWC ≈ esbuild > ts-node > JITI测试场景: 编译一个包含 1000 个模块的项目
注:以下为笔记记录的量级参考,非严格基准测试,绝对数值因机器与环境而异,重点看数量级差异。
| 运行时 | 首次编译 | 增量编译 | 内存占用 |
|---|---|---|---|
| ts-node | 15s | 5s | 500MB |
| esbuild | 0.3s | 0.1s | 100MB |
| TSX | 0.5s | 0.2s | 150MB |
| SWC | 0.2s | 0.05s | 80MB |
| 特性 | ts-node | esbuild | JITI | SWC | TSX |
|---|---|---|---|---|---|
| 零配置 | ❌ | — | ✅ | — | ✅ |
| Watch 模式 | — | — | — | — | ✅ |
| REPL 模式 | ✅ | — | — | — | ✅ |
| 类型检查 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 实验特性警告 | — | — | — | — | ✅ |
| Source Map | — | — | — | — | — |
ts-node(需要配置):
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "ES2020",
"strict": true
},
"ts-node": {
"compilerOptions": {
"module": "commonjs"
}
}
}TSX(零配置):
# 直接执行,无需任何配置文件
tsx script.ts你的需求是什么?
│
├─ 需要完整类型检查
│ └─ 使用 ts-node
│
├─ 追求极致性能
│ ├─ Rust 技术栈 → SWC
│ └─ Go 技术栈 → esbuild
│
├─ 零配置快速开发
│ └─ 使用 TSX
│
├─ Nuxt 3 项目
│ └─ 使用 JITI(已内置)
│
├─ 需要完整功能支持
│ ├─ ESM + CJS 混合 → TSX
│ └─ 传统 CommonJS → ts-node
│
└─ 实验性项目尝鲜
└─ SWC 或 TSX推荐:TSX 或 ts-node
理由:
- TSX:零配置,开发快
- ts-node:类型检查完整,生产稳定推荐:TSX
理由:
- 零配置,快速测试
- 支持各种模块格式
- 开发体验好推荐:SWC(已内置)
理由:
- Next.js 12+ 默认使用 SWC
- 无需额外配置
- 性能最优推荐:JITI(已内置)
理由:
- Nuxt 3 默认使用 JITI
- SSR 场景优化
- 与 Vite 配合良好需求: 快速开发一个 TypeScript CLI 工具
解决方案:
# 1. 安装 TSX
npm install -D tsx
# 2. 编写 CLI 代码
# src/cli.ts
#!/usr/bin/env node
import { program } from 'commander'
program
.version('1.0.0')
.command('build')
.action(() => {
console.log('Building...')
})
program.parse()
# 3. 在 package.json 中配置
{
"bin": {
"my-cli": "dist/cli.js"
},
"scripts": {
"dev": "tsx src/cli.ts",
"build": "tsup src/cli.ts"
}
}
# 4. 开发时直接运行
npm run dev build优势:
需求: 使用 TypeScript 开发 Express 后端
解决方案:
# 方案 1:ts-node(传统)
npm install -D ts-node @types/node @types/express
npx ts-node src/server.ts
# 方案 2:TSX(推荐)
npm install -D tsx
npx tsx src/server.ts
# 方案 3:TSX + Watch 模式
npx tsx watch src/server.ts问题: 在 CommonJS 项目中导入 ESM 模块
// 问题代码
const { default: config } = require('./config.mjs')
// ❌ ts-node 报错:Cannot require ES Module
// 解决方案:使用 TSX
tsx script.ts // ✅ 可以正常运行| 问题 | 原因 | 解决方案 |
|---|---|---|
| ts-node 执行慢 | 基于 tsc,性能较低 | 1. 启用缓存<br>2. 换用 TSX/esbuild |
| 无法 require ESM 文件 | ts-node 不支持 | 使用 TSX 或 JITI |
| SWC 不支持某些语法 | 功能仍在完善中 | 使用 TSX 或等待更新 |
| 需要零配置工具 | 不想写配置文件 | 使用 TSX |
| 需要完整类型检查 | 快速运行时不做检查 | 使用 ts-node + tsc --noEmit |
| Nuxt 3 如何调试 TS? | 内置 JITI | 直接使用,无需配置 |
TypeScript 运行时是 TS 与运行环境的桥梁
负责将 TS 代码转换为目标环境可执行的代码
TSX 是功能最全面的零配置执行器
支持 CommonJS Scope、Resolution、Import、Interoperability
性能排序:SWC ≈ esbuild > TSX > JITI > ts-node
Rust/Go 编写的运行时性能远超 TypeScript 实现
缓存机制显著提升性能
TSX、SWC、esbuild 都支持缓存,JITI 不支持
选择建议:零配置选 TSX,类型检查选 ts-node
根据项目需求平衡开发体验和功能完整性
为什么 Vite 选择 esbuild 而不是 SWC 作为底层引擎?
TSX 推出较晚(2021 年),为什么能快速受到关注?
如果要在 CommonJS 项目中导入 ESM 模块,应该选择哪个运行时?为什么?
JITI 为什么被 Nuxt 3 选中?它有哪些独特优势?
开发 npm 库时,应该选择哪个运行时进行测试?
重要区分:
运行时(Runtime):
TSX、ts-node、JITI、SWC、esbuild-runner
↓
用于开发阶段快速执行 TS 代码
构建工具(Build Tool):
Rollup、Webpack、Vite、Turbopack
↓
用于生产环境打包编译示例:
# 开发阶段:使用运行时
tsx src/index.ts
# 生产阶段:使用构建工具
vite build笔记整理时间: 2026-03-08
技术栈版本: ts-node 10 / esbuild 0.19 / SWC 1.3 / TSX 4.7
下一步学习: Vite 实战配置与优化技巧
审校补注(2026-09):文中数据为 2023 年快照。截至审校时点,Node.js 自 v23.6 起(并回移至 v22.18+)默认支持以 type stripping 直接运行 TypeScript(仅限可擦除语法,枚举等需
--experimental-transform-types);ts-node 已进入低维护状态,社区更常推荐 tsx。