Node.js v19移除相关解析选项后,如何运行转译后的TypeScript代码?
Node.js v19+ 运行转译后TypeScript代码的简易方案
当TypeScript转译为JavaScript后(比如routes.ts转成routes.js),代码里用import { router } from './routes'这种省略后缀的导入写法,在Node.js v19+里因为旧的解析选项被移除,直接运行会报错。官方提到的自定义加载器确实繁琐,下面是几个更简单的实用方案:
方案1:让TypeScript自动补全.js后缀
修改tsconfig.json配置,让转译后的JS文件自动带上正确的后缀,完全适配Node.js ES模块规则:
{ "compilerOptions": { "module": "NodeNext", "moduleResolution": "NodeNext", "target": "ES2020", "outDir": "./dist", "esModuleInterop": true, "strict": true, "skipLibCheck": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
核心是把module和moduleResolution设为NodeNext(或Node16),这样TS会自动把你写的import './routes'转译为JS里的import './routes.js',不用额外参数就能直接运行转译后的代码。
方案2:用tsx直接运行(跳过手动转译)
如果不想先转译再运行,可以用tsx工具直接执行TS代码,它会自动处理模块解析和转译,不用纠结后缀问题:
- 安装依赖:
npm install -D tsx - 直接运行:
npx tsx src/index.ts
或者在package.json里加启动脚本:
{ "scripts": { "start": "tsx src/index.ts" } }
这种方式适合开发阶段,省掉转译步骤,效率更高。
方案3:切换为CommonJS模块(如果项目允许)
如果项目不需要严格使用ES模块,可以改回CommonJS规范,Node.js对它的模块解析一直支持省略后缀:
修改tsconfig.json:
{ "compilerOptions": { "module": "CommonJS", "target": "ES2020", "outDir": "./dist" // 其他保持原有配置 } }
同时把package.json里的type字段删掉(或者设为commonjs),避免ES模块和CommonJS冲突,转译后的代码直接就能运行。
内容的提问来源于stack exchange,提问作者John Tang Boyland
相关产品推荐
相关产品推荐

