Published on

使用 ts-node 直接运行 TypeScript 文件调试

Authors

应用场景

在日常开发中,我们经常需要编写和运行 TypeScript 脚本。本文将介绍两种主流的方案:使用 ts-node 和 tsx。

使用 ts-node

运行 TypeScript 脚本需要安装 ts-node,注意这个库需要局部安装:

yarn add -D ts-node typescript @types/node
# 或者
npm install -D ts-node typescript @types/node

配置步骤

  1. tsconfig.json 中添加以下配置:
{
  "compilerOptions": {
    "module": "ESNext",  // 或 "ES2015"
    "moduleResolution": "node", // 必须添加
    "esModuleInterop": true
  }
}
  1. package.json 中添加:
{
  "type": "module"
}
  1. 修改导入语句,确保包含文件扩展名:
// ❌ 错误
import data from './data'
// ✅ 正确
import data from './data.js'

运行命令

ts-node --esm ./script.ts
# 或者
node --loader ts-node/esm ./script.ts

使用 tsx(推荐)

tsx 是一个更现代的替代方案,基于 esbuild,提供更快的执行速度:

yarn add -D tsx
# 或者
npm install -D tsx

优势

  • 更快的启动速度
  • 无需额外配置
  • 支持 TypeScript 和 ESM
  • 内置 node-fetch 等常用模块

使用方式

tsx ./script.ts

常见问题及解决方案

  1. 无法使用 import 语句
SyntaxError: Cannot use import statement outside a module

解决:在 package.json 中添加 "type": "module"

  1. 找不到模块
Error [ERR_MODULE_NOT_FOUND]: Cannot find module

解决:添加文件扩展名(.js 或 .ts)

  1. TypeScript 文件扩展名报错
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"

解决:使用正确的命令格式:node --loader ts-node/esm 或直接使用 tsx

  1. fetch 未定义
ReferenceError: fetch is not defined

解决方案:

# 使用 ts-node 时需要安装
yarn add node-fetch
# 使用 tsx 时已内置,无需安装

性能对比

工具启动时间配置复杂度内存占用
ts-node1-2s需要配置较大
tsx0.1-0.5s零配置较小

写在最后

  1. 对于新项目,推荐使用 tsx,它提供了更好的开发体验和性能
  2. 遇到问题时,建议优先查看 GitHub Issues,通常能找到最准确的解决方案
  3. 请确保项目依赖安装在本地,避免使用全局安装导致的版本冲突问题