Typescript+Node配置循环:如何无妥协支持ES模块与import.meta
可直接落地的无妥协配置方案
完整支持ES Modules、import.meta等所有ES特性,无需修改TS文件后缀,兼容Node+Express开发场景。
第一步:配置package.json
- 先添加ESM标识:
{ "type": "module" }
- 安装必要开发依赖:
npm install typescript @types/node @types/express tsx -D
- 添加运行/编译脚本:
{ "scripts": { "dev": "tsx watch src/index.ts", "build": "tsc", "start": "node dist/index.js" } }
第二步:配置tsconfig.json
核心是module和moduleResolution字段使用NodeNext,匹配Node原生ESM规范,完整配置参考:
{ "compilerOptions": { "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", "esModuleInterop": true, "skipLibCheck": true, "strict": true, "outDir": "./dist", "rootDir": "./src", "resolveJsonModule": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
注意事项
- 本地文件导入需要补全
.js后缀:例如导入src/utils.ts时,代码中需要写import { xxx } from './utils.js',TS会自动匹配对应的.ts源文件,该规则是Node ESM的强制要求,不属于额外妥协项。 - 原CommonJS下的
__dirname/__filename变量在ESM中可通过import.meta实现:
import path from 'path'; const __filename = new URL(import.meta.url).pathname; const __dirname = path.dirname(__filename);
过往问题原因说明
- 添加
"type": "module"后报.ts后缀未知,是因为直接使用node或旧版ts-node运行TS文件导致,tsx基于esbuild实现,自动处理TS转译和ESM加载逻辑,可直接运行.ts文件。 import.meta在module: NodeNext配置下默认支持,不会触发编译报错,安装最新版@types/node即可获得完整类型提示。
内容的提问来源于stack exchange,提问作者Peter S.
相关产品推荐
相关产品推荐

